鉴于git repo有两个分支master
和feature
.在主服务器上重新定义功能分支时rebase master
,假设该文件a.txt
包含在rebase可以继续之前需要解决的冲突.
我知道我可以通过三个步骤解决冲突:
a.txt
在我的编辑器中打开手动解决冲突
打电话git add a.txt
告诉git我已经手动解决了冲突
打电话git rebase --continue
转移rebase
有没有办法通过告诉git我想要来自主分支的文件版本或者我想要来自功能分支的文件版本而不必执行上面的步骤1和2来避免步骤1.
是.事实上,有不止一种方法可以做到这一点.
底垫和合并(和摘樱桃,对于这个问题)命令都采取相同strategy
和-X
标志传递给底层的Git合并机械.对于recursive
策略,-Xours
并且-Xtheirs
在合并两个分支中修改的文件的情况下选择文件的一个或另一个"边".
或者,这是完全不同的,在情况下,当合并有冲突停止,您可以使用git checkout
与--ours
或--theirs
标志,从一个侧面或其他挑版本.(你可以使用其他命令执行此操作;在这里,我会坚持使用--ours
,--theirs
因为这些命令与使用合并机制的命令的参数相匹配.)
这当然是不同的,因为您可以切换选择:
$ git checkout main Switched to branch 'main' $ git merge branch ... conflicts in files A and B ... $ git checkout --ours -- A # takes main:A $ git checkout --theirs -- B # takes branch:B
请注意,这与"我们的策略 " 完全不同(上面显示了" recursive
带ours
选项的策略").随着"我们的战略 ",出现了完全不同的东西.让我们从没有它开始,再次进行相同的合并:
$ git checkout main && git merge branch ... conflicts ... $ git checkout --ours -- A B # take main:A and main:B
假设有第三个文件,C
git可以自己合并.当你执行上述操作时,git会合并C
你拿main:A
和main:B
.如果你使用git merge --strategy=ours branch
,虽然混帐将采取main:A
,main:B
和main:C
.它会丢弃branch:C
更改而不是自动合并它们.
我git merge
上面用过,因为它使"我们的"和"他们的"东西"正常".我不喜欢git命名这些的方式,因为当你做一个rebase时,我们/他们的版本会被换掉,因为rebase通过改变到"其他"分支并做一系列樱桃选择来工作.那是:
$ git checkout mine; git rebase theirs
通过做(非常)粗略相当于:
$ git checkout theirs; git cherry-pick theirs..mine
然后,将分支标签移动,使分支theirs
实际上不移动.(这在内部并不是那么糟糕:-)但是它确实设法--ours
表达"他们的"并且--theirs
意味着"我们的",这在外部非常糟糕.)
您可以使用:
git checkout --ours -- path/to/file
要么:
git checkout --theirs -- path/to/file
...在合并或变基期间选择有冲突文件的特定版本;因为变基有点奇怪,--theirs
在这种情况下将是feature
的版本,--ours
将是的版本master
。