2010-09-15 17 views
57

Je suis en train d'apprendre à utiliser Git efficacement et je me demande comment je devrais (bonnes pratiques/mauvaises pratiques?) Résoudre le cas suivant:engage de maître sur une branche en utilisant git

Say I avoir la chaîne suivante de commits en maître:

  • commit initial
  • Commit 1
  • Commit 2
  • Commit 3

Ensuite, je me rends compte que ce qui est fait dans les deux derniers commits est complètement faux et je dois recommencer à partir de Commit 1. Questions:

  • Comment est-ce que je devrais faire cela? Puis-je déplacer les Commit 2 et 3 vers une branche séparée afin de les conserver pour référence future (disons qu'ils n'étaient pas si mauvais après tout) et continuer à travailler avec la Commit 1 sur le maître?

Répondre

70
git branch tmp   # mark the current commit with a tmp branch 
git reset --hard Commit1 # revert to Commit1 

La réponse SO "What's the difference between 'git reset' and 'git checkout' in git?" est très instructif pour ce genre d'opération

alt text

A git reset --hard HEAD~2 ferait la même chose (sans avoir besoin de retourner le SHA1 pour Commit1 d'abord).

Depuis Commit2 et Commit3 sont toujours référence par une ref Git (ici une branche), vous pouvez toujours revenir à eux quand vous le voulez (git checkout tmp).


En fait, Darien mentions dans les commentaires (en ce qui concerne le déplacement Commit2 et Commit3 à une autre branche):

Accidentellement commis à la mauvaise branche, cela me laisse le déplacer, a fait:

git checkout correctbranch 
git rebase tmp 
git branch -d tmp 

Cela fonctionne ici puisque la branche initiale a été réinitialisée à Commit1, ce qui signifie que le git rebase tmp relit chaque commit après Commit1 (donc ici Commit2 et Commit3) au nouveau 'correctbranch'.

+0

Merci! Juste une observation: En gitk, la branche tmp ne s'affiche pas. Ne devrait-il pas le faire, comme Commit1 est commun pour les deux branches? – Paul

+5

@Paul: avez-vous essayé un "' gitk --all' "? – VonC