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

git pull --rebase之后,我正在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命令。

此外,请注意,我将只能为每个文件select一个合并策略,当我看到哪些文件冲突冲突可能是什么冲突。

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

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

git checkout文档

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

--ours
--theirs
从索引中检索path时,请查看第2阶段( ours )或第3阶段( theirs )未合并的path。

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

即使这个问题得到解答,在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合并
为了合并, theirsours的意思是相反的。 所以,要在合并过程中得到相同的影响,即保持当前分支的变化通过合并的远程分支。

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

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

相反,如果你想在文件上执行一个三路合并,并且只使用--ours|--theirs – 他们的方法来解决冲突的 --ours|--theirs ,同时保持双方都没有冲突的 --ours|--theirs ,那么你可能需要使用git merge-file 查看答案中的详细信息。