Zum Inhalt springen

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.

mergeconflicts

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

bash
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

bash
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

bash
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.txt

Im 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

bash
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

bash
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

bash
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

bash
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.txt

Die 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

bash
<<<<<<< HEAD
=======
>>>>>>> branch_to_merge

Die 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

bash
some content to mess with
content to add

Fü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

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

ToolBeschreibung
git statusHilft bei der Identifizierung konfliktbehafteter Dateien.
git mergetoolÖffnet ein visuelles Diff-Tool zur interaktiven Auflösung von Konflikten.
git diffZeigt Unterschiede zwischen Commits, Branches oder Dateien an, um potenzielle Konflikte vor der Zusammenführung zu identifizieren.
git checkout --ours/--theirsErsetzt die konfliktbehaftete Datei durch den Inhalt des aktuellen oder eingehenden Branches.
git reset --mixedEntfernt Dateien aus der Staging-Area, lässt das Arbeitsverzeichnis jedoch unverändert.
git merge --abortBricht die aktuelle Zusammenführung ab und stellt das Arbeitsverzeichnis auf den Zustand vor Beginn der Zusammenführung wieder her.
git resetSetzt 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?

Finden Sie das nützlich?

Dual-run-Vorschau — vergleichen Sie mit den Symfony-Routen live.