如何恢复删除历史记录的分叉的 git 历史记录?

How can I restore the git history of a fork where the history was deleted?

我有一个包含数百次提交的项目。它是另一个开源项目的分支。在创建分叉时,git 历史被擦除。现在我想重新附上历史。

原项目有数千次提交,称它们为:A <- B <- C <- D

与此同时,我们的分叉有:E <- F <- G <- H

分支不共享任何共同的祖先,但提交DE 具有完全相同的文件系统.创建 E 时,git 历史记录被擦除。

如何在不解决合并冲突的情况下重新附加它们?

我尝试过的解决方案:

到目前为止我遇到的所有解决方案都需要我解决冲突。这不是必需的,因为我正试图在文件系统相同的地方附加历史记录。

我只想将历史重新附加到它的来源。有什么想法吗?

你可以试试这个

git rebase --onto D E H

那应该将 F、G 和 H 置于 D 之上……嗯,不完全是。当然,那些将是原始修订的复制品。也就是说,假设E..H是一条直线。

更新

我创建了一个脚本,可以在另一个修订版 之上复制分支的历史记录,而 实际上没有像 rebase 那样做任何 cherry-picking 。它使用来自原始修订的信息即时创建新修订。当然包括合并。

https://github.com/eantoranz/git/blob/replay/contrib/replay

单独使用它,因此,如果您想执行类似 git rebase --the-real-deal --onto new-base old-base tip 的操作,您可以执行:./replay new-base old-base tip。来自问题中给出的示例:./replay D E H。它在标准输出中打印的单行是您要求重播的 the tip 的等效修订的 ID。