如何在保留当前进度的前提下,将旧提交的变更合并到当前提交?
解决分支提交覆盖问题:保留important-commit变更同时保留commit3工作
嘿,这个问题我熟!你现在的情况是commit2不小心覆盖了important-commit里的变更,想要让commit3同时包含这两个提交的有效内容对吧?这里有两种靠谱的方案,你可以根据自己的分支状态来选:
方案一:交互式变基(整理提交历史,推荐本地未推送分支)
这个方法会重新梳理你的提交链,让历史更干净,适合还没把分支推送到远程仓库的场景:
- 先切换到分支y:
git checkout y - 启动交互式变基,目标指向
important-commit的父提交(把<important-hash>换成你那个重要提交的哈希值):
要是记不清父提交,也可以用相对位置,比如从当前提交往前数3个(对应git rebase -i <important-hash>^important-commit、commit2、commit3):git rebase -i HEAD~3 - 在弹出的编辑器里,找到
commit2那一行,把开头的pick改成edit,保存后退出编辑器。 - 现在Git会停在
commit2的提交状态,接下来我们修复它:- 先撤销
commit2的提交,把修改放回工作区:git reset HEAD^ - 重新应用
important-commit的所有变更:git cherry-pick <important-hash> - 把
commit2原本的修改和important-commit的内容合并,然后用原来的提交信息重新提交:git add . git commit -c ORIG_HEAD
- 先撤销
- 继续完成变基:
git rebase --continue - 如果中途遇到冲突,手动解决冲突后,用
git add标记冲突文件已解决,再运行git rebase --continue直到变基完成。
方案二:直接修复提交(不修改历史,适合已推送分支)
如果你的分支已经推送到远程,不想修改历史引发协作问题,直接在当前commit3基础上做一个修复提交更稳妥:
- 切换到分支y:
git checkout y - 把
important-commit的变更应用到当前工作区,但不自动提交(这样可以和commit3的内容合并):git cherry-pick -n <important-hash> - 解决可能出现的冲突,然后把所有修改加入暂存区:
git add . - 提交这个修复提交,说明清楚内容:
git commit -m "Restore all changes from important-commit, preserving commit3's work"
两种方案的核心都是把important-commit的变更重新拉回来,和后续提交的内容合并,区别在于是否修改历史记录。根据你的分支状态选就行啦!
内容的提问来源于stack exchange,提问作者Le garcon
相关产品推荐
相关产品推荐

