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?
Sie können Zusammenführungskonflikte auf verschiedene Arten beheben, wie andere bereits beschrieben haben.
Ich denke, der eigentliche Schlüssel liegt darin, zu wissen, wie Änderungen in lokalen und entfernten Repositories ablaufen. Der Schlüssel dazu ist das Verständnis der Tracking-Zweige. Ich habe festgestellt, dass ich den Tracking-Zweig als das "fehlende Stück in der Mitte" zwischen meinem lokalen, eigentlichen Dateiverzeichnis und dem als Ursprung definierten Remote-Repository betrachte.
Ich persönlich habe mir 2 Dinge angewöhnt, um dies zu vermeiden.
Anstelle von:
git add .
git commit -m"some msg"
Das hat zwei Nachteile -
a) Alle neuen/geänderten Dateien werden hinzugefügt, und das kann einige unerwünschte Änderungen beinhalten.
b) Sie können die Dateiliste nicht vorher einsehen.
Also mache ich es stattdessen:
git add file,file2,file3...
git commit # Then type the files in the editor and save-quit.
Auf diese Weise kann man bewusster entscheiden, welche Dateien hinzugefügt werden, und man kann sich die Liste ansehen und ein bisschen mehr nachdenken, während man den Editor für die Nachricht benutzt. Ich finde auch, dass es meine Commit-Nachrichten verbessert, wenn ich einen Vollbild-Editor benutze, anstatt den -m
Option.
[Update - im Laufe der Zeit bin ich mehr dazu übergegangen:
git status # Make sure I know whats going on
git add .
git commit # Then use the editor
]
Außerdem (und das ist für Ihre Situation wichtiger) versuche ich es zu vermeiden:
git pull
o
git pull origin master.
weil "pull" eine Zusammenführung impliziert und wenn Sie lokal Änderungen haben, die Sie nicht zusammenführen wollten, können Sie leicht mit zusammengeführtem Code und/oder Konflikten bei der Zusammenführung von Code enden, der nicht hätte zusammengeführt werden sollen.
Stattdessen versuche ich zu tun
git checkout master
git fetch
git rebase --hard origin/master # or whatever branch I want.
Vielleicht finden Sie auch dies hilfreich:
git branch, fork, fetch, merge, rebase und clone, was sind die Unterschiede?
Hey, ich habe deine Antwort irgendwie verstanden. Aber da ich neu in Github Merge-Konflikte bin, denke ich, dass es etwas fehlt. Was passiert mit deinen lokalen Änderungen, wenn du git checkout master
y git fetch
y git rebase --hard origin/master
Ich glaube, Sie sollten mehr Details hinzufügen, was zu tun ist. Ein weiteres Beispiel, das mich verwirrt, haben Sie in Ihrer Antwort erwähnt: Wir machen git add .
werden unsere lokalen Änderungen gespeichert, so dass wir sie mit git checkout master
? oder handelt es sich um zwei verschiedene Szenarien?
@MichaelDurrant $ git rebase --hard origin/master b5a30cc159ba8dd error: unknown option
hard' usage: git rebase [-i] [options] [--exec <cmd>] [--onto <newbase>] [<upstream>] [<branch>] or: git rebase [-i] [options] [--exec <cmd>] [--onto <newbase>] --Root [<branch>] or: git rebase --continue | --abort | --skip | --edit-todo `
Wenn Sie von einem Zweig aus zusammenführen wollen test
à master
können Sie die folgenden Schritte ausführen:
Schritt 1 : Gehen Sie in die Filiale
git checkout test
Schritt 2 :
git pull --rebase origin master
Schritt 3 : Wenn es Konflikte gibt, gehen Sie zu diesen Dateien, um sie zu ändern.
Schritt 4 : Diese Änderungen hinzufügen
git add #your_changes_files
Schritt 5 :
git rebase --continue
Schritt 6 : Wenn es immer noch einen Konflikt gibt, gehen Sie noch einmal zu Schritt 3 zurück. Wenn es keinen Konflikt gibt, gehen Sie wie folgt vor:
git push origin +test
Schritt 7 : Und dann gibt es keinen Konflikt zwischen Test und Master. Sie können direkt merge verwenden.
patience
Bei einem großen Zusammenführungskonflikt ist die Verwendung von patience
hat für mich gute Ergebnisse gebracht. Es wird versucht, eher Blöcke als einzelne Zeilen abzugleichen.
Wenn Sie z.B. die Einrückung Ihres Programms ändern, passt die Standard-Merge-Strategie von Git manchmal zu einzelnen Klammern {
die zu verschiedenen Funktionen gehören. Dies wird vermieden mit patience
:
git merge -s recursive -X patience other-branch
Aus der Dokumentation:
With this option, merge-recursive spends a little extra time to avoid
mismerges that sometimes occur due to unimportant matching lines
(e.g., braces from distinct functions). Use this when the branches to
be merged have diverged wildly.
Wenn Sie einen Zusammenführungskonflikt haben und sehen wollen, was die anderen bei der Änderung ihres Zweiges im Sinn hatten, ist es manchmal einfacher, ihren Zweig direkt mit dem gemeinsamen Vorgänger zu vergleichen (statt mit unserem Zweig). Dafür können Sie verwenden merge-base
:
git diff $(git merge-base <our-branch> <their-branch>) <their-branch>
Normalerweise wollen Sie nur die Änderungen für eine bestimmte Datei sehen:
git diff $(git merge-base <our-branch> <their-branch>) <their-branch> <file>
git log --merge -p [[--] path]
Das scheint bei mir nicht immer zu funktionieren und endet in der Regel damit, dass jede Übergabe angezeigt wird, die sich zwischen den beiden Zweigen unterscheidet, und zwar auch dann, wenn ich --
um den Pfad vom Befehl zu trennen.
Um dieses Problem zu umgehen, öffne ich zwei Befehlszeilen und führe in einer davon Folgendes aus
git log ..$MERGED_IN_BRANCH --pretty=full -p [path]
und in der anderen
git log $MERGED_IN_BRANCH.. --pretty=full -p [path]
Ersetzen von $MERGED_IN_BRANCH
mit dem Zweig, den ich eingebunden habe, und [path]
mit der Datei, die im Konflikt steht. Dieser Befehl protokolliert alle Übertragungen in Form von Patches, die zwischen ( ..
) zwei Übertragungen. Wenn Sie eine Seite leer lassen, wie in den obigen Befehlen, verwendet Git automatisch HEAD
(in diesem Fall der Zweig, in den Sie zusammengeführt werden).
So können Sie sehen, welche Commits in den beiden Zweigen in die Datei eingeflossen sind, nachdem sie sich getrennt haben. Das macht es normalerweise viel einfacher, Konflikte zu lösen.
Ab dem 12. Dezember 2016 können Sie Zweige zusammenführen und Konflikte auf github.com auflösen
Wenn Sie also nicht die Befehlszeile oder alle 3rd-Party-Tools, die hier aus älteren Antworten angeboten werden verwenden Sie das native Tool von GitHub.
Dieser Blogbeitrag erklärt im Detail, aber die Grundlagen sind, dass Sie beim Zusammenführen von zwei Zweigen über die Benutzeroberfläche jetzt eine Option "Konflikte auflösen" sehen, die Sie zu einem Editor führt, mit dem Sie diese Zusammenführungskonflikte bearbeiten können.
Es geht hier nicht um eine Frage zu Github, daher habe ich die meiner Meinung nach sehr schlechte Antwort heruntergestimmt.
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.