为特定文件选择Git合并策略(“我们的”,“我的”,“他们的”)

我正在git pull --rebase之后的重基过程中。我有一些文件合并冲突。我如何接受特定文件的“他们的”更改或“我的”更改?

$ 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

通常我只是打开文件或合并工具,手动接受所有“他们的”或“我的”更改。但是,我怀疑我错过了一个方便的git命令。

另外,请注意,只有当我看到哪些文件发生冲突或冲突可能是什么时,我才能为每个文件选择合并策略。

194098 次浏览

对于您获得的每个冲突文件,您可以指定

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

git checkout文档

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

< p > --ours < br > --theirs < br > 当从索引中检出路径时,检查阶段#2 (ours)或#3 (theirs)是否有未合并的路径

由于之前的合并失败,索引可能包含未合并的条目。默认情况下,如果尝试从索引中签出这样的条目,签出操作将失败,并且不会签出任何内容。使用-f将忽略这些未合并的条目。可以使用--ours--theirs将合并中特定一侧的内容签出索引。使用-m,对工作树文件所做的更改可以被丢弃,以重新创建原始的冲突合并结果。

注意,通过选择theirsours版本,git checkout --ours|--theirs完全覆盖文件,这可能是也可能不是你想做的(如果你有来自另一端的任何不冲突的更改,它们将会丢失)。

如果相反,你想对文件执行三向合并,并且只使用--ours|--theirs解析矛盾的守财奴,而两边的保持不冲突的大块头都存在,你可能想求助于git merge-file;详见这个答案

尽管已经回答了这个问题,但还是提供了一个例子,说明在git rebase和merge的情况下,“他们的”和“我们的”意味着什么。看到这个链接

< p > Git变基 < br > theirs实际上是变基的当前分支。因此下面的命令集实际上是通过远程分支接受当前分支的更改
# see current branch
$ git branch
...
* branch-a
# rebase preferring current branch changes during conflicts
$ git rebase -X theirs branch-b
< p > Git合并 < br > 对于合并theirsours的含义是相反的。因此,要在合并过程中获得相同的效果,即将当前分支更改(ours)保持在被合并的远程分支(theirs)之上
# assuming branch-a is our current version
$ git merge -X ours branch-b  # <- ours: branch-a, theirs: branch-b

引用@user456814从上面的评论:

< p > git rebase -s recursive -X <ours/theirs>

git merge -s recursive -X <ours/theirs> < / p >

请记住,对于一个改变,“我们的”;和“;theirs"都是从 它们在合并期间是什么

@user456814在2014年的评论中给出了这个有用的答案。我在这里将它作为一个社区wiki来呈现,以便于查找、评估、更新等等,因为在这方面评论是有限的。