Ich möchte Zusammenführungskonflikte in meinem Git-Repository auflösen.
Wie kann ich das tun?
Ich möchte Zusammenführungskonflikte in meinem Git-Repository auflösen.
Wie kann ich das tun?
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
Probieren Sie auch die Option "-m" für "git checkout -m" aus - damit können Sie die verschiedenen Fliegen wieder in Ihren Arbeitsbereich extrahieren
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.
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).
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
git mergetool
git add <filename>
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.
参照 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. verwendengit 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 derHEAD
etMERGE_HEAD
Versionen.Sehen Sie sich die Diffs der einzelnen Zweige an.
git log --merge -p <path>
zeigt die Diffs zuerst für dieHEAD
Version und dann dieMERGE_HEAD
Version.Sehen Sie sich die Originale an.
git show :1:filename
zeigt den gemeinsamen Vorfahren,git show :2:filename
zeigt dieHEAD
Version, undgit show :3:filename
zeigt dieMERGE_HEAD
Version.
Sie können sich auch über Zusammenführungskonfliktmarkierungen und deren Lösung im Pro Git Buchbereich Grundlegende Zusammenführungskonflikte .
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 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.
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!
3 Stimmen
Siehe auch git-tower.com/learn/git/ebook/command-line/tools-services/
0 Stimmen
Dies scheint eine detaillierte Anleitung zu sein - githubtraining.com/fix-merge-conflict-git-using-sourcetree
0 Stimmen
Das ist nicht spezifisch für diese Frage, aber ich musste irgendwo sagen, dass der Begriff "Konflikt" in der gängigen Sprache für Versionskontrollsysteme (VCS) sehr schlecht gewählt ist. Was wir in VCS als Konflikt bezeichnen, ist etwas völlig anderes als das, was wir normalerweise als Konflikt im wirklichen Leben sehen. Nehmen wir an, wir haben einen Autounfall. Der eine Fahrer sagt: "Oh, ich habe Sie nicht gesehen". Der andere sagt: "Ok, wir können das reparieren". Das ist überhaupt kein Konflikt. Der Konflikt kann erst danach auftreten. In VCS ist es genau umgekehrt: Die einfache Kollision wird als Konflikt bezeichnet, eine Änderung, die bewusst eine bekannte Änderung rückgängig macht, kann nicht einmal ein Konflikt sein.
0 Stimmen
Eine Reaktion auf meinen vorherigen Kommentar könnte lauten: "Wir wissen, dass es bei einem Git-Konflikt keinen wirklichen Konflikt gibt", aber es steckt mehr dahinter. Wenn Programmierer im Team arbeiten, gibt es Meinungsverschiedenheiten. Es kann vorkommen, dass ein Programmierer bewusst rückgängig macht, was ein anderer getan hat, und das käme einem echten Konflikt näher, aber Git-Konflikte haben nichts mit diesem Prozess zu tun. Wie auch immer, ich denke, der Begriff "Kollision" oder "Unfall" anstelle von "Konflikt" wäre näher an dem, was es tatsächlich ist, denn es passiert, wenn beide Seiten die andere Seite nicht kommen sehen.
0 Stimmen
Eine Nischenfrage zur Lösung eines Konflikts in nur einer Datei, von der Kommandozeile aus, unter Verwendung der dreifachen Zusammenführung mit einer bestimmten Strategie: stackoverflow.com/q/39126509/245966
0 Stimmen
Github.com bietet eine gute Möglichkeit, das Problem zu visualisieren. Stellen Sie sicher, dass Sie sehen este Antwort. (Es gibt auch Möglichkeiten, direkt von der Website aus zu bearbeiten und zu lösen, aber das ist nur eine Bequemlichkeit).
0 Stimmen
gist.github.com/karenyyng/f19ff75c60f18b4b8149 . Dieses Git-Mergetool-Tutorial könnte helfen.