Git: comment inverser la fusion d'un commit?

124

Avec SVN, il est facile d'inverser la fusion d'un commit, mais comment faire cela avec Git?

Mot
la source
Je ne pense pas que ce soit ce que signifie la question. Une fusion inversée dans SVN annule également les modifications de la validation en modifications locales, vous pouvez donc les modifier et valider à nouveau.
Dormouse du

Réponses:

105

Pour créer un nouveau commit qui `` annule '' les modifications d'un commit passé, utilisez:

$ git revert <commit>

Il est également possible de supprimer réellement un commit d'un point arbitraire dans le passé en rebasant puis en le réinitialisant, mais vous ne voulez vraiment pas le faire si vous avez déjà poussé vos commits vers un autre référentiel (ou si quelqu'un d'autre vous a retiré) .

Ben James
la source
31
Vous devrez probablement fournir l' -m <parent number>option à git revertpour spécifier la modification à annuler. Si vous souhaitez annuler une fusion d'historique non publié, utilisez git reset --hard HEAD^1.
Jakub Narębski
3
Jakub: c'est vrai si vous annulez un commit de fusion, mais dans la terminologie Subversion, "reverse-merge" est en fait simplement le nom pour annuler tout type de commit.
Ben James
4
Notez que l'utilisation -msignifie qu'une future fusion de la branche non fusionnée n'inclura pas les changements d'avant cette fusion! Voir schacon.github.com/git/howto/revert-a-faulty-merge.txt pour des moyens appropriés de fusionner à nouveau une branche non fusionnée.
Martijn Pieters
125

Pour revenir une fusion commit, vous devez utiliser: git revert -m <parent number>. Ainsi, par exemple, pour annuler le commit de fusion le plus récent en utilisant le parent avec le numéro 1, vous utiliseriez:

git revert -m 1 HEAD

Pour annuler une validation de fusion avant la dernière validation, vous devez faire:

git revert -m 1 HEAD^

Utilisez git show <merge commit SHA1>pour voir les parents, la numérotation est l'ordre dans lequel ils apparaissent par exempleMerge: e4c54b3 4725ad2

Documentation de git merge: http://schacon.github.com/git/git-merge.html

Discussion sur git merge (déroutante mais très détaillée): http://schacon.github.com/git/howto/revert-a-faulty-merge.txt

Marcus Ericsson
la source
36
Comment pouvez-vous obtenir le «numéro» associé au parent? Les branches ont-elles un «identifiant» numérique intrinsèque?
daniyalzade
7
Utilisez git show <merge commit SHA1>pour voir les parents, la numérotation est l'ordre dans Merge: e4c54b3 4725ad2
lequel
8
exemple: git revert -m 1 SHA1Cette commande a fonctionné pour moi pour annuler un commit de fusion qui était plusieurs commits de fusion avant head et avait de nombreux commits en dessous.
c.apolzon
3
Quels sont les parents? E4c54b3 ou 4725ad2?
Dolphin
1
Cela ne fournit toujours pas suffisamment d'informations sur la relation entre les résultats de git show et les numéros parents. L '«ordre d'apparition» est-il basé sur 1? Basé sur 0? Dans cet exemple spécifiquement, quel est le SHA1 du parent 1? e4c54b3 ou 4725ad2?
cowlinator
4

Si je vous comprends bien, vous parlez de faire un

svn merge -rn:n-1

pour revenir sur un commit précédent, auquel cas vous recherchez probablement

git revert
Rudedog
la source
0
git reset --hard HEAD^ 

Utilisez la commande ci-dessus pour annuler les modifications de fusion.

kapil chakravarthy
la source
3
Cela jette le commit de fusion, qui ne fait pas ce que l'affiche originale demande. L'OP essaie de faire un patch inversé pour annuler les modifications précédentes, et non d'effacer complètement l'historique des modifications précédentes.
-1

Si vous ne voulez pas vous engager, ou souhaitez vous engager plus tard (le message de validation sera toujours préparé pour vous, que vous pouvez également modifier):

git revert -n <commit>
rkrisztian
la source