Zusammenführen und Konflikte · Übung
Einen Branch ohne Konflikt zusammenführen
Ein unfertiger Konflikt kann jeden Merge wie einen drohenden Streit aussehen lassen. Die meisten Merges sind ruhiger: Git schiebt entweder einen Branch vor oder verbindet Änderungen, die nicht miteinander konkurrieren.
Bevor du den vorbereiteten Konflikt löst, erstellst du deshalb zwei eigene Merges, die ohne Zwischenfall durchlaufen. Beide verwenden nur Befehle, die du bereits kennst.
Dein Repository sollte auf main stehen und einen sauberen Arbeitsbaum haben. Falls git status einen laufenden Merge meldet, beende ihn vor dem Start mit git merge --abort aus der vorherigen Lektion.
git status
Ein Branch, der nur voraus ist
Lege einen Branch an, erstelle darauf einen Commit und lass main, wo es ist:
git switch -c opening-note
nano -w hours.txt
Gib diese eine Zeile ein. Speichere dann mit Ctrl-O, Enter und verlasse nano mit Ctrl-X:
Open 9:00 to 17:00, Tuesday to Saturday.
Committe die Datei und kehre dann zu main zurück:
git add hours.txt
git commit -m "Add the opening hours"
git switch main
main hat sich seit dem Beginn von opening-note nicht bewegt. opening-note ist auf derselben Linie also einfach weiter voraus. Das ist die Fast-Forward-Form aus Lektion 1. Führe den Branch zusammen:
git merge opening-note
git log
Lies Gits Ausgabe. Darin steht Fast-forward, und git log enthält einen Commit mehr als vorher, nicht zwei. Es wurde kein Merge-Commit erstellt, weil keiner nötig war: Git hat den Namen main entlang bereits vorhandener Commits vorgeschoben.
Zwei Branches, die sich beide bewegt haben
Stelle jetzt absichtlich die andere Form her. Beginne einen zweiten Branch und committe darauf:
git switch -c contact-note
nano -w contact.txt
Gib diese Zeile ein, speichere und beende nano wie zuvor:
Questions: hello@example.invalid
git add contact.txt
git commit -m "Add a contact line"
git switch main
Committe diesmal auch etwas auf main, damit keiner der beiden Branches die Arbeit des anderen enthält:
nano -w notice.txt
Gib diese Zeile ein, speichere und beende nano:
The shop is closed on public holidays.
git add notice.txt
git commit -m "Note the holiday closure"
git merge contact-note -m "Merge the contact line"
git log
Diesmal konnte Git nicht einfach einen Zeiger vorschieben, weil main einen Commit hatte, der contact-note fehlte, und umgekehrt. Stattdessen hat es den Commit mit zwei Vorgängern aus Lektion 2 erstellt. Die Option -m gibt dessen Nachricht an, genau wie bei einem gewöhnlichen Commit.
Die beiden Branches haben unterschiedliche Dateien geändert. Git hat sie deshalb zusammengeführt, ohne dich etwas zu fragen. Das ist der gewöhnliche Fall. Es lohnt sich, wahrzunehmen, wie unspektakulär er war.
Warum diese beiden Merges ruhig verliefen
Am vorbereiteten Konflikt hat sich währenddessen nichts geändert. simplify-tiers unterscheidet sich von main noch immer in denselben drei Zeilen von pricing.md. Ein Merge wird weiterhin anhalten.
Der Unterschied liegt weder im Glück noch in der Größe der Änderung. Beim üblichen Textkonflikt haben beide Seiten dieselben Zeilen geändert. Deshalb ist nicht offensichtlich, welche Kombination du gemeint hast. Git kann auch bei anderen unvereinbaren Änderungen anhalten, etwa wenn eine Seite einen Pfad löscht, den die andere bearbeitet hat. Unterschiedliche Dateien lassen sich ruhig zusammenführen, und unterschiedliche Teile einer Datei meist ebenfalls.
Deine beiden Branches haben contact.txt und notice.txt hinzugefügt, und Git hat sie zusammengeführt, ohne dich etwas zu fragen. Warum?
Nach git merge opening-note meldete Git Fast-forward, und der Verlauf wuchs um einen Commit statt um zwei. Was sagt dir das?
Du hast jetzt zwei Merges abgeschlossen und ihre Formen in deinem eigenen Verlauf gelesen. Das ist die normale Erfahrung beim Zusammenführen. Die nächste Lektion kehrt zum vorbereiteten Widerspruch zurück. Das ist der andere, seltenere Fall und der Grund für dieses Kapitel.