如何将分支中自身多次提交合并为单次提交?含master合并场景
把分支上的个人提交合并为单次提交的方法
首先咱们先把本地的master分支同步到最新状态,确保后续操作基于远程最新代码:
git checkout master git pull origin master
切回你自己的开发分支:
git checkout 你的分支名称
接下来用交互式变基梳理提交历史,这是处理这类问题的核心操作:
git rebase -i master
执行完这个命令后会弹出文本编辑器(默认是vim,不习惯的话可以提前修改默认编辑器),里面会列出你的分支上所有和master分支存在差异的提交——也就是你提到的4次个人提交+45次合并master的提交。
你需要做两个关键调整:
- 把所有开头为
pick的合并master提交(提交信息一般是Merge branch 'master' into xxx)改成drop,这些提交的内容已经在最新master里了,留着只会让提交历史混乱 - 把你自己的4次提交中,除第一个保留
pick外,剩下3次都改成squash(会保留这些提交的原始信息,最后可以合并成新的提交说明)或者fixup(直接丢弃这些提交的信息,只用第一个提交的说明)
举个修改示例:
修改前的提交列表可能是这样:
pick a1b2c3 我的第一个功能提交 pick d4e5f6 Merge branch 'master' into my-branch pick g7h8i9 我的第二个功能提交 pick j0k1l2 Merge branch 'master' into my-branch ...(一堆类似的合并提交) pick m3n4o5 我的第三个功能提交 pick p6q7r8 Merge branch 'master' into my-branch pick s9t0u1 我的第四个功能提交
修改后应该变成:
pick a1b2c3 我的第一个功能提交 drop d4e5f6 Merge branch 'master' into my-branch squash g7h8i9 我的第二个功能提交 drop j0k1l2 Merge branch 'master' into my-branch ...(所有合并提交都改成drop) squash m3n4o5 我的第三个功能提交 drop p6q7r8 Merge branch 'master' into my-branch squash s9t0u1 我的第四个功能提交
保存并退出编辑器后,Git会开始执行变基。如果遇到代码冲突也不用慌:
- 打开冲突文件,手动解决冲突(找到
<<<<<<<、=======、>>>>>>>标记的部分,保留正确代码) - 解决完所有冲突后执行
git add .暂存修改 - 执行
git rebase --continue让变基流程继续,直到完成
变基结束后,你的分支就会基于最新的master,且只有一个包含你所有4次变更的干净提交了。
最后,因为你之前已经推送过这个分支到远程,现在提交历史被修改,需要用强制推送更新远程分支——这里推荐用--force-with-lease,比直接--force更安全,它会检查远程分支是否有其他人的新提交,避免误覆盖别人的工作:
git push origin 你的分支名称 --force-with-lease
另外还有一种简化方法,如果你能准确找到分支从master分叉的提交点:
- 先获取分叉点的commit哈希:
git merge-base master 你的分支名称 - 执行软重置:
git reset --soft 刚才得到的哈希,这时候工作区和暂存区的所有修改都会保留,只是分支指针回到分叉点 - 暂存所有修改:
git add . - 提交为一个新的commit:
git commit -m "你的合并提交说明" - 同样用
git push origin 你的分支名称 --force-with-lease推送到远程
不过相对来说,交互式变基的方法更直观,能清晰看到每一步要处理的提交,也更可控。
内容的提问来源于stack exchange,提问作者Aada
相关产品推荐
相关产品推荐

