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

iva*_*lev 5 git git-merge git-filter-branch git-squash

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

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

我已经尝试过shopsys/monorepo-tools并成功地制作了一个具有连接历史的 monorepo。

我还发现,大多数情况下,主题分支相当长,并且包含初始实施、审查修复和有时master -> topic合并的历史。当然,这些信息似乎是无关紧要的——只有使其变得master真正重要的变化。

所以我一直在考虑重写这些项目的历史,然后再将它们全部合并到一个 repo 中。我想从这个状态实现重写历史:

...
|
* Merge branch 'feature/XYZ'
|\
| * feature/XYZ#3 Review fixes part 2
| * feature/XYZ#2 Review fixes
| * feature/XYZ#1 Hack, hack, hack 
|/
* Initial commit
Run Code Online (Sandbox Code Playgroud)

到这个状态:

...
|
* squashed: feature/XYZ#1 + feature/XYZ#2 + feature/XYZ#3 
|
* Initial commit
Run Code Online (Sandbox Code Playgroud)

我想对历史上的每一次合并重复这一点。我想我必须使用git filter-branch,但我还不能完全理解它的多个选项,所以如果有人能将我推向正确的方向,我将非常感激。

jo_*_*jo_ 3

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

# git checkout -b trying_jo_solution
# git rebase -i <Initial comit sha or tag>
Run Code Online (Sandbox Code Playgroud)

将会呈现:

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'
Run Code Online (Sandbox Code Playgroud)

改成:

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'
Run Code Online (Sandbox Code Playgroud)

然后你将有机会改写评论(22222)

至:压扁:特征/XYZ#1 + 特征/XYZ#2 + 特征/XYZ#3

完毕 !检查它看起来像你想要的吗

那么你只需要更改分支主位置

#git branch -f master
#git push -f origin master
Run Code Online (Sandbox Code Playgroud)