Mergekonflikte
Mergekonflikte treten auf, wenn mehrere Autoren denselben Inhalt bearbeiten oder wenn ein Entwickler eine Datei löscht, während ein anderer Entwickler Änderungen daran vornimmt. Um dieses Problem zu lösen, arbeiten Entwickler in isolierten Branches. Der git merge Befehl ist für das Zusammenführen isolierter Branches und das Auflösen von Konflikten verantwortlich.
Git macht den Zusammenführungsprozess einfacher als die meisten Versionskontrollsysteme. In vielen Fällen kann Git neue Änderungen automatisch integrieren. Bei Konflikten kann Git jedoch nicht automatisch herausfinden, welche Version korrekt ist. Es markiert die Datei als konfliktbehaftet und stoppt den Zusammenführungsprozess.

Häufige Unterbrechungen bei der Zusammenführung
Fehler können an zwei Punkten auftreten: zu Beginn des Zusammenführungsprozesses oder währenddessen. Beachten Sie, dass diese typischerweise durch nicht committete lokale Änderungen und nicht durch tatsächliche Inhaltskonflikte verursacht werden.
Zusammenführungsfehler zu Beginn
Git kann die Zusammenführung nicht starten, weil die ausstehenden Änderungen im Arbeitsverzeichnis oder im Staging-Bereich des Projekts durch die einzufügenden Commits überschrieben würden. Dies geschieht aufgrund ausstehender lokaler Änderungen. Um die Kontrolle über den lokalen Zustand zu übernehmen, werden die Befehle git stash, git checkout, git commit und git reset verwendet. Die folgende Meldung erscheint, wenn zu Beginn ein Fehler auftritt:
Mergekonflikte
error: Your local changes to the following files would be overwritten by merge:Fehler während der Zusammenführung
Ein Fehler während der Zusammenführung zeigt an, dass ein Konflikt zwischen dem aktuellen lokalen Branch und dem zusammengeführten Branch besteht. Die folgende Meldung erscheint, wenn während der Zusammenführung ein Fehler auftritt:
Fehler während der Zusammenführung
CONFLICT (content): Merge conflict in example.txt
Automatic merge failed; fix conflicts and then commit the result.Erzeugen eines Mergekonflikts
Hier zeigen wir Ihnen eine Simulation, wie Mergekonflikte entstehen.
Mergekonflikte
mkdir test-dir
cd test-dir
git init .
echo "some content" > example.txt
git add example.txt
git commit -m "initial commit"
[master (root-commit) a45c22d] initial commit
1 file changed, 1 insertion(+)
create mode 100644 example.txtIm gegebenen Beispiel erstellen wir ein neues Verzeichnis namens test-dir. Anschließend erstellen wir die Textdatei example.txt mit einigen Inhalten, fügen sie dem Repository hinzu und committen sie. Als Ergebnis erhalten wir ein neues Repository mit einem Master-Branch und der Datei example.txt. Der nächste Schritt besteht darin, einen weiteren Branch zu erstellen, der als konfliktbehaftete Zusammenführung verwendet wird.
Auflösen von Konflikten
git checkout -b branch_to_merge
echo "completely different content to merge later" > example.txt
git commit -m "edit the content of example.txt to make a conflict"
[branch_to_merge 4221135] edit the content of example.txt to make a conflict
1 file changed, 1 insertion(+), 1 deletion(-)Im obigen Beispiel erstellen und wechseln wir zum Branch branch_to_merge. Nach dem Erstellen überschreiben wir den Inhalt in example.txt und committen die Änderung. Nachdem wir all dies getan haben, überschreibt der Commit den Inhalt von example.txt:
Git-Mergekonflikte
git checkout master
Switched to branch 'master'
echo "content to add" >> example.txt
git commit -m "added content to example.txt"
[master 11ab34b] added content to example.txt
1 file changed, 1 insertion(+)Diese Befehle wechseln zum Master-Branch, hängen Inhalte an example.txt an und committen die Änderung. Dies versetzt das Repository in einen Zustand, in dem der Branch master und der Branch branch_to_merge jeweils einen einzigartigen Commit haben. Der letzte Schritt besteht darin, den git merge-Befehl auszuführen, wonach ein Konflikt auftritt:
Git-Zusammenführung
git merge branch_to_merge
Auto-merging example.txt
CONFLICT (content): Merge conflict in example.txt
Automatic merge failed; fix conflicts and then commit the result.Erkennen von Mergekonflikten
Wie wir bereits gesehen haben, zeigt Git eine Ausgabe an, die darauf hinweist, dass ein Konflikt aufgetreten ist. Führen Sie den Befehl git status aus, um die nicht zusammengeführten Pfade zu sehen:
Mergekonflikte
git status
On branch master
You have unmerged paths.
(fix conflicts and run "git commit")
(use "git merge --abort" to abort the merge)
Unmerged paths:
(use "git add <file>..." to mark resolution)
both modified: example.txtDie Datei example.txt erscheint in einem geänderten Zustand. Führen Sie den Befehl cat aus, um den Inhalt der Datei example.txt anzuzeigen. Wir können diese visuellen Markierungen sehen:
Git-Konfliktlösung
<<<<<<< HEAD
=======
>>>>>>> branch_to_mergeDie Markierung ======= zeigt die Mitte des Konflikts an. Der Inhalt zwischen den Markierungen <<<<<<< HEAD und ======= gehört zum aktuellen Branch (master), auf den die HEAD-Referenz zeigt. Um die Zusammenführung vollständig abzubrechen und zum Zustand vor der Zusammenführung zurückzukehren, führen Sie git merge --abort aus. Weitere Informationen zu visuellen Markierungen finden Sie auf der Seite git merge.
Auflösen von Mergekonflikten
Um einen Mergekonflikt aufzulösen, sollten Sie die konfliktbehaftete Datei bearbeiten. Öffnen Sie die Datei example.txt in einem Editor, entfernen Sie die Konfliktmarkierungen und behalten Sie die gewünschten Änderungen bei. Eine aufgelöste Datei könnte wie folgt aussehen:
Konflikte in Git
some content to mess with
content to addFühren Sie den Befehl git add aus, um den neuen Zusammenführungsinhalt zu staged (vorzubereiten). Erstellen Sie anschließend einen neuen Commit, um die Zusammenführung abzuschließen:
Auflösen von Konflikten in Git
git add example.txt
git commit -m "the conflict in example.txt is merged and resolved"Alternativ können Sie git mergetool verwenden, um Konflikte visuell mit einem konfigurierten Diff-Tool aufzulösen. Führen Sie beispielsweise git mergetool example.txt aus, um das Tool für eine bestimmte Datei zu öffnen.
| Tool | Beschreibung |
|---|---|
git status | Hilft bei der Identifizierung konfliktbehafteter Dateien. |
git mergetool | Öffnet ein visuelles Diff-Tool zur interaktiven Auflösung von Konflikten. |
git diff | Zeigt Unterschiede zwischen Commits, Branches oder Dateien an, um potenzielle Konflikte vor der Zusammenführung zu identifizieren. |
git checkout --ours/--theirs | Ersetzt die konfliktbehaftete Datei durch den Inhalt des aktuellen oder eingehenden Branches. |
git reset --mixed | Entfernt Dateien aus der Staging-Area, lässt das Arbeitsverzeichnis jedoch unverändert. |
git merge --abort | Bricht die aktuelle Zusammenführung ab und stellt das Arbeitsverzeichnis auf den Zustand vor Beginn der Zusammenführung wieder her. |
git reset | Setzt den Index zurück, um mit HEAD übereinzustimmen, und hilft dabei, konfliktbehaftete Dateien aus der Staging-Area zu entfernen. |
Practice
Welche Aspekte gibt es beim Umgang mit Mergekonflikten in Git?