it-swarm.com.de

Wie man aufhört, in Git zu verschmelzen?

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

  • Werden die Commits aus den beiden zusammengeführten Zweigen in chronologischer Reihenfolge sortiert ? Oder sehe ich zuerst (im git log) das Commit von BranchA , gefolgt von DANN von den Commits von BranchB ?

BEARBEITEN

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!

7
Kamafeather

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.

18
jthill

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.

2
torek

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.

0
Srdjan Grubor