You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何自动合并分支上所有合并提交(类似git rebase --squash-merges效果)

如何自动将分支提交 squash 到对应合并提交以清理混乱的Git历史?

我正在梳理一个多团队长期协作的大型特性分支,该分支包含数百个提交。由于公司政策限制无法统一合并策略,分支提交历史混乱:既有大量squash merge,又有数十个合并提交。执行简单的git rebase -i时,合并中的单个提交常与并行开发的其他合并提交产生冲突。

使用git rebase -i --rebase-merges可以手动调整提交和合并操作,但手动处理数十个提交的顺序和合并逻辑极易出错,比如误将提交squash到错误的合并提交或搞乱提交顺序。

Git本身清楚各提交所属的合并提交,理论上可以通过自动化操作避免人为失误。我想要类似git rebase --squash-merges的功能,自动将每个提交squash到对应的合并提交中(就像当初采用squash merge的效果一样),但这个功能似乎不存在,有没有办法通过一系列Git命令实现?

是否能让Git自动遍历分支提交,按正确顺序将零散提交squash到对应合并提交中,无需手动操作以规避失误?


提交历史示例(git rebase -i --rebase-merges some-branch输出片段)

这里有两个各含一个提交的合并,以及两个squash merge。由于提交与合并的时间间隔,常规rebase会在"make widget"和"Create McGuffin"之间产生冲突:

pick af697c57 Release: 1.2.1
label branch-point-9
pick 3e50d3ae XYZ-32: Create McGuffin (#394)
label merge

# Branch org-XYZ-29-make-widget
reset branch-point-9 # Release: 1.2.1
pick 4d53b13c feat: make widget for XYZ-29
merge -C 0d9d6676 merge # merge
label org-XYZ-29-make-widget

# Branch merge-2
reset merge # XYZ-32: Create McGuffin (#394)
merge -C 04d11323 org-XYZ-29-make-widget # Merge pull request #400 from org/XYZ-29/make-widget
pick 060bbde5 XYZ-27: splice mainbrace (#399)
pick 50ae56cf XYZ-36: reticulate splines (#397)
label merge-2

期望的压缩后结果

利用Git已知的提交归属和合并解决信息,自动压缩为如下形式(应无冲突,因为冲突已在合并时解决):

pick af697c57 Release: 1.2.1
pick XXXXXXXX XYZ-32: Create McGuffin (#394) # commit squashed into its merge commit
pick YYYYYYYY Merge pull request #400 from org/XYZ-29/make-widget # commit squashed into its merge commit
pick 060bbde5 XYZ-27: splice mainbrace (#399)
pick 50ae56cf XYZ-36: reticulate splines (#397)

手动通过交互式rebase可以实现这个效果:将提交按归属移至对应合并提交下并squash,再将squash后的合并作为普通提交选取,但大规模操作时很容易出错。

内容的提问来源于stack exchange,提问作者user56reinstatemonica8

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 16:07:37