web-dev-qa-db-fra.com

Git checkout ne change rien

J'aime vraiment git. Au moins, j'aime l'idée de git. Pouvoir extraire mon projet principal en tant que branche distincte où je peux changer tout ce que je veux sans risquer de tout gâcher est génial. Mais ça ne marche pas.

Fondamentalement, mon flux de travail est le suivant:

  1. Commander une version stable dans une nouvelle branche pour expérimenter avec un nouveau code
  2. Apportez un tas de changements - je n'ai aucune intention de garder tout cela, je suis juste en train d'expérimenter.
  3. Regardez tout ce que j'ai changé
  4. Ajouter toutes les modifications à suivre
  5. Validez la branche et la branche Push sur Origin (si cela a fonctionné, sinon ignorez cette étape)
  6. Décidez d'essayer une autre méthode, revenez au maître
  7. Observez les artefacts de la branche expérimentale dans laquelle je travaillais, même si je suis dans la branche principale.

Chaque fois que je récupère une branche vers une autre branche, que j'apporte des modifications à une branche, puis que je récupère la branche d'origine, j'ai toujours tous les fichiers et les modifications qui se sont produits dans l'autre branche. Cela devient extrêmement frustrant. J'ai lu que cela peut se produire lorsque vous avez des fichiers ouverts dans le IDE en faisant cela, mais j'ai été assez prudent à ce sujet et les deux ont fermé les fichiers dans l'IDE, fermé l'IDE , et arrêtez mon Rails serveur avant de changer de branche, et cela se produit toujours. En outre, l'exécution de 'git clean -f' supprime tout ce qui s'est passé après une validation arbitraire (et au hasard, à cela) , ou, comme dans le dernier cas, n'a rien changé à son état d'origine.

Je pensais que j'utilisais correctement git, mais à ce stade, je suis à bout de souffle ici. J'essaie de travailler avec un tas de code expérimental en utilisant une version stable de mon projet, mais je continue de devoir rechercher et corriger manuellement toutes les modifications que j'ai apportées. Des idées ou des suggestions?

git checkout -b photo_tagging
git branch # to make sure it's right
# make a bunch of changes, creations, etc
git status # see what's changed since before
git add . # approve of the changes, I guess, since if I do git commit after this, it says no changes
git commit -m 'these are changes I made'

git checkout master
git branch #=> *master

# look at files, tags_controller is still there, added in photo_tagging
# and code added in photo_tagging branch are still there in *master

Cela semble se produire que je fasse un commit ou non sur la branche.

41
Josh Kovach

Voici un exemple d'utilisation de git et de branches.

$ git branch
* master
  organize

$ git branch networking
$ git checkout networking

$ git branch
  master
* networking
  organize

Maintenant, Master a été mis à jour plusieurs fois depuis que quiconque a fait quoi que ce soit sur la mise en réseau

$ git pull Origin networking
From github.com:dlundquist/Asteroids
 * branch            networking -> FETCH_HEAD
