Wie löst man Zusammenführungskonflikte in einem Git-Repository?

Lesezeit: 11 Minuten

Wie lost man Zusammenfuhrungskonflikte in einem Git Repository
Sprich

Ich möchte Zusammenführungskonflikte in meinem lösen Git Repository.

Wie kann ich das machen?

  • Der folgende Blogbeitrag scheint ein sehr gutes Beispiel für den Umgang mit Merge-Konflikten mit Git zu geben, das Sie in die richtige Richtung bringen sollte. Handhabung und Vermeidung von Konflikten in Git

    – mwilliams

    2. Oktober 2008 um 11:40 Uhr

  • Sie können ein Zusammenführungstool konfigurieren (kdiff3 jebaird.com/2013/07/08/…) und dann git mergetool verwenden. Wenn Sie in großen Entwicklerteams arbeiten, werden Sie immer wieder auf Zusammenführungskonflikte stoßen.

    – Grady G. Cooper

    18. April 2015 um 5:37 Uhr

  • Vergessen Sie nicht, dass Sie die meisten Zusammenführungskonflikte entschärfen können, indem Sie regelmäßig nachgelagert zusammenführen!

    – Ameise P

    27. Juli 2015 um 9:50 Uhr

  • Siehe auch git-tower.com/learn/git/ebook/command-line/tools-services/…

    – Schrittmacher

    20. Oktober 2015 um 11:19 Uhr


  • Dies scheint ein detailliertes Tutorial zu sein – githubtraining.com/fix-merge-conflict-git-using-sourcetree

    – Rajavanya Subramanyan

    27. Dezember 2015 um 8:29 Uhr

1646915293 677 Wie lost man Zusammenfuhrungskonflikte in einem Git Repository
coolaj86

Hier ist ein wahrscheinlicher Anwendungsfall von oben:

Sie werden einige Änderungen vornehmen, aber hoppla, Sie sind nicht auf dem neuesten Stand:

git fetch origin
git pull origin master

From ssh://[email protected]:22/projectname
 * branch            master     -> FETCH_HEAD
Updating a030c3a..ee25213
error: Entry 'filename.c' not uptodate. Cannot merge.

Sie aktualisieren sich also und versuchen es erneut, haben aber einen Konflikt:

git add filename.c
git commit -m "made some wild and crazy changes"
git pull origin master

From ssh://[email protected]:22/projectname
 * branch            master     -> FETCH_HEAD
Auto-merging filename.c
CONFLICT (content): Merge conflict in filename.c
Automatic merge failed; fix conflicts and then commit the result.

Sie entscheiden sich also, einen Blick auf die Änderungen zu werfen:

git mergetool

Oh je, oh je, Upstream hat einige Dinge geändert, aber nur um meine Änderungen zu verwenden … nein … ihre Änderungen …

git checkout --ours filename.c
git checkout --theirs filename.c
git add filename.c
git commit -m "using theirs"

Und dann versuchen wir es ein letztes Mal

git pull origin master

From ssh://[email protected]:22/projectname
 * branch            master     -> FETCH_HEAD
Already up-to-date.

