it-swarm.com.de

Warum beschwert sich git revert über eine fehlende Option -m?

Also arbeite ich mit anderen Leuten an einem Projekt und es werden mehrere Github-Gabeln bearbeitet. Jemand hat gerade ein Problem behoben und ich bin mit seiner Gabel verschmolzen, aber dann wurde mir klar, dass ich eine bessere Lösung finden könnte. Ich möchte das Commit, das ich gerade gemacht habe, zurücksetzen. Ich habe versucht, dies mit git revert HEAD aber es gab mir diesen Fehler:

fatal: Commit <SHA1> ist eine Zusammenführung, es wurde jedoch keine Option -m angegeben.

Was bedeutet das? Beim Zusammenführen und Festschreiben habe ich die Option -m verwendet, um "Zusammengeführt mit <Benutzername>" zu sagen.

Was mache ich hier falsch?

141
icnhzabot

Standardmäßig git revert weigert sich, ein Merge-Commit rückgängig zu machen, da das, was das eigentlich bedeutet, mehrdeutig ist. Ich gehe davon aus, dass es sich bei Ihrem HEAD tatsächlich um ein Merge-Commit handelt.

Wenn Sie das Merge-Commit zurücksetzen möchten, müssen Sie angeben, welches übergeordnete Element des Merges Sie als Haupt-Trunk betrachten möchten, d. H. Auf was Sie zurücksetzen möchten.

Oft ist dies Eltern Nummer eins, zum Beispiel, wenn Sie auf master waren und git merge unwanted und haben dann beschlossen, die Zusammenführung von unwanted rückgängig zu machen. Das erste übergeordnete Element ist Ihr Zweig vor dem Zusammenführen von master, und das zweite übergeordnete Element ist die Spitze von unwanted.

In diesem Fall könnten Sie Folgendes tun:

git revert -m 1 HEAD
158
CB Bailey

Angenommen, der andere Typ hat eine Leiste über foo erstellt, aber Sie haben in der Zwischenzeit baz erstellt und dann zusammengeführt, was eine Historie von ergibt

$ git lola 
 * 2582152 (HEAD, master) Zweig 'otherguy' 
 |\
 | zusammenführen * c7256de (otherguy) bar 
 * | b7e7176 baz 
 |/
 * 9968f79 foo

Hinweis: git lola ist ein nicht standardmäßiger, aber nützlicher Alias.

Keine Würfel mit git revert:

$ git revert HEAD 
 fatal: Commit 2582152 ... ist eine Zusammenführung, aber es wurde keine Option -m angegeben.

Charles Bailey gab eine ausgezeichnete Antwort wie üblich. Mit git revert wie in

$ git revert --no-edit -m 1 HEAD 
 [master e900aad] Revert "Zweig 'otherguy' zusammenführen" 
 0 Dateien geändert, 0 Einfügungen (+), 0 Löschungen (-) 
 Löschmodus 100644 bar

löscht effektiv bar und erzeugt einen Verlauf von

$ git lola 
 * e900aad (HEAD, master) "Zweig" otherguy "zusammenführen" 
 * 2582152 Zweig "otherguy" zusammenführen 
 |\
 | * c7256de (otherguy) bar 
 * | b7e7176 baz 
 |/
 * 9968f79 foo

Aber ich vermute du willst wegwerfen das Merge Commit:

$ git reset --hard HEAD ^ 
 HEAD ist jetzt bei b7e7176 baz 
 
 $ git lola 
 * b7e7176 (HEAD, master) baz 
 | * c7256de (otherguy) bar 
 |/
 * 9968f79 foo

Wie im git rev-parse manual

<rev>^, z.B. KOPF ^, v1.5.1^0
Ein Suffix ^ für einen Revisionsparameter bedeutet das erste übergeordnete Objekt dieses Festschreibungsobjekts. ^<n> bedeutet das n - te Elternteil ( d. h.<rev>^ ist äquivalent zu <rev>^1). Als Sonderregel gilt <rev>^0 bedeutet das Commit selbst und wird verwendet, wenn <rev> ist der Objektname eines Tag-Objekts, das sich auf ein Festschreibungsobjekt bezieht.

also vor dem Aufruf von git reset, HEAD^ (oder HEAD^1) war b7e7176 und HEAD^2 war c7256de, d. h., jeweils der erste und der zweite Elternteil des Merge-Commits.

Sei vorsichtig mit git reset --hard weil es Arbeit zerstören kann.

40
Greg Bacon

Ich hatte dieses Problem. Die Lösung bestand darin, das Commit-Diagramm (mit gitk) zu betrachten und festzustellen, dass ich Folgendes hatte:

*   commit I want to cherry-pick (x)
|\  
| * branch I want to cherry-pick to (y)
* | 
|/  
* common parent (x)

Ich verstehe jetzt, dass ich tun möchte

git cherry-pick -m 2 mycommitsha

Das ist weil -m 1 wird basierend auf dem gemeinsamen übergeordneten Element zusammengeführt, wobei als -m 2 verschmilzt auf der Basis von Zweig y, zu dem ich eine Auswahl treffen möchte.

6
shmish111