如何自动合并分支上所有合并提交(类似git rebase --squash-merges效果)
我正在梳理一个多团队长期协作的大型特性分支,该分支包含数百个提交。由于公司政策限制无法统一合并策略,分支提交历史混乱:既有大量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

