Was ist ein Merge-Konflikt in Git?
Ein Merge führt die Arbeit zweier Branches wieder zusammen. Ein Merge-Konflikt entsteht, wenn beide Branches dieselbe Zeile verschieden geändert haben und Git nicht wählen kann.
Im Lager eines Teeladens senkt eine Person den Preis für eine Aktion. Eine andere erhöht ihn am selben Tag wegen der Kosten. Beide Änderungen sind berechtigt, aber nur eine Zahl passt in die Zeile.
Am Ende dieser Lektion
Notiz
Ich kann zwei Branches zusammenführen und einen Konflikt erkennen.
Schlüsselbegriffe
| Begriff | Was er bedeutet |
|---|---|
| Merge | die Arbeit eines Branches in den aktuellen übernehmen |
| Fast-forward | ein Merge, bei dem nur der Branchname vorrückt |
| Merge-Commit | ein Commit mit zwei Vorgängern |
| Konflikt | dieselbe Zeile wurde auf beiden Seiten verschieden geändert |
| Konfliktmarkierung | eine Zeile, die beide Fassungen in der Datei trennt |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Ein Merge geht auf zwei Arten aus
Wenn main seit der Abzweigung kein neuer Commit erreicht hat, rückt der Name von main einfach vor. Das ist ein Fast-forward, es entsteht kein neuer Commit.
Haben beide Branches neue Commits, erzeugt Git einen Merge-Commit mit zwei Vorgängern. Ändern beide dieselbe Zeile, hält Git an und meldet einen Konflikt.
Drei Ausgänge eines Merges
| Lage der Branches | Was Git tut | Neuer Commit |
|---|---|---|
| Nur der andere Branch hat neue Commits | Fast-forward: der Name rückt vor | Nein |
| Beide haben neue Commits, andere Zeilen | Merge-Commit ohne Hilfe | Ja |
| Beide änderten dieselbe Zeile | Konflikt: Git hält an und fragt | Erst nach Ihrer Wahl |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Ein Repository namens lager anlegen
git init -b main lagerHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Ihren Namen für diesen Ordner setzen
git -C lager config user.name "Studierende"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Ihre Adresse für diesen Ordner setzen
git -C lager config user.email "[email protected]"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Eine Bestandsliste mit zwei Zeilen schreiben
printf 'Tee 40\nKaffee 25\n' > lager/bestand.txtHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Die Liste vormerken
git -C lager add bestand.txtHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Den ersten Commit speichern
git -C lager commit -m "Bestand angelegt"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Zwei Seiten ändern dieselbe Zeile
Jetzt bauen Sie den Konflikt mit Absicht. Auf dem Branch aktion ersetzen Sie in der ersten Zeile die 40 durch 35. Zurück auf main ersetzen Sie dieselbe 40 durch 38. Beide Seiten speichern ihre Änderung als Commit.
Den Branch aktion anlegen und wechseln
git -C lager switch -c aktionHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Auf aktion die Zahl auf 35 ändern
sed -i 's/Tee 40/Tee 35/' lager/bestand.txtHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Die Änderung auf aktion speichern
git -C lager commit -am "Aktionspreis eintragen"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Zurück auf main wechseln
git -C lager switch mainHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Auf main dieselbe Zahl auf 38 ändern
sed -i 's/Tee 40/Tee 38/' lager/bestand.txtHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Die Änderung auf main speichern
git -C lager commit -am "Kosten weitergeben"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Den Branch aktion in main einführen
git -C lager merge aktionHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Lesen, was Git in die Datei schrieb
cat lager/bestand.txtHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Drei Markierungszeilen zeigen beide Fassungen
Git schrieb beide Fassungen in die Datei. Die Zeile <<<<<<< HEAD beginnt die Fassung des Branches, auf dem Sie stehen. Die Zeile ======= trennt die Fassungen. Die Zeile >>>>>>> aktion beendet die andere.
Zum Lösen bearbeiten Sie die Datei zum gewünschten Text und löschen die drei Markierungszeilen. Dann folgen git add und git commit. Hier machen Sie den Merge stattdessen rückgängig.
Den Merge abbrechen
git -C lager merge --abortHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Ein häufiger Irrtum
Warnung
Viele glauben, ein Konflikt heiße, das Repository sei kaputt oder jemand habe einen Fehler gemacht. Er heißt nur, dass zwei Personen dieselbe Zeile änderten. Nichts ist verloren. Sie wählen den richtigen Text oder brechen den Merge mit git merge --abort ab.