Git如何手动合并非HEAD的两个提交 丢弃后续提交并解决冲突
Git操作方案
针对描述的提交链场景,有两种常用操作方案,可根据是否需要保留提交b的提交信息选择:
方案一:合并为全新提交(不保留b的提交信息)
当前HEAD位于提交c,按以下步骤操作:
- 执行
git reset --soft <提交a的哈希值>,此时提交b、c的所有改动会全部存入暂存区,HEAD指针指向提交a - 恢复foo.txt为提交a的版本:执行
git checkout HEAD -- foo.txt,直接覆盖提交b对foo.txt的修改 - 清理提交c产生的所有无意义改动:如果提交c有新增/修改的文件,执行
git rm --cached <c新增的文件名>删除不需要的新增文件,执行git checkout HEAD -- <c修改的文件名>恢复被c修改的文件,直到暂存区仅保留bar.txt的新增记录 - 执行
git commit,填写提交信息后即可生成符合要求的新提交,最终提交链为a -> 新提交
方案二:保留b的提交记录(仅修改b的内容,丢弃c)
需要保留提交b的作者、提交时间等信息时选择此方案:
- 执行
git rebase -i <提交a的哈希值>,在弹出的交互式编辑界面中,将提交b前的pick保持不变,将提交c前的pick修改为drop,保存退出编辑界面 - 此时rebase流程会因a和b的冲突停止,执行
git checkout --ours foo.txt,直接采用提交a版本的foo.txt解决冲突 - 执行
git add foo.txt标记冲突已解决 - 执行
git rebase --continue完成rebase流程,最终提交链为a -> 修改后的提交b,c被完全丢弃
两种方案操作完成后,均可得到保留a版本foo.txt、同时包含b新增的bar.txt、无c相关改动的分支状态。
内容的提问来源于stack exchange,提问作者Elucidase
相关产品推荐
相关产品推荐

