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合并
为了合并, theirs
和ours
的意思是相反的。 所以,要在合并过程中得到相同的影响,即保持当前分支的变化通过合并的远程分支。
# assuming branch-a is our current version $ git merge -X ours branch-b # <- ours: branch-a, theirs: branch-b
请注意, git checkout --ours|--theirs
将通过selecttheirs
或ours
版本来完全覆盖这些文件 ,这可能是也可能不是您想要做的(如果您有任何非冲突的更改来自另一个他们将会失去)。
相反,如果你想在文件上执行一个三路合并,并且只使用--ours|--theirs
– 他们的方法来解决冲突的 --ours|--theirs
,同时保持双方都没有冲突的 --ours|--theirs
,那么你可能需要使用git merge-file
查看答案中的详细信息。