我一直在玩变基,试图拆分和合并历史记录,如下所述:https : //git-scm.com/book/en/v2/Git-Tools-Replace
这是我的带有拆分历史记录的测试存储库:https : //github.com/defufna/split-history
请注意,“初始提交”和“添加描述”提交都指向同一棵树。我要做的是合并这两个历史记录(同时保持合并)。我用过这个:
git rebase --rebase-merges --onto history 94da9b0f
Run Code Online (Sandbox Code Playgroud)
这有效,但我在 084dae5 遇到冲突。这是一个解决修改/删除冲突的合并,它需要我手动解决这个冲突。
我这样做是为了准备更大的 repo 合并,在那里我将不得不做类似的事情,但有 50k 次提交,所以我想避免手动解决冲突。我知道 git replace 可以解决我的问题,但我很好奇是否可以在不替换的情况下做到这一点。我还想在历史分支中保留提交的 sha 值。
编辑:
所以我已经设法做我想做的事,但我不确定这个想法有多好。我已经添加了 -i 到 rebase,当我得到 todo 文件时,我已经改变了每个
merge -C 9751be2 Merge # Merge
Run Code Online (Sandbox Code Playgroud)
线入:
exec git checkout `git commit-tree '9751be2^{tree}' -p HEAD -p refs/rewritten/Merge -m Merge`
Run Code Online (Sandbox Code Playgroud)
我基本上是在遇到合并时告诉 git 重用原始合并中的树。
它按预期工作(目前),但速度要慢得多。有一个更好的方法吗?
请注意,“初始提交”[94da] 和“添加描述”[c00e] 提交都指向同一棵树
有一个更好的方法吗?
很多。
git replace --graft 94da c00e^
git filter-branch master
Run Code Online (Sandbox Code Playgroud)
你就完成了。
git rebase存在的目的是将更改重新应用到不同的基础内容上,生成包含新内容的快照。你已经拥有了所有你想要的快照,你只需要重新连接祖先即可。 git replace --graft在本地进行,让您可以随意尝试。 git filter-branch存在的目的是在应用任何超级简单的内容更改的同时烘焙重新布线的祖先 - 但你甚至没有任何这些。你只是想重新连接master历史。