2016-07-19 3 views
0

Ich versuche, ein Commit in der Mitte rückgängig zu machen, während die folgenden unverändert bleiben. Ich habe gedacht, dass es unmöglich sein könnte, diese Pfosten zu finden: Post 1 & Post 2. (Das ultimative Ziel könnte dupliziert werden, aber ich hatte es tatsächlich nicht funktioniert. Ich entschuldige mich dafür.)Verwenden Sie `git Rebase`, um ein Commit in der Mitte zu entfernen

Leider bin ich immer noch in der richtigen Verwendung git rebase -i stecken. Ich habe eine Probe Repo wie folgt:

commit cc2576365a9716bb9f96e195e599190d3c70fba0 
Author: zzy 
Date: Sun Jul 17 14:30:53 2016 -0400 
commit #3 

commit 11d9f8fdc69be8b4530e4b70c9661b4e34287afe 
Author: zzy 
Date: Sun Jul 17 14:30:36 2016 -0400 
commit #2 

commit 4770e08eb54d0d582bd4b391f2361a328b417cdf 
Author: zzy 
Date: Sun Jul 17 14:29:58 2016 -0400 
commit #1 

Jede begehen in einer Datei eine neue Zeile fügt a genannt (siehe a ‚s Inhalt unten):

Nach # 1

1 

begehen Nach dem Festschreiben # 2

1 
2 

Nach commit # 3

1 
2 
3 

Jetzt wollen I # 2 begehen zu entfernen, und die a sollte wie folgt aussehen:

1 
3 

ich den Befehl als git rebase -i 11d9f8fdc69be8^ und erhalten die Textdatei als versucht:

pick 11d9f8f commit #2 
pick cc25763 commit #3 

Ich löschte die erste Zeile, hielt nur Commit # 3 und verließ die Datei. Aber ich erhalte den folgenden Fehler:

error: could not apply cc25763... commit #3 

When you have resolved this problem, run "git rebase --continue". 
If you prefer to skip this patch, run "git rebase --skip" instead. 
To check out the original branch and stop rebasing, run "git rebase --abort". 
Could not apply cc2576365a9716bb9f96e195e599190d3c70fba0... commit #3 

Und die Datei a wird:

1 
<<<<<<< HEAD 
======= 
2 
3 
>>>>>>> cc25763... commit #3 

Ich bin verwirrt, warum 2 ist immer noch hier und warum gibt es Konflikte. Kann mir jemand helfen, das erwartete Ergebnis zu bekommen? Danke im Voraus!

+4

Die Änderungen, die Sie mit Ihren Commits vornehmen, sind einander zu nah. Sie überlappen sich nicht, aber um sicherzugehen, dass nichts verloren geht, enthält "Git" und jedes andere "diff" -Programm mindestens zwei Kontextlinien (eine vor und eine nachher) im diff. In dieser Perspektive überschneiden sich die von Ihren Commits eingeführten Änderungen und deshalb kommt es zu einem Konflikt. Versuchen Sie es erneut mit einer größeren Datei und achten Sie darauf, dass die Änderungen mehrere Zeilen auseinander liegen, und es wird wie erwartet funktionieren. – axiac

+2

Neben [was axiac erwähnt] (http://stackoverflow.com/questions/38468446/use-git-rebase-to-remove-a-commit-in-the-middle#comment64341138_38468446), möchten Sie möglicherweise festlegen, zusammenführen .conflictstyle zu 'diff3', so dass Git Ihnen nicht nur die zwei verschiedenen Versionen, sondern auch den gemeinsamen Basisteil zeigt. Es ist nicht wirklich nützlich für dieses spezielle triviale Beispiel, aber im Allgemeinen finde ich es einfacher, einen Zusammenführungskonflikt mit dem 'diff3'-Modus zu lesen. – torek

+0

@axiac Vielen Dank soooooooo viel !!!! Ja, ich habe ein größeres Beispiel mit genau den gleichen Befehlen gewählt und es funktioniert! – zzy

Antwort

2

Da sowohl commit # 2 als auch commit # 3 Zeilen änderten, die sich in der gleichen Datei sehr nahe beieinander befanden, weiß git nicht, wie man die Änderungen in commit # 3 jetzt "commit" 2 ist nicht mehr vorhanden, also bekommst du einen Konflikt.

Innerhalb der Datei, die die Konflikte enthält, erscheint folgendes:

<<<<<<< HEAD 
======= 
2 
3 
>>>>>>> cc25763... commit #3 

Der Raum zwischen <<<<<<< HEAD und ======= zeigt, was die Datei auf commit # 1 in dieser Position enthalten sind, bevor # begehen 2 oder begehen # 3 wurden erschaffen. Der Abstand zwischen ======= und >>>>>>> cc25763... commit #3 enthält den Inhalt dieses Abschnitts der Datei in Commit # 3, nachdem Commit # 2 und Commit # 3 hinzugefügt wurden. Git erwartet, dass Sie diese Informationen verwenden, um manuell zu entscheiden, welchen Inhalt die neue Version von Commit # 3 jetzt enthalten sollte, wenn Sie versuchen, sie ohne Commit # 2 erneut abzuspielen.

Ersetzen Sie den gesamten Abschnitt der Datei mit dem, was die Datei enthalten soll, nachdem Commit # 3 erneut abgespielt wird.In diesem Fall würden Sie ersetzen:

<<<<<<< HEAD 
======= 
2 
3 
>>>>>>> cc25763... commit #3 

mit:

3 

Dann führen git add a diese Änderungen auf die Bühne, und git rebase --continue die rebase fortzusetzen.

Beachten Sie, dass Sie dies nur während eines Rebases tun müssen, wenn Konflikte auftreten. Für Commits, die nicht zusammenhängende Dinge ändern (z. B. wenn die Commits # 2 und # 3 völlig unterschiedliche Dateien oder vollständig unterschiedliche Abschnitte derselben Datei änderten), kann git rebase normalerweise bestimmen, welche Änderungen automatisch vorgenommen werden, und es treten keine Konflikte auf.

Verwandte Themen