在 git 中合并拆分历史记录

Merging split history in git

我一直在玩变基,尝试按照此处所述拆分和合并历史记录: https://git-scm.com/book/en/v2/Git-Tools-Replace

这是我的测试存储库,其中包含拆分历史记录: https://github.com/defufna/split-history

请注意 "initial commit" 和 "Added description" 提交都指向同一棵树。我要做的是合并这两个历史记录(同时保持合并)。我用过这个:

git rebase --rebase-merges --onto history 94da9b0f

这行得通,但我在 084dae5 遇到了冲突。这是解决modify/delete冲突的merge,需要我手动解决这个冲突。

我这样做是为了准备更大的回购合并,我将不得不做类似的事情但有 50k 次提交,所以我想避免手动解决冲突。 我知道 git 替换可以解决我的问题,但我很好奇是否可以在不替换的情况下做到这一点。我还想在历史分支中保留提交的 sha 值。

编辑:

所以我已经设法做了我想做的事,但我不确定这个想法有多好。 我已经添加了 -i 到 rebase,当我得到 todo 文件时,我已经改变了每个

merge -C 9751be2 Merge # Merge

行成:

exec git checkout `git commit-tree '9751be2^{tree}' -p HEAD -p refs/rewritten/Merge -m Merge`

我基本上是在告诉 git 每当遇到合并以重用原始合并中的树时。

它按预期工作(目前),但速度慢了很多。有更好的方法吗?

Note that "initial commit"[94da] and "Added description"[c00e] commits both point to the same tree

Is there a better way to do this?

很多。

git replace --graft 94da c00e^
git filter-branch master

大功告成。

git rebase 的存在是为了将更改重新应用到不同的基础内容上,从而生成具有新内容的快照。你已经有了所有你想要的快照,你只需要重新连接祖先。 git replace --graft本地做,让你随便试验。 git filter-branch 的存在是为了在应用任何超级简单的内容更改时融入重新布线的祖先——但你甚至没有任何这些。您只想重新连接 master 历史记录。