在git rebase中解决冲突时如何从一个分支中选择文件?

ams*_*ams 8 git

鉴于git repo有两个分支masterfeature.在主服务器上重新定义功能分支时rebase master,假设该文件a.txt包含在rebase可以继续之前需要解决的冲突.

我知道我可以通过三个步骤解决冲突:

  1. a.txt在我的编辑器中打开手动解决冲突
  2. 打电话git add a.txt告诉git我已经手动解决了冲突
  3. 打电话git rebase --continue转移rebase

有没有办法通过告诉git我想要来自主分支的文件版本或者我想要来自功能分支的文件版本而不必执行上面的步骤1和2来避免步骤1.

tor*_*rek 7

是.事实上,有不止一种方法可以做到这一点.

底垫和合并(和摘樱桃,对于这个问题)命令都采取相同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
Run Code Online (Sandbox Code Playgroud)

请注意,这与"我们的策略 " 完全不同(上面显示了" recursiveours选项的策略").随着"我们的战略 ",出现了完全不同的东西.让我们从没有它开始,再次进行相同的合并:

$ git checkout main && git merge branch
... conflicts ...
$ git checkout --ours -- A B  # take main:A and main:B
Run Code Online (Sandbox Code Playgroud)

假设有第三个文件,Cgit可以自己合并.当你执行上述操作时,git会合并C你拿main:Amain:B.如果你使用git merge --strategy=ours branch,虽然混帐将采取main:A,main:Bmain:C.它会丢弃branch:C更改而不是自动合并它们.

git merge上面用过,因为它使"我们的"和"他们的"东西"正常".我不喜欢git命名这些的方式,因为当你做一个rebase时,我们/他们的版本会被换掉,因为rebase通过改变到"其他"分支并做一系列樱桃选择来工作.那是:

$ git checkout mine; git rebase theirs
Run Code Online (Sandbox Code Playgroud)

通过做(非常)粗略相当于:

$ git checkout theirs; git cherry-pick theirs..mine
Run Code Online (Sandbox Code Playgroud)

然后,将分支标签移动,使分支theirs实际上不移动.(这在内部并不是那么糟糕:-)但是它确实设法--ours表达"他们的"并且--theirs意味着"我们的",这在外部非常糟糕.)


Ash*_*son 5

您可以使用:

git checkout --ours -- path/to/file
Run Code Online (Sandbox Code Playgroud)

要么:

git checkout --theirs -- path/to/file
Run Code Online (Sandbox Code Playgroud)

...在合并或变基期间选择有冲突文件的特定版本;因为变基有点奇怪--theirs在这种情况下将是feature的版本,--ours将是的版本master