web-dev-qa-db-fra.com

Pourquoi git revert se plaint-il d'une option -m manquante?

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?

141
icnhzabot

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
158
CB Bailey

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.

40
Greg Bacon

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.

6
shmish111