重写git历史记录以拉平合并提交

时间:2018-08-08 07:42:33

标签: git git-merge git-filter-branch git-squash

我正在将几个相关项目移入一个monorepo,以保留每个项目的历史。

每个有问题的项目都有自己的仓库。此外,每个项目的开发都严重依赖--no-ff合并,以将主题分支重新集成到master分支中。

我已经尝试过shopsys/monorepo-tools,并成功地产生了具有联合历史的monorepo。

我还发现,在大多数情况下,主题分支都相当长,并且包含初始实施,复审修订以及有时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,但是我还不能完全理解它的多种选择,因此,如果有人可以向正确的方向推我,我将非常感激。

1 个答案:

答案 0 :(得分: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'

更改为:

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