gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 12:51:02 24 4
gpt4 key购买 nike

给定一个包含两个分支 masterfeature 的 git 仓库。当使用 rebase master 将功能分支 rebase 到 master 之上时,假设文件 a.txt 包含一个冲突,需要在 rebase 继续之前​​解决该冲突。

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

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

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

最佳答案

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

rebase 和 merge(以及 cherry-pick,就此而言)命令都采用相同的 strategy-X 标志传递给底层的 git merge 机制。对于 recursive 策略,-Xours-Xtheirs 在两个文件都修改的情况下选择文件的一个或另一个“边”正在 merge 的分支。

或者——这是完全不同的——在 merge 因冲突而停止的情况下,你可以使用git checkout--ours--他们的 标志,从一侧或另一侧选择版本。 (您可以使用其他命令执行此操作;在这里,我将坚持使用 --ours--theirs,因为它们与使用 merge 机制的命令的参数相匹配.)

这当然是不同的,因为您可以切换选择:

$ 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

请注意,这与“我们的策略”完全不同(上面显示的是“递归 策略与ours 选项”) .使用“我们的策略”,会发生完全不同的事情。让我们从没有它开始,再次进行相同的 merge :

$ git checkout main && git merge branch
... conflicts ...
$ git checkout --ours -- A B # take main:A and main:B

假设有第三个文件,C,git 可以自行 merge 。当你执行上述操作时,git merge C 并且你获取 main:Amain:B。但是,如果您要使用 git merge --strategy=ours branch,git 会采用 main:Amain:B主要:C。它会丢弃 branch:C 更改,而不是自动 merge 它们。

我在上面使用了 git merge,因为它使“我们的”和“他们的”东西“正常工作”。不过,我不喜欢 git 命名这些的方式,因为当你做一个 rebase 时,我们的/他们的版本会被交换,因为 rebase 通过切换到“其他”分支并进行一系列的挑选来工作。即:

$ git checkout mine; git rebase theirs

通过执行(非常)粗略的相当于:

$ git checkout theirs; git cherry-pick theirs..mine

然后,打乱分支标签,使分支 theirs 实际上不会移动。 (它在内部并没有那么糟糕 :-) 但它确实设法使 --ours 意味着“他们的”和 --theirs 意味着“我们的”,这是非常糟糕的外部。)

关于git - 在 git rebase 期间解决冲突时如何从一个分支中选择一个文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21490592/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com