262

我在一个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

4 回答 4

318

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

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

git checkout文档

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

--ours
--theirs
从索引中检出路径时,请检出阶段 #2 ( ours) 或 #3 ( theirs) 以获取未合并的路径。

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

于 2013-05-30T00:21:47.290 回答
165

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

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

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

Git Merge
对于mergetheirsand的意思ours是相反的。因此,要在合并期间获得相同的效果,即,将当前分支更改 ( ours) 保留在正在合并的远程分支() 之上theirs

# assuming branch-a is our current version
$ git merge -X ours branch-b  # <- ours: branch-a, theirs: branch-b
于 2017-03-20T15:34:48.707 回答
37

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

相反,如果您想对文件执行三向合并,并且只使用解决冲突--ours|--theirs的数据块,同时保持双方的非冲突数据块就位,您可能需要使用git merge-file; 请参阅此答案中的详细信息。

于 2016-08-25T09:11:10.400 回答
6

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

git rebase -s recursive -X <ours/theirs>
或者
git merge -s recursive -X <ours/theirs>

请记住,对于变基,“我们的”和“他们的”与合并期间的状态相反

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

于 2021-03-23T15:17:10.653 回答