5329 Stimmen

Wie löse ich Zusammenführungskonflikte in einem Git-Repository?

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

Wie kann ich das tun?

40 Stimmen

Der folgende Blog-Beitrag enthält ein sehr gutes Beispiel für den Umgang mit Merge-Konflikten mit Git, das Sie auf den richtigen Weg bringen sollte. Umgang mit und Vermeidung von Konflikten in Git

4 Stimmen

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

0 Stimmen

Vergessen Sie nicht, dass Sie die meisten Merge-Konflikte durch regelmäßiges Merging Downstream entschärfen können!

111voto

Pat Notz Punkte 196406

Sehen Sie sich die Antworten in der Stack Overflow-Frage an Abbrechen einer Zusammenführung in Git insbesondere Charles Baileys Antwort die zeigt, wie die verschiedenen Versionen der Datei mit Problemen angezeigt werden können, zum Beispiel,

# 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

0 Stimmen

Probieren Sie auch die Option "-m" für "git checkout -m" aus - damit können Sie die verschiedenen Fliegen wieder in Ihren Arbeitsbereich extrahieren

0 Stimmen

Das hat mich gerettet. Indem ich mir jede Datei einzeln ansah, konnte ich mich daran erinnern, was ich in jedem Zweig wollte. Dann konnte ich die Entscheidung treffen, was ich wollte.

82voto

Paul Punkte 16115

Wenn Sie häufig kleine Commits machen, dann schauen Sie sich zunächst die Commit-Kommentare mit git log --merge . Dann git diff wird Ihnen die Konflikte aufzeigen.

Bei Konflikten, die mehr als ein paar Zeilen umfassen, ist es einfacher, mit einem externen GUI-Tool zu sehen, was vor sich geht. Ich mag opendiff -- Git unterstützt auch vimdiff, gvimdiff, kdiff3, tkdiff, meld, xxdiff, emerge out of the box und Sie können andere installieren: git config merge.tool "your.tool" wird das von Ihnen gewählte Werkzeug einstellen und dann git mergetool nach einer fehlgeschlagenen Zusammenführung zeigt Ihnen die Unterschiede im Kontext an.

Jedes Mal, wenn Sie eine Datei bearbeiten, um einen Konflikt zu lösen, git add filename wird der Index aktualisiert, und Ihr Diff wird ihn nicht mehr anzeigen. Wenn alle Konflikte bearbeitet sind und die Dateien git add -ed, git commit wird Ihre Zusammenführung abschließen.

8 Stimmen

Die Verwendung von "git add" ist hier der eigentliche Trick. Vielleicht wollen Sie gar nicht committen (vielleicht wollen Sie stashen), aber Sie müssen "git add" verwenden, um die Zusammenführung abzuschließen. Ich glaube, mergetool erledigt das Hinzufügen für Sie (obwohl es nicht in der Manpage steht), aber wenn Sie den Merge manuell durchführen, müssen Sie "git add" verwenden, um ihn abzuschließen (auch wenn Sie nicht committen wollen).

60voto

Noidea Punkte 1335

Ich möchte entweder meine oder ihre Version in vollem Umfang, oder ich möchte einzelne Änderungen überprüfen und für jeden von ihnen entscheiden.

Meine oder ihre Version vollständig akzeptieren :

Akzeptieren Sie meine Version (lokal, unsere):

git checkout --ours -- <filename>
git add <filename>              # Marks conflict as resolved
git commit -m "merged bla bla"  # An "empty" commit

Akzeptieren Sie ihre Version (remote, ihre):

git checkout --theirs -- <filename>
git add <filename>
git commit -m "merged bla bla"

Wenn Sie Folgendes tun möchten für alle Konfliktdateien laufen:

git merge --strategy-option ours

o

git merge --strategy-option theirs

Überprüfen Sie alle Änderungen und akzeptieren Sie sie einzeln

  1. git mergetool
  2. Überprüfen Sie die Änderungen und akzeptieren Sie eine der beiden Versionen für jede von ihnen.
  3. git add <filename>
  4. git commit -m "merged bla bla"

