含撤销提交时,如何将Feature子分支变基到主Feature分支?
解决Git变基时Cherry-Pick提交被跳过的问题
这个问题我之前也碰到过——Git的rebase机制会根据提交的内容(patch)判断是否已存在,C'是cherry-pick C得到的,和C的内容完全一致,而Feature-1里先提交了C又revert了它,Git就觉得这个改动已经被处理过,所以自动跳过了C'。下面是几种靠谱的解决方案,你可以按需选择:
方法一:交互式变基强制保留C'
这是最直观的方式,手动告诉Git要保留这个提交:
- 切换到Branch-1分支:
git checkout Branch-1 - 启动交互式变基:
git rebase -i Feature-1 - 在弹出的文本编辑器里,找到C'对应的那一行,确保开头是
pick(如果Git自动标记了skip,手动改成pick) - 保存并退出编辑器,Git会开始变基,此时会触发冲突——因为Feature-1已经撤销了C的改动,而C'要重新应用这些修改
- 打开冲突文件,手动保留C'的内容(也就是恢复你原在C中做的修改),然后执行:
git add <冲突文件名>git rebase --continue
- 后续的E、F、G提交通常能顺利应用,完成后Branch-1就会基于Feature-1的D提交,同时保留C'、E、F、G
方法二:用--onto参数精准指定变基范围
如果Branch-1是从Feature-1的某个旧提交(比如B)分出来的,你可以直接指定变基的起始点,避免Git对比更早的提交:
- 先找到Branch-1创建时的父提交哈希(也就是B的哈希,可通过
git log --oneline查看C'的上一个提交) - 执行变基命令:
git rebase --onto Feature-1 <B的哈希值> Branch-1 - 同样会触发冲突,按照方法一的步骤解决冲突后继续变基即可
方法三:重新生成C'提交(让Git认不出是重复内容)
通过修改C'的提交哈希,让Git认为这是一个全新提交,从而不会跳过它:
- 切换到Branch-1分支:
git checkout Branch-1 - 重新生成C'提交(内容不变,仅哈希值改变):
git commit --amend --no-edit - 执行变基:
git rebase Feature-1 - 解决冲突后继续变基,完成后即可得到目标分支结构
注意:变基完成后,Branch-1的提交哈希会改变,如果该分支已推送到远程仓库,需要用
git push --force强制推送(请确保没有其他开发者正在该分支上工作)。
内容的提问来源于stack exchange,提问作者Pratham
相关产品推荐
相关产品推荐

