我目前的情况是这样:
问题:
如何从 repo1 恢复所有丢失的历史记录并将其添加到 repo2 ?
我基本上需要在 repo2 中存储所有代码 history 。
答案 0 :(得分:2)
将所有内容都放入repo2是容易的部分。更大的问题是,对您(或repo2的其他用户)来说,无缝的结果历史记录对您有多重要。
在repo2中,您可以将repo1添加为远程服务器并获取历史记录。
$ cd path/to/repo2
$ git remote add old-history path/to/repo1
$ git fetch old-history
在简化的世界中,每个回购都只有一个master
分支,这会给您类似的东西
O -- x -- x -- x <--(old-history/master)
O2 -- x -- x <--(master)
因此历史记录存在并且可以查询,但是您必须全力以赴才能查看它。 (如果每个回购都具有多个分支,则图片会更复杂,但基本相同。)
假设old-history/master
的提交内容与O2
相同,则可以在单个克隆中使用git replace
使历史记录或多或少地无缝。 (如果没有提交,您总是可以将这样的提交添加到old-history/master
中。)git replace
有一些怪癖,因此,如果您要遵循这种做法,请参考{{3 }}
您还可以进行历史记录重写以永久合并历史记录。这是一种更极端的措施,需要与共享repo2
的所有其他用户进行某种协调,但这是“一次做完”的解决方案(与replace
相比,它仅影响一个本地克隆)。
要重写历史记录,可以使用--parent-filter
中的git filter-branch
(请参阅https://git-scm.com/docs/git-replace),或者大概可以使用git filter-repo
(尽管我不知道有关该命令的更多信息)。进行任何形式的重写都有一些注意事项。您可以在SO上搜索有关此过程的大量讨论,或参考git文档以获取有关重写共享历史记录的信息。