Git特性分支合并请求:拉取develop后如何合并为单个提交重提MR?
操作步骤
方式1:交互式变基(推荐)
这是整理提交历史最常用的方式,能精准合并指定提交:
- 通过
git log找到你最初提交feature代码的哈希值(记为<initial-commit-hash>),或者直接数出需要合并的提交总数(比如包含原提交、新修改提交、合并develop的提交共3个,就用HEAD~3)。 - 执行交互式变基命令:
git rebase -i HEAD~3 # 也可以用原提交的父哈希:git rebase -i <initial-commit-hash>^ - 在弹出的编辑器中,把除第一行外的
pick改成squash(可缩写为s),示例:pick a1b2c3 最初的feature功能提交 squash d4e5f6 新增的修复内容 squash g7h8i9 Merge branch 'develop' of xxx - 保存退出后,Git会让你编辑合并后的提交信息,修改成清晰统一的描述后保存即可。
- 由于远程分支的提交历史已被修改,需要安全强制推送:
git push origin your-feature-branch --force-with-lease
方式2:重置后重新提交
如果觉得变基操作复杂,也可以用重置暂存的方式:
- 重置到最初的feature提交,保留所有后续修改到暂存区:
git reset --soft <initial-commit-hash> - 检查暂存区内容无误后,重新提交:
git commit -m "统一的feature提交描述" - 同样执行安全强制推送:
git push origin your-feature-branch --force-with-lease
最佳实践
- 同步develop用rebase而非merge:后续拉取develop更新时,改用
git pull origin develop --rebase,会把你的feature提交直接“移”到最新的develop分支顶端,不会产生多余的合并提交,保持提交历史线性,后续整理单个提交更简单。 - 开发分临时提交,MR前统一合并:开发feature时可以分多个小提交方便回溯,但发起MR前,通过交互式变基把这些小提交合并成一个有意义的原子提交。
- 强制推送必加--force-with-lease:永远不要直接用
git push --force,--force-with-lease会检查远程分支是否有你本地未同步的提交,避免误覆盖队友的修改。 - 操作前确保工作区干净:执行变基或重置前,先用
git stash暂存未提交的修改,或者提交临时修改,防止代码丢失。
内容的提问来源于stack exchange,提问作者sina
相关产品推荐
相关产品推荐