Ta-da!

  • Das war super hilfreich, weil ich viele Zusammenführungsfehler mit Binärdateien (Art-Assets) hatte und das Zusammenführen dieser Dateien immer fehlschlägt, also muss ich sie immer mit der neuen Datei überschreiben und nicht “zusammenführen”.

    – Petrorakete

    8. Juni 2011 um 17:39 Uhr

  • Vorsichtig! Die Bedeutung von –ours und –theirs ist umgekehrt. –ours == die Fernbedienung. –ihre == lokal. Sehen git merge --help

    – hmmm

    4. März 2013 um 22:56 Uhr


  • In meinem Fall bestätige ich, dass –theirs = entferntes Repository, –ours = mein eigenes lokales Repository. Es ist das Gegenteil von @mmell-Kommentaren.

    – Arjo

    22. Juni 2013 um 12:59 Uhr

  • @mmell Anscheinend nur auf einer Rebase. Sehen this question

    – Navin

    10. November 2013 um 6:19 Uhr


  • Leute, “unsere” und “ihre” hängt davon ab, ob Sie fusionieren oder rebasen. Wenn du bist verschmelzendann bedeutet „unser“ den Zweig, in den Sie zusammenführen, und „ihr“ ist der Zweig, in den Sie zusammenführen umbasierendann bedeutet „unsere“ die Commits, auf die Sie rebasen, während sich „ihre“ auf die Commits bezieht, die Sie rebasen möchten.

    Benutzer456814

    26. Mai 2014 um 4:27 Uhr

  • Die diff3-Option ist ein großartiges Feature für Zusammenführungen. Die einzige GUI, auf die ich gestoßen bin, die zeigt, dass es die von Perforce ist p4mergedas separat von den anderen Tools von Perforce installiert und verwendet werden kann (die ich nicht verwendet habe, aber Beschwerden darüber gehört habe).

    – alxndr

    1. Mai 2014 um 22:15 Uhr

  • Nach einem Rebase-Versuch, der zu einem Merge-Konflikt führte: $ git log –merge -p build.xml output: fatal: –merge without MERGE_HEAD?

    – Ed Randall

    17. Juni 2016 um 9:15 Uhr


  • git config merge.conflictstyle diff3 – Danke mein Herr. Das ist tolle und hat mich davon befreit, eine gute 3-Wege-Merge-GUI zu finden (und $$ zu bezahlen). IMO ist das besser, weil es den gemeinsamen Vorfahren sowie lokal/entfernt zeigt, und zeigt die letzten Commit-Log-Zeilen, was (AFAIK) keine GUI tut. Die Commits helfen Ihnen definitiv dabei, zu identifizieren, welcher Code zu welchem ​​Zweig gehört.

    – ffxsam

    4. April 2017 um 16:00 Uhr

  • Ich habe festgestellt, dass der diff3-Konfliktstil manchmal zu enormen Diff-Hunks führt, die weitgehend identisch sind, während die Standardeinstellung kleinere, überschaubarere Hunks erzeugt. Leider habe ich keinen Reproduzierer, den ich für einen Fehlerbericht verwenden könnte. Aber wenn Sie auf dieses Problem stoßen, sollten Sie die Option vorübergehend deaktivieren.

    – Dave Abrahams

    2. Juli 2017 um 3:31 Uhr

  • Big +1 für die Empfehlung diff3. Der Standardkonfliktstil macht es buchstäblich unmöglich, einige Konflikte zu lösen. Weitere Informationen finden Sie unter stackoverflow.com/questions/27417656/…

    – Tom Ellis

    24. September 2020 um 11:14 Uhr

1646915293 331 Wie lost man Zusammenfuhrungskonflikte in einem Git Repository
davetron5000

  1. Identifizieren Sie, welche Dateien in Konflikt stehen (Git sollte Ihnen dies mitteilen).

  2. Öffnen Sie jede Datei und untersuchen Sie die Unterschiede; Git grenzt sie ab. Hoffentlich ist es offensichtlich, welche Version jedes Blocks zu behalten ist. Möglicherweise müssen Sie dies mit anderen Entwicklern besprechen, die den Code übernommen haben.

  3. Sobald Sie den Konflikt in einer Datei gelöst haben git add the_file.

  4. Sobald Sie sich entschieden haben alle Konflikte, tun git rebase --continue oder welchen Befehl Git auch immer ausführen soll, wenn Sie fertig sind.

  • @Justin Stellen Sie sich Git als Tracking vor Inhalt anstatt Dateien zu verfolgen. Dann ist es leicht zu sehen, dass Sie den Inhalt aktualisiert haben ist nicht im Repository und muss hinzugefügt werden. Diese Denkweise erklärt auch, warum Git leere Ordner nicht verfolgt: Obwohl es sich technisch gesehen um Dateien handelt, gibt es keinen zu verfolgenden Inhalt.

    – Gareth

    12. Oktober 2010 um 9:17 Uhr

  • Inhalt vorhanden ist, tritt ein Konflikt auf, weil es 2 Versionen des Inhalts gibt. Daher klingt “git add” nicht korrekt. Und es funktioniert nicht (git add, git commit), wenn Sie nur diese eine Datei übergeben möchten, nachdem der Konflikt gelöst wurde (“fatal: kann während einer Zusammenführung keinen Teil-Commit durchführen.”)

    – Dainius

    14. September 2011 um 9:19 Uhr

  • Ja, technisch gesehen beantwortet dies die gestellte Frage, ist aber meiner Meinung nach keine brauchbare Antwort, sorry. Was ist das Punkt einen Zweig dem anderen gleich zu machen? Natürlich wird es bei einer Zusammenführung Konflikte geben.

    – Thufir

    9. August 2012 um 5:56 Uhr

  • Thulfir: Wer hat etwas darüber gesagt, einen Zweig dem anderen gleich zu machen? Es gibt verschiedene Szenarien, in denen Sie zusammenführen müssen, ohne “einen Zweig dem anderen gleich zu machen”. Einer ist, wenn Sie mit einem Entwicklungszweig fertig sind und seine Änderungen in den Master-Zweig integrieren möchten; Danach kann der Entwicklungszweig gelöscht werden. Eine andere ist, wenn Sie Ihren Entwicklungszweig rebasieren möchten, um die eventuelle endgültige Zusammenführung mit dem Master zu erleichtern.

    – Teemu Leisti

    21. September 2012 um 8:50 Uhr


  • @JustinGrant git add stellt Dateien im Index bereit; es tut nicht etwas zum Repository hinzufügen. git commit fügt dem Repository Dinge hinzu. Diese Verwendung ist für Zusammenführungen sinnvoll – die Zusammenführung stellt automatisch alle Änderungen bereit, die automatisch zusammengeführt werden können; Es liegt in Ihrer Verantwortung, die restlichen Änderungen zusammenzuführen und diese dem Index hinzuzufügen, wenn Sie fertig sind.

    – Mark E. Haase

    17. Oktober 2012 um 15:13 Uhr


