将压缩的提交从主分支合并到功能分支时避免 git 中的冲突
Avoiding conflicts in git when merging a squashed commit from main into feature branch
考虑以下做法:
- 开发人员从
main
分支并在功能分支中根据需要创建尽可能多的提交
- 功能完成后,所有提交都会被压缩并合并到
main
分支中(例如,想想 GitHub 的“压缩并合并”按钮)
现在这是一个让我感兴趣的用例:
- 创建并处理
feature1
分支
- 从
feature1
分支的最后一次提交开始创建一个 feature2
分支(参见下图中的 C
提交)
- 压缩并合并
feature1
到 main
(参见提交 G
)
- 将这个新创建的提交
G
合并到 feature2
分支
- 继续
feature2
分支
换句话说,在步骤 4 中将 G
合并到 feature2
分支如下所示:
user@host:~/repo (main)$ git checkout feature2
user@host:~/repo (feature2)$ git merge main # merge G into feature2
通常,此合并(请参阅提交 H
)会导致许多合并冲突。
如何彻底消除这些冲突?
我能想到的最简单的解决方案如下(见下图):
user@host:~/repo (main)$ git checkout feature1
user@host:~/repo (feature1)$ git merge main # merge G into feature1; essentially, an empty commit
user@host:~/repo (feature1)$ git checkout feature2
user@host:~/repo (feature2)$ git merge feature1 # merge G' into feature2
换句话说,我们不是直接将G
合并到feature2
,而是先将G
合并到feature1
,然后再将feature1
合并到feature2
.
有没有更简单的方法?
在 feature1
被压缩和合并之后,我会将 feature2
变基到 main
。
类似于:
git checkout feature2
git rebase --onto main C feature2
这将在 main
.
之上将提交从 C
(不包括)变基到 feature2
(包括)
但是我不确定它是否更简单。一个缺点是您将在结果分支中获得 main
的提交(但我猜这就是您最终想要的)。
个人意见:如果该分支被其他人用作参考,请不要使用壁球。
考虑以下做法:
- 开发人员从
main
分支并在功能分支中根据需要创建尽可能多的提交 - 功能完成后,所有提交都会被压缩并合并到
main
分支中(例如,想想 GitHub 的“压缩并合并”按钮)
现在这是一个让我感兴趣的用例:
- 创建并处理
feature1
分支 - 从
feature1
分支的最后一次提交开始创建一个feature2
分支(参见下图中的C
提交) - 压缩并合并
feature1
到main
(参见提交G
) - 将这个新创建的提交
G
合并到feature2
分支 - 继续
feature2
分支
换句话说,在步骤 4 中将 G
合并到 feature2
分支如下所示:
user@host:~/repo (main)$ git checkout feature2
user@host:~/repo (feature2)$ git merge main # merge G into feature2
通常,此合并(请参阅提交 H
)会导致许多合并冲突。
如何彻底消除这些冲突?
我能想到的最简单的解决方案如下(见下图):
user@host:~/repo (main)$ git checkout feature1
user@host:~/repo (feature1)$ git merge main # merge G into feature1; essentially, an empty commit
user@host:~/repo (feature1)$ git checkout feature2
user@host:~/repo (feature2)$ git merge feature1 # merge G' into feature2
换句话说,我们不是直接将G
合并到feature2
,而是先将G
合并到feature1
,然后再将feature1
合并到feature2
.
有没有更简单的方法?
在 feature1
被压缩和合并之后,我会将 feature2
变基到 main
。
类似于:
git checkout feature2
git rebase --onto main C feature2
这将在 main
.
C
(不包括)变基到 feature2
(包括)
但是我不确定它是否更简单。一个缺点是您将在结果分支中获得 main
的提交(但我猜这就是您最终想要的)。
个人意见:如果该分支被其他人用作参考,请不要使用壁球。