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?
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
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.
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.