重写Git历史以扁平化合并提交

5

我正在将几个相关项目合并到一个单体库中,保留每个项目的历史记录。

这些项目中的每一个都有自己的存储库。此外,每个项目的开发都严重依赖于--no-ff合并,以便将主题分支重新集成到主分支中。

我已经尝试使用shopsys/monorepo-tools并成功创建了一个具有联合历史记录的单体库。

我还发现大多数时候主题分支相当长,并包含最初实现、审查修复和有时的master->topic合并的历史记录。显然,这些信息有点不相关 - 只有进入master的更改才真正重要。

因此,在将它们全部合并到一个仓库之前,我一直在考虑重写这些项目的历史记录。我希望从这种状态下实现历史记录的重写:

...
|
* Merge branch 'feature/XYZ'
|\
| * feature/XYZ#3 Review fixes part 2
| * feature/XYZ#2 Review fixes
| * feature/XYZ#1 Hack, hack, hack 
|/
* Initial commit

到这个状态:
...
|
* squashed: feature/XYZ#1 + feature/XYZ#2 + feature/XYZ#3 
|
* Initial commit

我希望能够针对历史中的每次合并重复此操作。我认为我需要使用git filter-branch,但是我还不能完全理解它的多个选项,所以如果有人能指导我正确的方向,我将不胜感激。


你不想使用 git rebase -i 吗? - jo_
1个回答

2

我建议首先创建一个特定的分支来保留原始状态(以防万一 :)),然后使用git rebase:

# git checkout -b trying_jo_solution
# git rebase -i <Initial comit sha or tag>

将会显示:

pick 11111 Initial commit
pick 22222 feature/XYZ#1 Hack, hack, hack
pick 33333 feature/XYZ#2 Review fixes
pick 44444 feature/XYZ#3 Review fixes part 2
pick 55555 Merge branch 'feature/XYZ'

change to:

pick 11111 Initial commit
r 22222 feature/XYZ#1 Hack, hack, hack
f 33333 feature/XYZ#2 Review fixes
f 44444 feature/XYZ#3 Review fixes part 2
f 55555 Merge branch 'feature/XYZ'

那么你将有机会重新修改评论(在22222上)

至:压缩:feature/XYZ#1 + feature/XYZ#2 + feature/XYZ#3

完成!检查一下,看起来是否符合你的要求

然后你只需要更改主分支的位置即可

#git branch -f master
#git push -f origin master

它运行得非常好!谢谢!只是有一个小补充:如果没有给出--preserve-merges选项,合并提交将不参与交互式变基。当保留合并时,git将拒绝将其压缩到任何其他提交中。但是,这是无关紧要的,因为我不需要合并,所以我可以将主题分支提交压缩在一起,并将它们应用于主分支。 - ivanmoskalev
rebase 的唯一两个问题是:(1) 需要大量手动操作,(2) 我需要再次解决合并冲突。但由于团队已经使用了 pull requests,并且几乎没有出现过合并时的冲突解决,所以第二个问题对我来说不是那么严重(但在其他情况下可能会成为阻碍)。 - ivanmoskalev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接