git - `merge --squash` 后的后续合并导致冲突
问题描述
正常合并:
$ git merge feature01
$ git merge feature02
一切正常。
壁球合并:
$ git merge --squash feature01 # OK
$ git merge --squash feature02
Auto-merging src/aaa.js
CONFLICT (content): Merge conflict in src/XXX.js
....
这是为什么?如何使merge --squash
工作(后续合并工作找到)?
解决方案
您描述的情况要求历史看起来像这样:
--X--Y <-- your master
\
A--B--C--D <-- feature01
\
R--S--T <-- feature02
(您master
是否有提交Y
或仍在提交X
与以下内容无关。)
这是为什么?
A
请注意,在此示例中,这两个功能具有共同的提交。当您进行常规合并时,Git 知道这一事实并且可以在不产生冲突的情况下处理它。特别是,在第二次合并中,它不会再次引入所做的更改A
。
但是,当您对 进行 squash 合并时feature01
,您将生成以下历史记录:
--X--Y--F1 <-- your master
\
A--R--S--T <-- feature02
我从图片中截断feature01
,因为它不再起作用。
当您现在进行合并时feature02
(壁球或常规无关紧要),Git 会尝试A
再次应用提交,因为它没有足够的信息来知道它已经合并了它。B
当其中一个提交,已经在所做的更改附近进行了更改时C
,就会出现冲突。D
A
如何进行
merge --squash
工作(后续合并工作正常)?
你不能。不要使用merge --squash
.
当然,您可以通过嫁接历史来假装它A
实际上已合并到F1
; 但这只是一种变通方法,是紧急情况下的创可贴,但这对于常规工作流程来说太乏味了。如果你这样做,你为什么不首先使用常规合并?
推荐阅读
- jquery - 启动jquery插件
- c++ - 如何检查鼠标是否在控制台窗口中的某个区域上单击?
- c++ - = 运算符在这里的用途是什么?
- c++ - TBB:我如何衡量调度开销?
- bash - 如何在 Bash if/else 语句中检查 git config 值?
- vba - VBA查找多个值
- gcloud - 创建 glcoud 存储桶时无法指定存储桶的位置
- reactjs - TypeScript skipLibCheck 仍在检查 node_modules 库
- c++ - 如何使用 lower_bound/upper_bound 从 std::set 获取索引号?
- java - 获取请求在安卓设备上不起作用,但它在我的电脑上工作