git rebase --skip执行后被跳过的变更仍出现的原因排查
Git Rebase中跳过/Drop提交后内容重现的原因分析
你的问题核心在于没搞清楚Git提交的快照本质和rebase时的变更应用逻辑:
提交的变更依赖关系
你的原始提交链是:saved→feature→skip→new featurenew feature的提交是基于skip的快照创建的,也就是说它的变更集(diff)是相对于skip之后的代码生成的。如果skip里的内容在new feature中被保留或修改过,那new feature的diff里必然包含skip的相关变更。git rebase --skip和drop的实际作用- 当你执行
git rebase --skip时,Git会直接跳过当前冲突的skip提交,完全不应用它的任何变更,然后继续尝试应用后续的feature和new feature。 - 选择
drop操作时,Git同样会忽略skip提交,不会把它的变更应用到新的提交链里。
- 当你执行
内容重现的根本原因
当应用new feature时,Git会把它相对于原始父提交(也就是skip)的diff,尝试应用到当前rebase的基线(也就是feature提交之后的代码)上。因为new feature的diff里包含了skip的变更内容,这相当于把skip的代码又重新加了一遍,自然会和现有代码产生冲突,或者让skip的内容再次出现。
这和GitHub文档描述的差异,是因为文档默认的场景是后续提交不依赖被跳过/drop的提交内容——如果new feature完全不涉及skip里的代码,那dropskip后就不会有问题,但你的场景里new feature是基于skip创建的,所以必然会携带skip的变更。
解决思路
如果想彻底移除skip的内容,需要先处理new feature提交,把其中属于skip的变更剥离:
- 可以在rebase前,用
git rebase -i HEAD~2修改new feature提交,把skip的内容从里面删掉; - 或者在rebase到
new feature出现冲突时,手动编辑冲突文件,移除skip的内容,执行git add <冲突文件>后,再运行git rebase --continue。
内容的提问来源于stack exchange,提问作者Lex
相关产品推荐
相关产品推荐

