Git多分支合并:合并到master时如何将多提交合并为单次提交
看起来你是想清理Branch_2的提交历史,把那些包含合并操作的零散提交整合成一个干净的提交,再合并到master分支对吧?我给你两种常用的方案,你可以根据需求选择:
方案一:先在Branch_2上整理提交历史(修改分支历史)
这种方法会直接修改Branch_2的提交记录,把所有目标提交合并成一个,之后再合并到master:
- 首先切换到你的Branch_2分支:
git checkout Branch_2 - 执行交互式变基,以master的最新提交为基准(这样会把Branch_2上所有比master新的提交列出来):
这时候会弹出一个文本编辑器,里面是Branch_2从与master分叉后所有提交的列表,每一行开头是git rebase -i masterpick。 - 修改提交列表:把除了第一行之外的所有
pick改成squash(或者简写s)。这样Git会把这些提交都合并到第一个提交里。举个例子,假设列表开头是:
pick fd543bf changed c
pick 3f472ef install package
pick 1087d5d Merge remote-tracking branch 'origin/Branch_1' into Branch_2
...
你要改成:
pick fd543bf changed c
squash 3f472ef install package
squash 1087d5d Merge remote-tracking branch 'origin/Branch_1' into Branch_2
... - 保存并关闭编辑器,接下来会弹出另一个编辑器让你填写合并后的提交信息,改成你想要的内容,比如
changed R-All consolidated,然后保存关闭。 - 如果变基过程中遇到冲突,先手动解决冲突,然后执行:
重复这个过程直到变基完成。git add . git rebase --continue - 现在Branch_2已经是一个干净的单一提交了,切换到master并合并:
git checkout master git merge Branch_2
⚠️ 注意:如果Branch_2已经推送到远程仓库(比如origin/Branch_2),因为你修改了提交历史,需要强制推送:
git push -f origin Branch_2
但这个操作会覆盖远程的Branch_2历史,如果有其他同事在这个分支上工作,一定要提前和他们沟通!
方案二:直接在master上做压缩合并(不修改Branch_2历史)
如果你不想改动Branch_2的原始提交记录,可以直接在master上用squash合并,把Branch_2的所有修改打包成一个新提交:
- 切换到master分支并确保是最新的:
git checkout master git pull origin master - 执行压缩合并:
这个命令会把Branch_2上所有的修改都暂存到master的工作区,但不会自动提交。git merge --squash Branch_2 - 手动提交这个合并后的修改,填写你想要的提交信息:
git commit -m "changed R-All consolidated" - 现在master上就有一个包含Branch_2所有修改的单一提交了,而Branch_2的原始提交历史完全保留,不需要强制推送远程分支。
这两种方法都能达到你想要的效果,如果你需要保留Branch_2的原始历史,就选方案二;如果想让Branch_2本身的历史也干净,就选方案一~
内容的提问来源于stack exchange,提问作者dbNovice

