Meine Git-Geschichte sieht so aus:
Ich möchte die lila Commits zu einem einzigen zusammenfassen. Ich möchte sie nie wieder in meinem Festschreibungsprotokoll sehen.
Ich habe versucht, ein zu machen git rebase -i 1
, aber obwohl 1
es sich auf dem blauen Zweig befindet (siehe Bild), sehe ich immer noch jedes Commit auf meinem lila Zweig.
Wie kann ich den lila Zweig (aus dem Festschreibungsprotokoll) vollständig entfernen?
git
git-merge
git-rebase
Benjamin Toueg
quelle
quelle
Antworten:
Auf
git rebase -i <sha before the branches diverged>
diese Weise können Sie das Zusammenführungs-Commit entfernen und das Protokoll besteht aus einer einzelnen Zeile, wie Sie möchten. Sie können auch alle Commits löschen, die Sie nicht mehr möchten. Der Grund, warum Ihre Rebase nicht funktionierte, war, dass Sie nicht weit genug zurückgingen.WARNUNG: Sie schreiben dabei den Verlauf neu. Wenn Sie dies mit Änderungen tun, die auf ein Remote-Repo übertragen wurden, treten Probleme auf. Ich empfehle, dies nur mit lokalen Commits zu tun.
quelle
git rebase
und sie werden entfernt.Beginnend mit dem Repo im Originalzustand
So entfernen Sie das Zusammenführungs-Commit und quetschen den Zweig zu einem einzigen Commit in der Hauptzeile
Verwenden Sie diese Befehle (ersetzen Sie 5 und 1 durch die SHAs der entsprechenden Commits):
So behalten Sie ein Merge-Commit bei, aber quetschen Sie die Branch-Commits zu einem:
Verwenden Sie diese Befehle (ersetzen Sie 5, 1 und C durch die SHAs der entsprechenden Commits):
So entfernen Sie das Zusammenführungs-Commit und ersetzen es durch einzelne Commits aus dem Zweig
Tun Sie dies einfach (ersetzen Sie 5 durch die SHA des entsprechenden Commits):
Und schließlich, um den Zweig vollständig zu entfernen
Verwenden Sie diesen Befehl (ersetzen Sie C und D durch die SHAs der entsprechenden Commits):
quelle
git rebase 5 master
Fall, warum ist es nicht "ABC 1 2 3 4 5 D ..." bestellen?master
nichts gemeinsam hat,5
und legt sie darauf5
. Das Commit beiC
ist nicht Teil der Linie von5
, es ist das erste, auf das verschoben wird5
.git rebase C 5; git rebase 5 master
So entfernen Sie einfach ein Merge-Commit
Wenn Sie lediglich ein Merge-Commit (2) entfernen möchten, damit es so aussieht, als wäre es nie passiert, lautet der Befehl einfach wie folgt
git rebase --onto <sha of 1> <sha of 2> <blue branch>
Und jetzt ist der lila Zweig überhaupt nicht mehr im Commit-Protokoll von Blau und Sie haben wieder zwei separate Zweige. Sie können das Purpur dann unabhängig voneinander quetschen und alle anderen gewünschten Manipulationen vornehmen, ohne dass das Zusammenführen festgeschrieben wird.
quelle
Es gibt zwei Möglichkeiten, dies basierend auf Ihren Wünschen anzugehen:
Lösung 1 : Entfernen Sie lila Commits, um den Verlauf beizubehalten (falls Sie einen Rollback durchführen möchten).
-m 1
Gibt an, welche übergeordnete Zeile ausgewählt werden sollLila Commits sind weiterhin in der Geschichte vorhanden. Da Sie jedoch zurückgesetzt haben, wird kein Code aus diesen Commits angezeigt.
Lösung 2 : Entfernen Sie lila Commits vollständig (störende Änderung, wenn Repo geteilt wird)
und löschen (Linien entfernen), die lila Commits entsprechen.
Dies wäre weniger schwierig, wenn nach dem Zusammenführen keine Commits vorgenommen würden. Zusätzliche Commits erhöhen die Wahrscheinlichkeit von Konflikten während
revert/rebase
.quelle
1 - 1 = 0
. Wenn Sie dann die lila Commits erneut löschen, lassen Sie den zurückgesetzten Patch zurück, es sei denn, Sie setzen dies ebenfalls zurück. Wenn Sie dies nicht tun, ist es so, als würden Sie sich-1
auf Ihren Verlauf beziehen, nicht0
, sodass Sie Änderungen hinterlassen, die Sie nicht möchten.