Standard mergetool arbeitet in Kommandozeile . Wie man ein Kommandozeilen-Mergetool verwendet, sollte eine separate Frage sein.

Sie können auch Folgendes installieren visuelles Werkzeug für diese, z.B. meld und laufen

git mergetool -t meld

Es werden die lokale Version (unsere), die "Basis"- oder "zusammengeführte" Version (das aktuelle Ergebnis der Zusammenführung) und die Remote-Version (ihre) geöffnet. Speichern Sie die zusammengeführte Version, wenn Sie fertig sind, führen Sie git mergetool -t meld erneut, bis Sie die Meldung "Keine Dateien müssen zusammengeführt werden" erhalten, und fahren Sie dann mit den Schritten 3. und 4. fort.

50voto

参照 Wie die Konflikte dargestellt werden oder, in Git, die git merge Dokumentation, um zu verstehen, was Merge-Konfliktmarker sind.

Auch die Wie man Konflikte löst wird erklärt, wie die Konflikte gelöst werden können:

Wenn Sie einen Konflikt sehen, können Sie zwei Dinge tun:

  • Beschließen Sie, nicht zu fusionieren. Die einzigen Bereinigungen, die Sie brauchen, sind das Zurücksetzen der Indexdatei auf die HEAD commit, um 2. rückgängig zu machen und um die Änderungen im Arbeitsbaum, die durch 2. und 3. vorgenommen wurden, zu bereinigen; git merge --abort kann hierfür verwendet werden.

  • Lösen Sie die Konflikte. Git wird die Konflikte im Arbeitsbaum markieren. Bearbeiten Sie die Dateien in Form und git add sie auf den Index. verwenden git commit um das Geschäft zu besiegeln.

Sie können den Konflikt mit einer Reihe von Instrumenten bearbeiten:

  • Verwenden Sie ein Mergetool. git mergetool um ein grafisches Zusammenführungstool zu starten, das Sie durch die Zusammenführung führt.

  • Sehen Sie sich die Diffs an. git diff zeigt einen Drei-Wege-Vergleich an, der die Änderungen sowohl in der HEAD et MERGE_HEAD Versionen.

  • Sehen Sie sich die Diffs der einzelnen Zweige an. git log --merge -p <path> zeigt die Diffs zuerst für die HEAD Version und dann die MERGE_HEAD Version.

  • Sehen Sie sich die Originale an. git show :1:filename zeigt den gemeinsamen Vorfahren, git show :2:filename zeigt die HEAD Version, und git show :3:filename zeigt die MERGE_HEAD Version.

Sie können sich auch über Zusammenführungskonfliktmarkierungen und deren Lösung im Pro Git Buchbereich Grundlegende Zusammenführungskonflikte .

42voto

eci Punkte 2134

Für Emacs Benutzer, die Zusammenführungskonflikte halb-manuell auflösen wollen:

git diff --name-status --diff-filter=U

zeigt alle Dateien an, die eine Konfliktlösung erfordern.

Öffnen Sie jede dieser Dateien einzeln oder alle auf einmal durch:

emacs $(git diff --name-only --diff-filter=U)

Wenn Sie einen Puffer besuchen, der in Emacs bearbeitet werden muss, geben Sie

ALT+x vc-resolve-conflicts

Dadurch werden drei Puffer geöffnet (meiner, ihrer und der Ausgabepuffer). Navigieren Sie durch Drücken von 'n' (nächste Region), 'p' (vorherige Region). Drücken Sie 'a' und 'b', um meine bzw. ihre Region in den Ausgabepuffer zu kopieren. Und / oder bearbeiten Sie den Ausgabepuffer direkt.

Wenn Sie fertig sind: Drücken Sie 'q'. Emacs fragt Sie, ob Sie diesen Puffer speichern wollen: ja. Nach Beendigung eines Puffers markieren Sie ihn als aufgelöst, indem Sie ihn vom Teriminal aus ausführen:

git add FILENAME

Wenn Sie mit allen Puffern fertig sind, geben Sie

git commit

um die Zusammenführung zu beenden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X