恢复git repositoy历史并将其添加到现有的

时间:2020-04-16 18:46:54

标签: git github repository bitbucket git-clone

我目前的情况是这样:

  • 我有一个存储库( repo1 ),原始的
  • 已创建一个新的空存储库( repo2
  • repo1 中的所有内容均已复制到 repo2 ,但未复制 git历史记录
  • 现在已经提交了许多更改并将其推送到 repo2

问题:

如何从 repo1 恢复所有丢失的历史记录并将其添加到 repo2

我基本上需要在 repo2 中存储所有代码 history

1 个答案:

答案 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文档以获取有关重写共享历史记录的信息。