Auflösen von Merge-Konflikten in Git
In diesem Tutorial zeigen wir, wie Sie Konflikte lösen, die beim Zusammenführen zweier Branches in Git entstehen.
Normalerweise wird die Arbeit an denselben Dateien oft von verschiedenen Teammitgliedern in einer kollaborativen Teamumgebung erledigt. Beispielsweise kann ein Teammitglied, das an einer Feature-Entwicklung arbeitet, die README
-Datei bearbeiten, um Informationen über das entwickelte Feature bereitzustellen.
Ein anderes Teammitglied, das an der Behebung von Fehlern arbeitet, kann Informationen zu den behobenen Fehlern in derselben README
-Datei hinzufügen. Sie arbeiten möglicherweise an verschiedenen Branches und führen ihre Änderungen in ihren jeweiligen Branches durch.
Von Zeit zu Zeit müssen verschiedene Zweige zusammengeführt werden, um einen zusammenhängenden Build bereitzustellen. Daher führt dieser Vorgang zu einem Zusammenführungskonflikt, wenn dieselben Dateien in verschiedenen Zweigen aktualisiert werden.
Dann müssen die Konflikte gelöst und die Änderungen zusammengeführt werden. Wir werden dies nun an einem Beispiel veranschaulichen.
Lösen von Konflikten beim Zusammenführen zweier Zweige mit git mergetool
Bevor wir Zusammenführungskonflikte lösen, sollten wir das von Git verwendete Diff-Tool wie folgt einrichten.
$ git config merge.tool meld
$ git config merge.conflictstyle diff3
$ git config mergetool.prompt false
Die obigen Befehle setzen meld
als Standard-Diff-Tool. Außerdem haben wir den conflictstyle
auf diff3
gesetzt (d.h.); Dadurch wird das Diff-Tool so eingestellt, dass der gemeinsame Vorfahren für beide Dateien angezeigt wird (der aktuelle Zweig eins und der Zweig im Zweig, aus dem zusammengeführt werden soll).
Führen Sie den folgenden Befehl aus, um die verschiedenen unterstützten Diff-Tools anzuzeigen.
$ git mergetool --tool-help
Nun beginnen wir mit dem Beispiel, um zu zeigen, wie Konflikte gelöst werden können. Nehmen wir an, wir haben zwei Zweige wie folgt.
$ git branch
* main
feature1
Der erste Zweig ist der main
-Zweig und der zweite ist ein Feature-Entwicklungs-Zweig namens feature1
.
Wir haben eine README.md
-Datei mit folgendem Inhalt im main
-Zweig.
$ cat README.md
# Upwork
Upwork projects
Wie oben gezeigt, befinden wir uns aktuell in der main
-Zweig. Dann wechseln wir in den Zweig feature1
.
$ git checkout feature1
Switched to branch 'feature1'
$ git branch
main
* feature1
Wir aktualisieren die README.md
und drucken ihren Inhalt wie folgt.
$ cat README.md
This is conflicting branch line.
Jetzt werden wir den Zweig main
mit dem Zweig feature1
zusammenführen, um die neuesten Änderungen in diesem Zweig zu erhalten.
Beim Zusammenführen zeigt Git die Zusammenführungskonflikte wie folgt an.
$ git merge main
Auto-merging README.md
CONFLICT (add/add): Merge conflict in README.md
Automatic merge failed; fix conflicts and then commit the result.
Weitere Informationen zum Konflikt können wir wie folgt erhalten.
$ git status
On branch feature1
You have unmerged paths.
(fix conflicts and run "git commit")
Unmerged paths:
(use "git add <file>..." to mark resolution)
both added: README.md
no changes added to commit (use "git add" and/or "git commit -a")
Wir werden nun den Inhalt der Datei README.md
drucken, die den Konflikt enthält.
$ cat README.md
<<<<<<< HEAD
This is conflicting branch line.
||||||| merged common ancestors
=======
# Upwork
Upwork projects
>>>>>>> main
Die Datei zeigt nun verschiedene Symbole an.
Und die Symbole <<<<<<<
gefolgt von HEAD
sind ein Alias für den aktuellen Zweig. Dies zeigt den Beginn der Bearbeitungen in diesem Abschnitt an.
Die Symbole =======
zeigen das Ende der Revisionen innerhalb des aktuellen Zweiges und den Beginn der Bearbeitungen innerhalb eines neuen.
Die Symbole >>>>>>>
gefolgt vom Namen der entfernten Zweigstelle, nämlich main
zeigt an, wo der Zusammenführungsversuch stattgefunden hat.
Jetzt werden wir mergetool
verwenden, um die Konflikte zu lösen.
$ git mergetool
Merging:
README.md
Normal merge conflict for 'README.md':
{local}: created file
{remote}: created file
Dadurch wird meld
gestartet (da wir dies als Standard-Diff-Tool festgelegt haben). Bitte sehen Sie sich das Bild unten an.
Der linke Bereich zeigt die Änderungen an der Datei README.md
, die in der lokalen Zweig vorgenommen wurden. Der mittlere Bereich enthält das Ergebnis der Änderungen, die zur Lösung des Konflikts vorgenommen wurden. Der rechte Bereich zeigt die Änderungen, die in der Remote-Zweig-Viz vorgenommen wurden. main
(d.h.) der Zweig, den wir zusammenführen möchten.
Wir können wählen, ob wir sowohl die lokalen als auch die Remote-Änderungen oder eine von beiden beibehalten möchten. Wir werden uns dafür entscheiden, die Remote-Zweigänderungen wie folgt beizubehalten.
Anschliessend speichern und verlassen wir das Tool meld
.
Wir drucken die Datei README.md
und sehen das Update.
$ cat README.md
# Upwork
Upwork projects
Wir werden die Änderungen nun in Git übertragen.
$ git commit -m "merged from main"
[feature1 3c39d7b] merged from main
Wir werden nun den Befehl git diff
ausführen, um nach Konflikten zwischen den Zweigen feature1
und main
zu suchen.
$ git diff feature1 main
Wir prüfen den Status des Zweiges feature1
.
$ git status
On branch feature1
Untracked files:
(use "git add <file>..." to include in what will be committed)
README.md.orig
Es zeigt eine Datei, README.md.orig
, die vom mergetool
beim Zusammenführen erstellt wurde.
Führen Sie den folgenden Befehl aus, um es zu entfernen:
$ git clean -f
So haben wir Konflikte beim Zusammenführen zweier Branches mit dem mergetool
von Git erfolgreich gelöst.