CONFLICT (rename/delete): Rename src/ServerClientThread.Java->src/ServerConnectionThread.Java in 92d5b7c4e7c4110803eabf5d5152e7f2a337d722 and deleted in HEAD
Auto-merging src/Actor.Java
Auto-merging src/Asteroids.Java
CONFLICT (content): Merge conflict in src/Asteroids.Java
Auto-merging src/BasicWeapon.Java
CONFLICT (content): Merge conflict in src/BasicWeapon.Java
CONFLICT (delete/modify): src/DedicatedServer.Java deleted in HEAD and modified in 92d5b7c4e7c4110803eabf5d5152e7f2a337d722. Version 92d5b7c4e7c4110803eabf5d5152e7f2a337d722 of src/DedicatedServer.Java left in tree.
Auto-merging src/MainMenu.Java
CONFLICT (content): Merge conflict in src/MainMenu.Java
CONFLICT (delete/modify): src/NetworkClientThread.Java deleted in HEAD and modified in 92d5b7c4e7c4110803eabf5d5152e7f2a337d722. Version 92d5b7c4e7c4110803eabf5d5152e7f2a337d722 of src/NetworkClientThread.Java left in tree.
CONFLICT (delete/modify): src/NetworkUpdate.Java deleted in HEAD and modified in 92d5b7c4e7c4110803eabf5d5152e7f2a337d722. Version 92d5b7c4e7c4110803eabf5d5152e7f2a337d722 of src/NetworkUpdate.Java left in tree.
Auto-merging src/ScenePanel.Java
CONFLICT (content): Merge conflict in src/ScenePanel.Java
Auto-merging src/Shield.Java
CONFLICT (content): Merge conflict in src/Shield.Java
Auto-merging src/Sprite.Java
Auto-merging src/TripleShotWeapon.Java
Auto-merging src/Weapon.Java
Automatic merge failed; fix conflicts and then commit the result.
mjolnir:Asteroids Durandal$ git status
# On branch networking
# Changes to be committed:
#
#   modified:   src/Actor.Java
#   modified:   src/Sprite.Java
#   modified:   src/TripleShotWeapon.Java
#   modified:   src/Weapon.Java
#
# Unmerged paths:
#   (use "git add/rm <file>..." as appropriate to mark resolution)
#
#   both modified:      src/Asteroids.Java
#   both modified:      src/BasicWeapon.Java
#   deleted by us:      src/DedicatedServer.Java
#   both modified:      src/MainMenu.Java
#   deleted by us:      src/NetworkClientThread.Java
#   deleted by us:      src/NetworkUpdate.Java
#   both modified:      src/ScenePanel.Java
#   added by them:      src/ServerConnectionThread.Java
#   both modified:      src/Shield.Java

Woah, git est vraiment fou. Il semble que Master soit trop en avance sur Networking pour que git fasse tout le travail pour moi.

$ git reset --hard networking
HEAD is now at 20d6ee8 done tweaking game on the main branch.  Fixed a few bugs with the TripleShotWeapon.  Rebalanced the gameMechanics() in Asteroids to increase the difficulty as the levels increase.
mjolnir:Asteroids Durandal$ git status
# On branch networking
nothing to commit (working directory clean)

Ok, maintenant je suis "de retour dans le temps" lors de la dernière mise en réseau vers Origin. Mais je devrais vraiment revenir en arrière et fusionner avec le Maître maintenant avant de travailler. Sinon, il sera même difficile de fusionner.

Temps passé à fusionner les fichiers

$ git add (insert conflict resolved files here)
$ git commit -a -m "Merged networking with master"
$ git checkout master
$ git branch
* master
  networking
  organize

Appliquons maintenant nos modifications.

$ git merge networking
Already up-to-date.

Vous voudrez peut-être faire cela si vous aimez le "Ouais!"

$ git merge Origin networking
Already up-to-date. Yeeah!

Poussez nos changements dans le monde

$ git Push Origin master
17
EnabrenTane

J'ai eu ce problème lorsque j'ai essayé de basculer la température vers une autre branche de la branche principale et que lorsque je modifiais quelque chose sur cette page temporaire et sans valider les modifications, je vérifiais à nouveau la branche principale, il a en fait fusionné toutes les modifications de la branche TEMP en MASTER.

RÉPONDRE:

Chaque fois que vous passez à une succursale TEMP, ENGAGEZ vos modifications. De cette façon, si vous les validez sur la branche TEMP et récupérez à nouveau MASTER, cela fonctionnera comme prévu.

19
shabany

J'aime expliquer git dans un langage courant. Réponse: c'est à cause de l'hypothèse que changer de branche (checkout) vous amènera à un autre "espace de travail". Git ne fait pas cela (même si cela semble plus naturel, et beaucoup ont ce malentendu).

Au lieu de cela, les branches sont comme des balises, pour ainsi dire. Vous pouvez donc danser autour des branches, faire du travail, modifier les choses, danser à nouveau, puis vous engager. Ensuite, le commit sera à la dernière branche où vous êtes allé! Le paiement ne modifie que le "tag"/branche que vous utiliserez, point.

MISE À JOUR après le commentaire de Martas

Cela s'applique lorsque votre branche et votre maître sont synchronisés (concernant les fichiers suivis) ou avec des fichiers non suivis. Si, en fait, ils sont dans des états différents, lorsque vous passez à la caisse, les fichiers et les dossiers disparaissent et réapparaissent. Si vos modifications sont suivies mais non validées, alors git abandonnera la vérification, et vous devrez soit les valider soit les cacher.

3
Z. Khullah