Wie löse ich einen Git-Merge-Konflikt zugunsten gezogener Änderungen?
Grundsätzlich muss ich alle widersprüchlichen Änderungen aus einem Arbeitsbaum entfernen, ohne alle Konflikte mit einer git mergetool
Weile durchlaufen zu müssen, während alle konfliktfreien Änderungen beibehalten werden. Tun Sie dies vorzugsweise beim Ziehen, nicht danach.
git
git-merge
git-merge-conflict
Sanmai
quelle
quelle
Antworten:
Oder einfach für das Standard-Repository:
Wenn Sie bereits in einem Konfliktzustand sind ...
quelle
-s recursive
hier redundant ist, da dies die Standard-Zusammenführungsstrategie ist. Sie könnten es also vereinfachengit pull -X theirs
, was im Grunde gleichbedeutend ist mitgit pull --strategy-option theirs
.MERGING
Staat. Ich kann es danngit merge --abort
erneut versuchen, aber jedes Mal kommt es zu einer Zusammenführung. … Ich weiß, dass eine Rebase in meinen Upstream verschoben wurde. Vielleicht verursacht das das?git checkout --theirs path/to/file
. Verwendet es während der Rebase und hat unerwartete Ergebnisse erhalten. Gefundene Erklärung in doc: Beachten Sie, dass während git rebase und git pull --rebase unsere und ihre möglicherweise getauscht erscheinen; --ours gibt die Version aus dem Zweig an, auf die die Änderungen neu basiert, während --theirs die Version aus dem Zweig angibt, in der sich Ihre Arbeit befindet, die neu basiert wird.git checkout --theirs/--ours path
Manpage angibt, dass sie für nicht zusammengeführte Pfade funktioniert . Wenn es also keinen Pfadkonflikt gab, der bereits zusammengeführt wurde, führt dieser Befehl nichts aus. Dies kann zu Problemen führen, wenn Sie beispielsweise die Version eines ganzen Unterordners "ihre" möchten. In einem solchen Fall wäre es also sicherer,git checkout MERGE_HEAD path
Commit-Hash auszuführen oder zu verwenden.git pull -X theirs
Erstellt ein Merge-Commit, wenn Konflikte vorliegen (z. B. wenn ein anderer Committergit push -f
auf die Fernbedienung ausgeführt wurde). Wenn Sie keine Merge-Commits möchten, führen Sie stattdessen ausgit fetch && git reset --hard origin/master
.Sie können die rekursive „ihre“ Strategie verwenden Option :
git merge --strategy-option theirs
Vom Mann :
Hinweis: als der Mann Seite sagt, das „unsere“ merge Strategie Option ist sehr verschieden von der „unserer“ merge Strategie .
quelle
git checkout --theirs
um eine einzelne widersprüchliche Datei zugit checkout <ref to theirs> -- the/conflicted.file
; und danngit add
ihre Änderungen.Wenn Sie sich bereits in einem Konfliktzustand befinden und einfach alle akzeptieren möchten :
Wenn Sie das Gegenteil tun möchten:
Das ist ziemlich drastisch, also stellen Sie sicher, dass Sie wirklich alles so auslöschen möchten, bevor Sie es tun.
quelle
.
und geben Sie die Datei (en) anstelle des Punkts an, den Sie auschecken möchten. weniger "drastisch" und genau das, was Sie vermutlich tun möchten.git add -u
stattdessen, um Dateien zu überspringen, die nicht der Versionskontrolle unterliegen.OK, stellen Sie sich das Szenario vor, in dem ich mich gerade befand:
Sie versuchen ein
merge
oder vielleicht eincherry-pick
, und Sie werden mit gestopptJetzt sehen Sie die in Konflikt stehende Datei und möchten Ihre Änderungen wirklich nicht behalten. In meinem obigen Fall war die Datei nur in einer neuen Zeile in Konflikt geraten, die meine IDE automatisch hinzugefügt hatte. Der einfachste Weg, um Ihre Änderungen rückgängig zu machen und zu akzeptieren, ist:
Das Gegenteil davon (um die eingehende Version mit Ihrer Version zu überschreiben) ist
Überraschenderweise konnte ich diese Antwort im Internet nicht so einfach finden.
quelle
git status
Zwischen-checkout
und ausgeführt wirdadd
, die Datei weiterhin als "beide geändert" angezeigt wird.git reset --hard
und danngit pull [remote server name] [branch name] -Xtheirs
(macht die Zusammenführung rückgängig und zieht dann das neue Zeug über mein Zeug) - nicht sicher, ob dies das ist, was du willst.Die
git pull -X theirs
Antworten können zu einem hässlichen Zusammenführungs-Commit führen oder ein Commit ausgebenWenn Sie lokale Änderungen an Dateien aus dem Repo einfach ignorieren möchten, z. B. auf einem Client, der immer ein Spiegel eines Ursprungs sein sollte, führen Sie dies aus (ersetzen
master
Sie ihn durch den gewünschten Zweig):Wie funktioniert es?
git fetch
tutgit pull
aber ohne zu verschmelzen . Danngit reset --hard
stimmt Ihr Arbeitsbaum mit dem letzten Commit überein. Alle Ihre lokalen Änderungen an Dateien im Repo werden verworfen , aber neue lokale Dateien werden in Ruhe gelassen.quelle
git fetch && git reset --hard {remote}/{branch}
mein Problem gelöst. Ich musste meine eigenen Änderungen vollständig zugunsten des "ihren" Status eines Zweigs fallen lassen, aber dasgit pull -X theirs
erstickte an einigen verschobenen / umbenannten Dateien. Vielen Dank!Nach dem Zusammenführen von Git, wenn Sie Konflikte bekommen und entweder Ihre oder ihre wollen
quelle
So lösen Sie alle Konflikte mit der Version in einem bestimmten Zweig:
Wenn Sie sich also bereits im Zusammenführungsstatus befinden und die Master-Version der in Konflikt stehenden Dateien beibehalten möchten:
quelle
git cherry-pick --continue
oder eingit commit --allow-empty
Befehl erforderlich , um diese Änderungen zu übernehmen, und es scheint kein System zu geben, hinter dem ein Befehl erforderlich ist, was die Automatisierung zu einem Problem macht. Ich.git/COMMIT_EDITMSG
löse dies derzeit, indem ich prüfe, ob eine Datei vorhanden ist, aber das scheint hackig und spröde zu sein, und ich bin noch nicht davon überzeugt, dass es immer funktioniert.git add
), können Sie den Rest über dieses Problem in großen Mengen auflösen.git checkout --ours
Ichgit checkout --theirs
bin auch nützlich.Bitte nicht, dass dies manchmal nicht funktioniert :
oder
Ich habe dies stattdessen getan, vorausgesetzt, HEAD gehört uns und MERGE_HEAD gehört ihnen
oder:
Nachdem wir das gemacht haben und wir sind gut:
Wenn Sie mehr verstehen möchten, lesen Sie den wunderbaren Beitrag von torek hier: git checkout --ours entfernt keine Dateien aus der Liste der nicht zusammengeführten Dateien
quelle
VS Code (integrierte Git) IDE Benutzer:
Wenn Sie alle eingehenden Änderungen in der Konfliktdatei akzeptieren möchten, führen Sie die folgenden Schritte aus.
Ebenso können Sie für andere Optionen wie Alle beide akzeptieren, Alle aktuellen akzeptieren usw. tun.
quelle
Ich hatte einen langjährigen
next-version
Zweig mit unzähligen Löschungen von Dateien, die geändert wurdendevelop
, Dateien, die an verschiedenen Stellen in beiden Zweigen hinzugefügt wurden usw.Ich wollte den gesamten Inhalt des
next-version
Zweigs indevelop
einem einzigen Merge-Commit zusammenfassen.Die Kombination der oben genannten Befehle, die für mich funktioniert hat, war:
Keine neue Antwort, sondern nur die Kombination von Bits aus vielen Antworten, teilweise um sicherzustellen, dass Sie möglicherweise alle diese Antworten benötigen .
quelle
Wenn Sie sich bereits in einem Konfliktzustand befinden und den Pfad nicht einzeln auschecken möchten. Sie können es versuchen
quelle
Eine Situation, die ich als nützlich empfunden habe, wenn der Master die Änderungen eines neuen Themenzweigs widerspiegeln soll. Mir ist aufgefallen, dass -Xtheirs unter bestimmten Umständen nicht ohne Konflikte verschmelzen ... z
In diesem Fall war die Lösung, die ich gefunden habe
Wenn Sie in topicFoo zuerst den Master mit der Strategie -s our zusammenführen, wird das falsche Commit erstellt, das nur den Status von topicFoo darstellt. $ git verschmilzt mit unserem Meister
Überprüfen Sie das erstellte Zusammenführungs-Commit
Kasse jetzt den Hauptzweig aus
Führen Sie den Themenzweig wieder zusammen, aber verwenden Sie diesmal die rekursive Strategie -Xtheirs. Dadurch wird Ihnen jetzt ein Hauptzweig mit dem Status von topicFoo angezeigt.
quelle