Zusammenführungskonflikte treten auf, wenn gleichzeitig Änderungen an einer Datei vorgenommen werden. Hier ist, wie man es löst.

git CLI

Hier sind einfache Schritte, was zu tun ist, wenn Sie in einen Konfliktzustand geraten:

  1. Beachten Sie die Liste der Konfliktdateien mit: git status (unter Unmerged paths Sektion).
  2. Lösen Sie die Konflikte separat für jede Datei mit einem der folgenden Ansätze:

    • Verwenden Sie die GUI, um die Konflikte zu lösen: git mergetool (der einfachste Weg).

    • Um die entfernte/andere Version zu akzeptieren, verwenden Sie: git checkout --theirs path/file. Dadurch werden alle lokalen Änderungen verworfen, die Sie für diese Datei vorgenommen haben.

    • Um die lokale/unsere Version zu akzeptieren, verwenden Sie: git checkout --ours path/file

      Sie müssen jedoch vorsichtig sein, da Remote-Änderungen aus irgendeinem Grund zu Konflikten führen.

      Verwandte: Was ist die genaue Bedeutung von „unser“ und „ihr“ in git?

    • Bearbeiten Sie die in Konflikt stehenden Dateien manuell und suchen Sie nach dem Codeblock dazwischen <<<<</>>>>> Wählen Sie dann die Version entweder oben oder unten aus =====. Sehen: Wie Konflikte dargestellt werden.

    • Pfad- und Dateinamenkonflikte können gelöst werden durch git add/git rm.

  3. Überprüfen Sie schließlich die Dateien, die zum Übertragen bereit sind, mit: git status.

    Wenn Sie noch Dateien unter haben Unmerged pathsund Sie haben den Konflikt manuell gelöst, dann lassen Sie Git wissen, dass Sie ihn gelöst haben, indem Sie: git add path/file.

  4. Wenn alle Konflikte erfolgreich gelöst wurden, übertragen Sie die Änderungen wie folgt: git commit -a und drücken Sie wie gewohnt auf die Fernbedienung.

Siehe auch: Lösen eines Zusammenführungskonflikts über die Befehlszeile bei GitHub

Für ein praktisches Tutorial siehe: Szenario 5 – Behebung von Zusammenführungskonflikten durch Katacoda.

DiffMerge

habe ich erfolgreich eingesetzt DiffMerge die Dateien unter Windows, macOS und Linux/Unix visuell vergleichen und zusammenführen kann.

Es kann die Änderungen zwischen 3 Dateien grafisch darstellen und ermöglicht das automatische Zusammenführen (wenn dies sicher möglich ist) und die volle Kontrolle über die Bearbeitung der resultierenden Datei.

DiffMerge

Bildquelle: DiffMerge (Linux-Screenshot)

Laden Sie es einfach herunter und führen Sie es im Repo aus als:

git mergetool -t diffmerge .

Mac OS

Unter macOS können Sie installieren über:

brew install caskroom/cask/brew-cask
brew cask install diffmerge

Und wahrscheinlich (falls nicht vorhanden) benötigen Sie den folgenden zusätzlichen einfachen Wrapper, der in Ihrem PATH platziert wird (z /usr/bin):

#!/bin/sh
DIFFMERGE_PATH=/Applications/DiffMerge.app
DIFFMERGE_EXE=${DIFFMERGE_PATH}/Contents/MacOS/DiffMerge
exec ${DIFFMERGE_EXE} --nosplash "[email protected]"

