2010-08-24 4 views
6

J'ai fusionné une branche principale du référentiel d'un ami dans mon répertoire de travail en utilisant branch_a:Git: Comment réinitialiser après une fusion?

git pull my_friend master 

J'ai découvert que la version fusionnée a des erreurs. Pour continuer le développement je voudrais revenir à mon dernier commit avant la fusion.
J'ai essayé:

git reset --hard HEAD 

Mais cela m'a ramené à l'état juste après la fusion. (Ne commande tirez commit ?!)
J'ai aussi essayé:

git revert HEAD 

mais a reçu l'erreur suivante:

fatal: Commit 2d72d8f367b987d8c16f5cb1a543a6886acdcf83 is a merge but no -m option was given.

Que dois-je faire?

+0

J'ai changé 'revert' en 'reset' dans votre titre, parce que reset est ce que vous essayiez d'accomplir. –

Répondre

23

HEAD fait référence à la validation en cours (généralement l'extrémité de la branche actuellement extraite). Vous avez déjà validé votre fusion, alors HEAD pointe sur le commit de fusion. Si vous voulez revenir à la validation avant, utilisez:

git reset --hard HEAD^ 

Le ^ signifie « premier parent de »; pour un commit normal c'est le seul parent, et pour un commit de fusion c'est le commit que vous avez extrait quand vous avez fusionné (c'est-à-dire l'astuce précédente de la branche dans laquelle vous avez fusionné).

Et bien sûr, si vous êtes vraiment perdu jamais, il suffit d'ouvrir gitk et soit copier/coller le SHA1 de vous engager à réinitialiser à (git reset --hard SHA1) ou tout simplement un clic droit dessus et réinitialisera dans gitk. Au fait, revert ne veut pas dire ce que vous pensez (ça sonne comme si vous l'utilisiez svn, peut-être, mais je n'ai jamais utilisé svn). git revert est utilisé pour créer un commit qui annule (annule) un commit précédent, en appliquant le diff inverse. Vous l'utilisez lorsque vous souhaitez annuler une seule validation précédente déjà publiée.

+0

Pour les personnes qui ne veulent pas effectuer de réinitialisation matérielle, comme le dit @Jefromi, utilisez 'git revert' pour" annuler "la dernière validation, en laissant un historique des deux événements. Pour plus d'informations sur 'git revert' jetez un coup d'oeil à voir: [cette réponse] (http://stackoverflow.com/a/5971281/1185053) –

2

Après l'extraction, HEAD a été déplacé vers la dernière validation, qui est le commit de fusion regroupant les deux branches, pas le commit sur lequel vous avez travaillé en dernier. C'est pourquoi reset HEAD ne changera rien.

revert HEAD n'est pas ce que vous voulez faire non plus, car cela tente de créer un nouveau commit en rétablissant les modifications de la validation de fusion. (Ceci est la raison pour laquelle vous voyez une erreur, vous ne pouvez pas revenir un commit de fusion sans dire git lequel des deux parents vous commits voulez revenir.)

Je pense que ce que vous voulez est:

git reset [--hard] HEAD^ 

qui sera réinitialisé à la validation avant la validation de fusion.

2

does pull command commit?

Oui, c'est le cas. Pull est une enveloppe sur fetch et merge.Si vous voulez voir les changements d'autres avant de fusionner, vous pouvez juste fetch

Questions connexes