重写 git 历史以展平合并提交
Rewriting git history to flatten merge commits
我正在将几个相关项目移动到一个 monorepo 中,保留每个项目的历史记录。
每个有问题的项目都有自己的回购协议。此外,每个项目的开发都严重依赖 --no-ff
合并,以将主题分支重新整合到 master 分支中。
我已经尝试过 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
到这个状态:
...
|
* squashed: feature/XYZ#1 + feature/XYZ#2 + feature/XYZ#3
|
* Initial commit
我想对历史上的每一次合并重复这一点。我想我必须使用 git filter-branch
,但我还不能完全理解它的多个选项,所以如果有人能在正确的方向上推动我,我将不胜感激。
我会先做一个特定的分支来保持原始状态(以防万一:))
然后使用 git 变基:
# 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
我正在将几个相关项目移动到一个 monorepo 中,保留每个项目的历史记录。
每个有问题的项目都有自己的回购协议。此外,每个项目的开发都严重依赖 --no-ff
合并,以将主题分支重新整合到 master 分支中。
我已经尝试过 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
到这个状态:
...
|
* squashed: feature/XYZ#1 + feature/XYZ#2 + feature/XYZ#3
|
* Initial commit
我想对历史上的每一次合并重复这一点。我想我必须使用 git filter-branch
,但我还不能完全理解它的多个选项,所以如果有人能在正确的方向上推动我,我将不胜感激。
我会先做一个特定的分支来保持原始状态(以防万一:)) 然后使用 git 变基:
# 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