Ich hatte eine Drei-Wege-Merge-Branch-Merge:
git checkout master
git merge BranchA
>> Fast-forward merge
git merge BranchB
>> Three-way-merge (prompts for a merge commit message)
Meine Fragen sind zwei:
Wie kann ich das Zusammenführen abbrechen? Mit dem Drei-Wege-Merge habe ich dem Editor gezeigt, wo er die Merge-Commit-Nachricht schreiben soll. Aber wenn ich verlassen, ohne zu speichern, git ohnehin mit der Zusammenführung geht (nur die Merge-Commit-Nachricht wird der Standard man stattdessen das, was ich geschrieben habe könnte aber abgebrochen)
commit 11111233
Merge 'BranchB' into master
obwohl ich die Festschreibungsnachricht offensichtlich nicht bestätigt habe, würde ich erwarten, dass die Zusammenführung nicht erfolgt (wie das gleiche Verhalten, wenn ich eine normale Festschreibungsnachricht NICHT bestätige).
git log
) das Commit von BranchA , gefolgt von DANN von den Commits von BranchB ?Um die zweite Frage besser zu erklären, habe ich einen Test gemacht: 2 Zweige (A und B) beginnend mit dem master Zweig. Ich habe ein auf B begeht, dann auf A, dann wieder auf B, und schließlich wieder auf A. Dann fusionierte I BranchA in Master . Und dann BranchB in master .
Aber wenn ich auf master git log
bin, ist dies herausgekommen und warum habe ich die zweite Frage gestellt:
commit 730fdd4d328999c86fa4d3b6120ac856ecaccab1
Merge: 7eb581b cc1085a
Author: Arthur Conandoyle <[email protected]>
Date: Mon Feb 9 21:24:27 2015 +0100
Merge branch 'BranchB' into master_COPY
commit 7eb581b39a8402e1694cc4bf4eab4a3feb1143f8
Author: Arthur Conandoyle <[email protected]>
Date: Mon Feb 9 21:23:18 2015 +0100
BranchA) - This should be the (second) last change of the branch, and be the
most recent into the git log, even if I merge another branch into master,
AFTER the one where we are committing this.
commit cc1085a6aaa2ee4b26d3c3fbb93bee863d9e7c28
Author: Arthur Conandoyle <[email protected]>
Date: Mon Feb 9 21:20:29 2015 +0100
(BranchB) - Add settings to the last new features
commit 5f5b846a2f89886d01244ba77af941f554233b51
Author: Arthur Conandoyle <[email protected]>
Date: Mon Feb 9 21:18:54 2015 +0100
(BranchA) - Add some changes
commit 92a57a56b6b7c9694fbedda71b8070fc58683dde
Author: Arthur Conandoyle <[email protected]>
Date: Mon Feb 9 21:18:17 2015 +0100
(BranchB) - Some changes
commit 221765476e348833cf8da73b1bf5239f3d4240e8
Author: Arthur Conandoyle <[email protected]>
Date: Tue Feb 3 12:12:19 2015 +0100
Change (this is the last commit of the parent 'master' branch)
(A Srdjan Grubor geschrieben) Ich würde zunächst erwartet worden ist (in chronologischer Reihenfolge) alle begehen aus dem fusionierten BranchA undDANNall Commits aus dem fusionierten BranchB , in der Reihenfolge der Verschmelzung ... .. aber es ist schon komisch, wie die git log
statt sie in chronologischer Reihenfolge zeigen und die Festschreibungen sind nicht als gruppierte in Zweigen gezeigt!
Die BranchB-Zusammenführung ist ganz normal und fordert eine normale Commit-Nachricht an. Wenn Sie das Programm beenden, ohne es zu ändern, wird die Zusammenführung standardmäßig abgeschlossen. Da die Zusammenführung selbst erfolgreich war, besteht die einzige Möglichkeit, sie jetzt zu stoppen, darin, eine fehlerhafte Zusammenführungsnachricht zu übermitteln (eine leere wird es tun, wenn keine Hooks vorhanden sind).
Wenn eine Zusammenführung angehalten wurde, können Sie sie mit abbrechen
git merge --abort
# or
git reset --merge
Backout für alles, was Sie gerade irrtümlich begangen haben, ist
git reset --hard @{1}
Es gibt kein Konzept von Branch "Ownership" in Git, alle Arten, wie Sie sich auf ein Commit beziehen können sind Peers.
Sie können sich ein besseres Bild von der Struktur machen, mit der git log Ihnen angezeigt wird
git log --graph --decorate --oneline
Probieren Sie es mit --date-order
und --topo-order
und --all
aus.
In Bezug auf Ihre Bearbeitung git log
sorts die Ausgabe. Dies kann sogar in einer linearen Geschichte überraschend sein. Es gibt Flags zum Ändern der Sortiermethode und das Hinzufügen von --graph
ändert die Standardsortierung in --topo-order
.
Der andere wichtige Punkt ist, dass es beim schnellen Vorlauf des Zweigs durch git kein Merge-Commit gibt:
C---D <-- branch
/
A---B <-- mainline
Wenn Sie mainline
erlauben, branch
über den Schnellvorlauf zu erfassen, erhalten Sie das einfache Diagramm:
C---D <-- mainline, branch
/
A---B
dies wird trivial als einfache gerade Linie gezeichnet, aber das Erzwingen eines Merge-Commits (mit git merge --no-ff
) führt zu einem tatsächlichen Merge-Commit für zwei übergeordnete Elemente:
C---D <-- branch
/ \
A---B-------M <-- mainline
das (einmal verallgemeinert, um mehr Festschreibungen zu haben) bietet interessantere Optionen für den Festschreibungssortierungsprozess.
Sie können die Zusammenführung "abbrechen", nachdem Sie fertig sind und sie verwenden
git reflog
um zum vorherigen Baumstatus zurückzukehren. In der Regel werden Zusammenführungen nicht in chronologischer Reihenfolge sortiert, sondern in der Reihenfolge des Festschreibens von Zweigen, die dann separat sortiert werden. Dies bedeutet, dass Ihr Merge-Commit gefolgt von allen Quell-Branch-Commits (in chronologischer Reihenfolge) und anschließend von Ihren Haupt-Branch-Commits (in chronologischer Reihenfolge) angezeigt wird.