2

我现在的情况是这样的:

  • 我有一个存储库(repo1),原来的
  • 创建了一个新的空存储库 ( repo2 )
  • 来自repo1的所有内容都被复制到repo2,但不是git history
  • 现在已经提交了很多更改并推送到repo2

问题:

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

我基本上需要repo2中的所有代码历史记录

4

1 回答 1

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)

所以历史就在那里,可以查询,但你必须竭尽全力才能看到​​它。(如果每个repo有多个分支,图比较复杂,但基本一样。)

假设有一个与您可以在单个克隆中使用old-history/master的内容相同的提交,以使历史看起来或多或少是无缝的。(如果没有,你总是可以添加这样的提交。) 有一些怪癖,所以如果你想走这条路,请参阅https://git-scm.com/docs/git上的文档-代替O2git replaceold-history/mastergit replace

您还可以进行历史重写以永久合并历史。这是一种更极端的措施,需要与共享 的任何其他用户进行一些协调repo2,但它是一种“做一次就完成”的解决方案(相比之下replace,它只影响一个本地克隆)。

要进行历史重写,您可以使用--parent-filterof git filter-branch(请参阅https://git-scm.com/docs/git-filter-branch),或者大概可以使用git filter-repo(尽管我对该命令知之甚少)。进行任何形式的重写都有一些警告。您可以在 SO 中搜索有关此过程的大量过去讨论,或参阅 git 文档以获取有关重写共享历史的信息。

于 2020-04-16T19:22:08.640 回答