Donc, je travaille sur un projet avec d'autres personnes, et plusieurs fourchettes de github sont en train d'être travaillées. Quelqu'un vient de résoudre un problème et j'ai fusionné avec sa fourchette, mais j'ai alors réalisé que je pouvais trouver une meilleure solution. Je veux annuler le commit que je viens de faire. J'ai essayé de le faire avec git revert HEAD
mais cela m’a donné cette erreur:
fatal: commit <SHA1> est une fusion mais aucune option -m n'a été donnée.
Qu'est-ce que ça veut dire? Lors de la fusion et de la validation, j'ai utilisé l'option -m pour dire "Fusionné avec <nom d'utilisateur>".
Qu'est-ce que je fais mal ici?
Par défaut git revert
refuse de rétablir un commit de fusion car ce que cela signifie est ambigu. Je présume que votre HEAD
est en fait un commit de fusion.
Si vous souhaitez annuler la validation de fusion, vous devez spécifier le parent de la fusion que vous souhaitez considérer comme étant la ligne principale, c’est-à-dire ce à quoi vous souhaitez revenir.
Ce sera souvent le parent numéro un, par exemple si vous étiez sur master
et que vous avez git merge unwanted
puis a décidé de revenir à la fusion de unwanted
. Le premier parent serait votre branche pré-fusion master
et le deuxième parent serait la pointe de unwanted
.
Dans ce cas, vous pourriez faire:
git revert -m 1 HEAD
Dites que l’autre a créé bar au-dessus de foo, mais vous avez créé baz dans l’intervalle, puis fusionné, donnant une histoire de
$ git lola * 2582152 (HEAD, master) Fusionner la branche 'otherguy' |\ | * c7256de (otherguy) bar * | b7e7176 baz |/ * 9968f79 foo
Remarque: git lola est un alias non standard mais utile.
Pas de dés avec git revert
:
$ git revert HEAD fatal: Commit 2582152 ... est une fusion, mais aucune option n'a été donnée.
Charles Bailey a donné un excellente réponse comme d'habitude. En utilisant git revert
un péché
$ git revert --no-edit -m 1 HEAD [master e900aad] Revenir "Fusionner la branche 'autre-achat" " 0 fichiers modifiés, 0 insertions (+), 0 suppressions (-) mode suppression 100644 bar
supprime efficacement bar
et produit un historique de
$ git lola * e900aad (HEAD, master) Rétablir "Fusionner la branche 'autre-achat'" * 2582152 Fusionner la branche 'autre-achat' |\ | * c7256de (otherguy) bar * | b7e7176 baz |/ * 9968f79 foo
Mais je soupçonne que vous voulez jeter le commit de fusion:
$ git reset --hard HEAD ^ HEAD est maintenant à b7e7176 baz $ git lola * b7e7176 (HEAD, maître) baz | * c7256de (otherguy) bar |/ * 9968f79 foo
Comme indiqué dans le git rev-parse
manuel
<rev>^
, par exemple. HEAD ^,v1.5.1^0
Un suffixe^
à un paramètre de révision signifie le premier parent de cet objet de validation.^<n>
signifie le n - ème parent ( c'est-à-dire<rev>^
est équivalent à<rev>^1
). En règle spéciale,<rev>^0
signifie le commit lui-même et est utilisé quand<rev>
est le nom d'objet d'un objet de balise qui fait référence à un objet de validation.
donc avant d'invoquer git reset
, HEAD^
(ou HEAD^1
) était b7e7176 et HEAD^2
était c7256de, c'est-à-dire, respectivement les premier et deuxième parents du commit de fusion.
Attention à git reset --hard
parce que cela peut détruire le travail.
J'ai eu ce problème, la solution a été d'examiner le graphique de validation (à l'aide de gitk) et de constater que j'avais les éléments suivants:
* commit I want to cherry-pick (x)
|\
| * branch I want to cherry-pick to (y)
* |
|/
* common parent (x)
Je comprends maintenant que je veux faire
git cherry-pick -m 2 mycommitsha
Cela est dû au fait que -m 1
Serait fusionné en fonction du parent commun, où -m 2
Fusionnait en fonction de la branche y, c’est celui-ci que je souhaite sélectionner.