wake-up-neo.com

Lösen Sie Git-Merge-Konflikte zugunsten ihrer Änderungen während eines Pulls

Wie löse ich einen Git-Merge-Konflikt zugunsten von gezogenen Änderungen?

Grundsätzlich muss ich alle widersprüchlichen Änderungen aus einem Arbeitsbaum entfernen, ohne alle Konflikte mit einem git mergetool durchgehen zu müssen, während alle konfliktfreien Änderungen beibehalten werden. Tun Sie dies vorzugsweise beim Ziehen, nicht danach.

1023
sanmai

Sie können die rekursive "ihre" Strategie verwenden Option:

git merge --strategy-option theirs

Vom Mann :

ours
    This option forces conflicting hunks to be auto-resolved cleanly by 
    favoring our version. Changes from the other tree that do not 
    conflict with our side are reflected to the merge result.

    This should not be confused with the ours merge strategy, which does 
    not even look at what the other tree contains at all. It discards 
    everything the other tree did, declaring our history contains all that
    happened in it.

theirs
    This is opposite of ours.

Hinweis: Wie in der Manpage angegeben, unterscheidet sich die Zusammenführung "ours" Strategieoption stark von der Zusammenführung "ours" Strategie.

876
Ikke
git pull -s recursive -X theirs <remoterepo or other repo>

Oder einfach für das Standard-Repository:

git pull -X theirs

Wenn Sie bereits in Konflikt sind ...

git checkout --theirs path/to/file
937
Pascal Fares

Wenn Sie sich bereits in einem Konfliktzustand befinden und nur alle von ihnen akzeptieren möchten:

git checkout --theirs .
git add .

Wenn Sie das Gegenteil tun möchten:

git checkout --ours .
git add .

Das ist ziemlich drastisch, also stellen Sie sicher, dass Sie wirklich alles so auslöschen möchten, bevor Sie es tun.

390
lots-to-learn

Stellen Sie sich das Szenario vor, in dem ich gerade war:

Sie versuchen, ein merge oder vielleicht ein cherry-pick, und Sie werden mit gestoppt

$ git cherry-pick 1023e24
error: could not apply 1023e24... [Commit Message]
hint: after resolving the conflicts, mark the corrected paths
hint: with 'git add <paths>' or 'git rm <paths>'
hint: and commit the result with 'git commit'

Jetzt sehen Sie die in Konflikt stehende Datei und möchten Ihre Änderungen wirklich nicht behalten. In meinem obigen Fall war die Datei in Konflikt mit einer Zeile, die von meinem IDE automatisch hinzugefügt wurde. Der einfachste Weg, um Ihre Änderungen rückgängig zu machen und deren Änderungen zu akzeptieren, ist:

git checkout --theirs path/to/the/conflicted_file.php
git add path/to/the/conflicted_file.php

Das Gegenteil davon (um die eingehende Version mit Ihrer Version zu überschreiben) ist

git checkout --ours path/to/the/conflicted_file.php
git add path/to/the/conflicted_file.php

Überraschenderweise konnte ich diese Antwort nicht so einfach im Internet finden.

216

Die Antworten _git pull -X theirs_ können zu einem hässlichen Merge-Commit führen oder ein ausgeben

fehler: Ihre lokalen Änderungen an den folgenden Dateien würden durch Zusammenführen überschrieben:

Wenn Sie lokale Änderungen an Dateien aus dem Repository einfach ignorieren möchten, z. B. auf einem Client, der immer ein Spiegelbild von Origin sein soll, führen Sie Folgendes aus (ersetzen Sie master durch den gewünschten Zweig):

_git fetch && git reset --hard Origin/master
_

Wie funktioniert es? _git fetch_ macht _git pull_ aber ohne Zusammenführung . Dann bewirkt git reset --hard , dass Ihr Arbeitsbaum mit dem letzten Commit übereinstimmt. Alle Ihre lokalen Änderungen an Dateien im Repo werden verworfen sein, aber neue lokale Dateien werden in Ruhe gelassen.

28
Dan Dascalescu

So lösen Sie alle Konflikte mit der Version in einem bestimmten Zweig:

git diff --name-only --diff-filter=U | xargs git checkout ${branchName}

Wenn Sie sich bereits im Status "Zusammenführen" befinden und die Masterversion der in Konflikt stehenden Dateien beibehalten möchten, gehen Sie wie folgt vor:

git diff --name-only --diff-filter=U | xargs git checkout master
19
Ariel Alvarez

Bitte nicht, dass dies manchmal nicht funktioniert :

git checkout - unser Pfad/zu/Datei

oder

git checkout --der Pfad/zu/Datei

Ich tat dies stattdessen unter der Annahme, dass HEAD uns gehört und MERGE_HEAD ihnen gehört

git checkout HEAD -- path/to/file

oder:

git checkout MERGE_HEAD -- path/to/file

Nachdem wir das gemacht haben und es uns gut geht:

git add .

Wenn du mehr verstehen willst, sieh dir den wundervollen Beitrag von torek hier an: git checkout --ours entfernt keine Dateien aus der Liste nicht zusammengeführter Dateien

15
Nicolas D

VS Code (integrierter Git) IDE Benutzer:

Wenn Sie alle eingehenden Änderungen in der Konfliktdatei akzeptieren möchten, führen Sie die folgenden Schritte aus.

1. Go to command palette - Ctrl + Shift + P
2. Select the option - Merge Conflict: Accept All Incoming

Ebenso können Sie für andere Optionen wie Alle beide akzeptieren, Alle aktuellen akzeptieren usw.

9
SridharKritha