it-swarm.com.de

Wähle eine Git-Merge-Strategie für bestimmte Dateien ("unsere", "meine", "ihre")

Ich bin mitten in der Umbasierung nach einem git pull --rebase. Ich habe ein paar Dateien, die Konflikte zusammenführen. Wie kann ich "ihre" Änderungen oder "meine" Änderungen für bestimmte Dateien akzeptieren?

$ git status
# Not currently on any branch.
# You are currently rebasing.
#   (fix conflicts and then run "git rebase --continue")
#   (use "git rebase --skip" to skip this patch)
#   (use "git rebase --abort" to check out the original branch)
#
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       modified:  CorrectlyMergedFile
#
# Unmerged paths:
#   (use "git reset HEAD <file>..." to unstage)
#   (use "git add <file>..." to mark resolution)
#
#       both modified: FileWhereIWantToAcceptTheirChanges
#       both modified: FileWhereIWantToAcceptMyChanges

Normalerweise öffne ich einfach die Datei oder ein Merge-Tool und akzeptiere manuell alle "ihre" oder "meine" Änderungen. Ich vermute jedoch, dass mir ein praktischer git-Befehl fehlt.

Beachten Sie außerdem, dass ich nur dann eine Zusammenführungsstrategie für jede Datei auswählen kann, wenn ich sehe, welche Dateien auf Konflikte stoßen und möglicherweise welche Konflikte vorliegen.

179
Steven Wexler

Für jede Konfliktdatei, die Sie erhalten, können Sie angeben

git checkout --ours -- <paths>
# or
git checkout --theirs -- <paths>

Aus den git checkout - Dokumenten

git checkout [-f|--ours|--theirs|-m|--conflict=<style>] [<tree-ish>] [--] <paths>...

--ours
--theirs
Wenn Sie Pfade aus dem Index auschecken, suchen Sie in Stufe 2 (ours) oder 3 (theirs) nach nicht zusammengeführten Pfaden.

Der Index enthält möglicherweise nicht zusammengeführte Einträge aufgrund einer zuvor fehlgeschlagenen Zusammenführung. Wenn Sie versuchen, einen solchen Eintrag aus dem Index auszuchecken, schlägt der Auscheckvorgang standardmäßig fehl und es wird nichts ausgecheckt. Mit -f Werden diese nicht zusammengeführten Einträge ignoriert. Der Inhalt einer bestimmten Seite der Zusammenführung kann mit --ours Oder --theirs Aus dem Index ausgecheckt werden. Mit -m Können an der Arbeitsbaumdatei vorgenommene Änderungen verworfen werden, um das ursprüngliche Ergebnis der widersprüchlichen Zusammenführung wiederherzustellen.

222
user456814

Auch wenn diese Frage beantwortet ist, soll ein Beispiel gegeben werden, was "ihre" und "unsere" im Fall von "git rebase vs merge" bedeuten. Siehe dieser Link

Git Rebase
theirs ist eigentlich der aktuelle Zweig im Fall von rebase. Die folgenden Befehle akzeptieren also tatsächlich Ihre aktuellen Zweigänderungen über den entfernten Zweig.

# see current branch
$ git branch
... 
* branch-a
# rebase preferring current branch changes during conflicts
$ git rebase -X theirs branch-b

Git Merge
Für Merge wird die Bedeutung von theirs und ours umgekehrt. Um den gleichen Effekt während einer Zusammenführung zu erzielen, d. H., Behalten Sie Ihre aktuellen Zweigänderungen (ours) über dem zusammengeführten entfernten Zweig (theirs) bei.

# assuming branch-a is our current version
$ git merge -X ours branch-b  # <- ours: branch-a, theirs: branch-b
90
Abe

Beachten Sie, dass git checkout --ours|--theirs die Dateien vollständig überschreibt, indem Sie entweder theirs oder ours auswählen möchten (wenn Sie nicht in Konflikt stehende Änderungen von der anderen Seite haben, gehen diese verloren).

Wenn Sie stattdessen eine Drei-Wege-Zusammenführung für die Datei durchführen möchten und nur die Konfliktpunkte mit --ours|--theirs Auflösen möchten, während Wenn Sie nicht in Konflikt stehende Hunks von beiden Seiten an Ort und Stelle halten, können Sie auf git merge-file zurückgreifen. siehe Details in diese Antwort .

22
jakub.g