我现在的情况是这样的:
- 我有一个存储库(repo1),原来的
- 创建了一个新的空存储库 ( repo2 )
- 来自repo1的所有内容都被复制到repo2,但不是git history
- 现在已经提交了很多更改并推送到repo2
问题:
如何从repo1恢复所有丢失的历史并将其添加到repo2?
我基本上需要repo2中的所有代码历史记录。
我现在的情况是这样的:
问题:
如何从repo1恢复所有丢失的历史并将其添加到repo2?
我基本上需要repo2中的所有代码历史记录。
将所有内容放入 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上的文档-代替O2
git replace
old-history/master
git replace
您还可以进行历史重写以永久合并历史。这是一种更极端的措施,需要与共享 的任何其他用户进行一些协调repo2
,但它是一种“做一次就完成”的解决方案(相比之下replace
,它只影响一个本地克隆)。
要进行历史重写,您可以使用--parent-filter
of git filter-branch
(请参阅https://git-scm.com/docs/git-filter-branch),或者大概可以使用git filter-repo
(尽管我对该命令知之甚少)。进行任何形式的重写都有一些警告。您可以在 SO 中搜索有关此过程的大量过去讨论,或参阅 git 文档以获取有关重写共享历史的信息。