Ich arbeite derzeit an einer Filiale und möchte, dass einige Commits in andere Filialen integriert werden:
a-b-c-d-e-f-g (branchA)
/
--o-x-x-x-x-x-x-x-x-x-x (master)
\
x-x-x-x-x (branchB)
(Buchstaben bezeichnen Commits, und das "x" sind irrelevante Commits.)
Ich bemerkte jedoch, dass es eine gute Idee wäre, einige Commits zusammenzufassen. Ich möchte a, d, e und g in einem Patch "verketten" und an den Master übergeben. Die Commits b und f sollten als ein Commit für branchB ausgeführt werden. Gibt es einen guten Weg, dies zu erreichen?
Antworten:
Der Befehl, den Sie suchen, ist
git rebase
speziell die-i/--interactive
Option.Ich gehe davon aus, dass Sie Commit C in Zweig A belassen möchten und dass Sie wirklich bedeuten, dass Sie die anderen Commits in die anderen Zweige verschieben möchten, anstatt sie zusammenzuführen, da Zusammenführungen unkompliziert sind. Beginnen wir mit der Manipulation von Zweig A.
Das
^
bedeutet das vorherige Festschreiben, daher sagt dieser Befehl, Zweig A mit dem Festschreiben vor "a" als Basis neu zu gründen. Git präsentiert Ihnen eine Liste der Commits in diesem Bereich. Ordne sie neu und sag git, er soll die passenden zerquetschen:Jetzt sollte die Geschichte so aussehen:
Nehmen wir nun das neu gequetschte Commit b + f für branchB.
Und das gleiche für a + d + e + g für Master:
Aktualisieren Sie abschließend branchA so, dass es auf c zeigt:
Wir sollten jetzt haben:
Beachten Sie, dass Sie bei mehreren Commits, die Sie zwischen Zweigen verschieben möchten, Rebase erneut verwenden können (nicht interaktiv):
Zum Schluss noch ein Haftungsausschluss: Es ist durchaus möglich, Commits so neu zu ordnen, dass einige nicht mehr sauber gelten. Dies kann daran liegen, dass Sie eine schlechte Reihenfolge gewählt haben (indem Sie vor dem Festschreiben einen Patch einfügen, um die gepatchte Funktion einzuführen). In diesem Fall möchten Sie die rebase (
git rebase --abort
) abbrechen . Andernfalls müssen Sie die Konflikte intelligent beheben (genau wie bei Zusammenführungskonflikten), die Korrekturen hinzufügen und dann ausführengit rebase --continue
, um fortzufahren. Diese Anweisungen werden auch durch die Fehlermeldung bereitgestellt, die gedruckt wird, wenn der Konflikt auftritt.quelle
git branch -f branchA branchA^^
falsch? Sollte branchA an dieser Stelle nicht auf c zeigen, damit die erste Zeile des Diagramms angezeigt wirdc (branchA)
und nichtc - [a+d+e+g] - [b+f] (branchA)
?git branch -f branchA branchA^^
warum kannst du nicht einfach einengit reset --hard <sha1 of c>
in Zweig A machen?Wo
3
ist die Anzahl der Commits, die neu angeordnet werden müssen ( Quelle ).Dies öffnet vi und listet Commits vom ältesten (oben) zum neuesten (unten) auf.
Nun Neuordnungs die Linien, speichern , und beenden Sie den Editor.
ddp
verschiebt die aktuelle Zeile nach untenddkP
verschiebt die aktuelle Zeile nach oben ( Quelle )quelle
git rebase --interactive
ist der Befehl, den Sie wollen.Beispiel:
Der aktuelle Status lautet:
Ich möchte Commits
9a24b81
(Third Commit) und7bdfb68
(Second Commit) neu anordnen . Dazu finde ich zuerst das Commit vor dem ersten Commit, das wir ändern möchten . Dies ist Commit186d1e0
(First Commit).Der auszuführende Befehl lautet
git rebase --interactive COMMIT-BEFORE-FIRST-COMMIT-WE-WANT-TO-CHANGE
in diesem Fall:Dadurch wird im Standardeditor eine Datei mit folgendem Inhalt geöffnet:
Beachten Sie, dass die Reihenfolge der Commits in der Datei der für das Git-Protokoll verwendeten entgegengesetzt ist. Im Git-Protokoll befindet sich das letzte Commit oben. In dieser Datei befindet sich das letzte Commit unten.
Wie der Kommentar am Ende der Datei erklärt, kann ich verschiedene Dinge tun, z. B. Commits quetschen, löschen und neu anordnen. Um Commits neu zu ordnen, bearbeite ich die Datei so, dass sie so aussieht (die unteren Kommentare werden nicht angezeigt):
Der
pick
Befehl am Anfang jeder Zeile bedeutet "dieses Commit verwenden (dh einschließen)". Wenn ich die temporäre Datei mit den Rebase-Befehlen speichere und den Editor verlasse, führt git die Befehle aus und aktualisiert das Repository und das Arbeitsverzeichnis:Beachten Sie den neu geschriebenen Commit-Verlauf.
Links:
quelle
git rebase --interactive
das Ziel von OP erreichen?Wenn Sie nur die letzten beiden Commits neu anordnen möchten , können Sie diesen
git reorder
Alias verwenden: https://stackoverflow.com/a/33388211/338581quelle
Git Rebase ist was Sie wollen. Überprüfen Sie die Option --interactive.
quelle