git 中的祖先只不过是一个提交(它是一个文本文件),其中包含一行或多行读取parent <hash of parent commit>
. 如果您想在第一次提交之前插入历史记录,则需要这样的父行(第一次提交没有),这将更改第一次提交的哈希,这意味着其后代需要更改父行指针,这会递归地通过所有提交,因为所有提交都是从 repo 的第一次提交。
如果您不担心会弄乱使用 fork 的人员(因为您将更改项目中的历史记录),那么您可以重做该操作以创建旧历史记录的第二个 git 存储库,将该存储库添加为远程您的新仓库并获取更改,现在您将在新仓库中有两个根。您可能会收到关于没有共同提交的警告;这可以。现在您可以查看历史以了解您的方位:git log --all --graph --oneline --decorate
,然后可能rebase --onto
将新 repo 的新工作移到您刚刚引入的旧 repo 的历史之上。大概您的新 repo 的第一次提交中的树将与中的树相同您的旧仓库的最后一次,所以这可能很简单: ,您刚刚引入的旧仓库历史中的最后一次提交在git rebase --onto A B C
哪里,A
B
是新 repo 中的第一次提交(这里被认为是新 repo 的“旧基础”,您不会重新基于旧历史,因为它应该是相同的,并且C
是分支的负责人在您想要基于此的新存储库中,可能master
。
你的 repos 可能比这更复杂,你可能需要做更多的工作来确定重新加入事物的接缝的确切位置,但这是一般的想法。现在你可以git remote rm newrepo
,“newrepo”是你在添加遥控器时命名的任何东西。这应该清除第二个根和所有获取的提交。最后,您可以强制将其推送到 github。这实际上会改变每个提交哈希,因此没有一个分支将起作用,但您将拥有所有历史记录,人们可以再次克隆,或者复制reset --hard
到新master
的以赶上。你可能想在你的 repo 页面上通知每个人,或者找到分叉的人并提醒他们你的意图。