Dann können Sie die folgenden Tastenkombinationen verwenden:

  • AltHoch/Runter um zu vorherigen/nächsten Änderungen zu springen.
  • AltLinks/Rechts Wechsel von links oder rechts zu akzeptieren

Alternativ können Sie verwenden offendiff (Teil von Xcode Tools), mit dem Sie zwei Dateien oder Verzeichnisse zusammenführen können, um eine dritte Datei oder ein drittes Verzeichnis zu erstellen.

  • @Justin Stellen Sie sich Git als Tracking vor Inhalt anstatt Dateien zu verfolgen. Dann ist es leicht zu sehen, dass Sie den Inhalt aktualisiert haben ist nicht im Repository und muss hinzugefügt werden. Diese Denkweise erklärt auch, warum Git leere Ordner nicht verfolgt: Obwohl es sich technisch gesehen um Dateien handelt, gibt es keinen zu verfolgenden Inhalt.

    – Gareth

    12. Oktober 2010 um 9:17 Uhr

  • Inhalt vorhanden ist, tritt ein Konflikt auf, weil es 2 Versionen des Inhalts gibt. Daher klingt “git add” nicht korrekt. Und es funktioniert nicht (git add, git commit), wenn Sie nur diese eine Datei übergeben möchten, nachdem der Konflikt gelöst wurde (“fatal: kann während einer Zusammenführung keinen Teil-Commit durchführen.”)

    – Dainius

    14. September 2011 um 9:19 Uhr

  • Ja, technisch gesehen beantwortet dies die gestellte Frage, ist aber meiner Meinung nach keine brauchbare Antwort, sorry. Was ist das Punkt einen Zweig dem anderen gleich zu machen? Natürlich wird es bei einer Zusammenführung Konflikte geben.

    – Thufir

    9. August 2012 um 5:56 Uhr

  • Thulfir: Wer hat etwas darüber gesagt, einen Zweig dem anderen gleich zu machen? Es gibt verschiedene Szenarien, in denen Sie zusammenführen müssen, ohne “einen Zweig dem anderen gleich zu machen”. Einer ist, wenn Sie mit einem Entwicklungszweig fertig sind und seine Änderungen in den Master-Zweig integrieren möchten; Danach kann der Entwicklungszweig gelöscht werden. Eine andere ist, wenn Sie Ihren Entwicklungszweig rebasieren möchten, um die eventuelle endgültige Zusammenführung mit dem Master zu erleichtern.

    – Teemu Leisti

    21. September 2012 um 8:50 Uhr


  • @JustinGrant git add stellt Dateien im Index bereit; es tut nicht etwas zum Repository hinzufügen. git commit fügt dem Repository Dinge hinzu. Diese Verwendung ist für Zusammenführungen sinnvoll – die Zusammenführung stellt automatisch alle Änderungen bereit, die automatisch zusammengeführt werden können; Es liegt in Ihrer Verantwortung, die restlichen Änderungen zusammenzuführen und diese dem Index hinzuzufügen, wenn Sie fertig sind.

    – Mark E. Haase

    17. Oktober 2012 um 15:13 Uhr


1646915293 927 Wie lost man Zusammenfuhrungskonflikte in einem Git Repository
Gemeinschaft

Sehen Sie sich die Antworten in der Stack Overflow-Frage an Abbrechen einer Zusammenführung in Gitinsbesondere die Antwort von Charles Bailey, die zeigt, wie die verschiedenen Versionen der Datei mit Problemen angezeigt werden, z. B.

# Common base version of the file.
git show :1:some_file.cpp

# 'Ours' version of the file.
git show :2:some_file.cpp

# 'Theirs' version of the file.
git show :3:some_file.cpp

  • Sehen Sie sich auch die Option “-m” für “git checkout -m” an – sie ermöglicht es Ihnen, die verschiedenen Fliegen wieder in Ihren Arbeitsbereich zu extrahieren

    – qneill

    5. Februar 2015 um 22:06 Uhr

  • Das hat mich gerettet. Wenn ich mir jede Datei einzeln ansah, konnte ich mich daran erinnern, was ich in jedem Zweig vorhatte. Dann könnte ich die Entscheidung treffen, mich zu entscheiden.

    – Rohmer

    14. Mai 2016 um 21:59 Uhr

987910cookie-checkWie löst man Zusammenführungskonflikte in einem Git-Repository?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy