Auflösen von Merge-Konflikten in Git

Azhar Bashir Khan 25 Dezember 2021
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.

git-mergetool-meld1

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.

git-mergetool-meld2

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.

Verwandter Artikel - Git Merge