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

时间:2013-05-30 00:01:00

标签: git git-rebase git-merge-conflict

我在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命令。

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

4 个答案:

答案 0 :(得分:211)

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

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

来自git checkout docs

  

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

     

<强> --ours
  的 --theirs
  检查索引中的路径时,请查看阶段#2(ours)或#3(theirs)以了解未合并路径。

     

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

答案 1 :(得分:83)

即使回答了这个问题,但在git rebase vs merge的情况下,提供一个关于“他们的”和“我们的”意味着什么的例子。见this link

Git Rebase
rebase 的情况下,theirs实际上是当前分支。因此,下面的命令集实际上是通过远程分支接受当前的分支更改。

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

Git Merge
对于 merge theirsours的含义相反。因此,要在 merge 期间获得相同的效果,即保持当前分支更改(ours)通过远程分支进行合并(theirs)。

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

答案 2 :(得分:16)

请注意,git checkout --ours|--theirs完全覆盖文件,选择theirsours版本,这可能是您想要的,也可能不是您想要的do(如果你有来自另一方的任何非冲突的变化,它们将会丢失)。

如果您希望对文件执行三向合并,并且仅使用--ours|--theirs解决冲突的帅哥,而保持非冲突的帅哥从两边到位,你可能想诉诸git merge-file;请参阅this answer中的详细信息。

答案 3 :(得分:1)

从上面的评论中引用@user456814:

<块引用>

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

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

请记住,对于变基,“我们的”和“他们的”与 它们在合并期间是什么

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