合并-如何将一个Git存储库重新建立到另一个存储库?

我有一个Git存储库(A),其中包含一个项目的开发工作,直到某个时候。 然后我丢失了这个回购A所在的USB记忆棒。 幸运的是,我有最新提交的备份,因此我可以在以后导入新项目状态并继续开发的地方创建一个新的存储库(B)。现在,我恢复了丢失的USB记忆棒,因此我有两个Git存储库。

我想我只需要以某种方式将存储库B重新配置为存储库A,但我不知道如何执行此操作,也许是使用fetch / pull和rebase?

kroimon asked 2019-11-15T21:00:05Z
3个解决方案
62 votes

如果A和B不是相同的存储库(您通过使用拥有的最新工作副本创建了B),则必须使用嫁接来假装它们具有相同的历史记录。

假设您已按照VonC的答案将A添加为B的遥控器,那么仓库如下所示:

~/B$ git tnylog 
* 6506232 (HEAD, master) Latest work on B
* 799d6ae Imported backup from USB stick
~/B$ git tnylog A/master
* 33b5b16 (A/master) Head of A
* 6092517 Initial commit

创建一个嫁接,告诉B的根,其父级是A的头:

echo '799d6aeb41095a8469d0a12167de8b45db02459c 33b5b16dde3af6f5592c2ca6a1a51d2e97357060' \
 >> .git/info/grafts

现在,当您请求B的历史记录时,上面的两个历史记录将显示为一个。将移植物永久化是一个简单的git filter-branch,没有参数。 不过,在过滤器分支之后,您不在任何分支上,因此您应该git branch -D master; git checkout -b master


1 git tnylog = git log --oneline --graph --decorate

Josh Lee answered 2019-11-15T21:00:52Z
30 votes

如果A和B是相同的存储库(第一个SHA1是通用的),则可以:

  • 声明A为B的遥控器:git rebase A/devBranch
  • git rebase A/devBranch更新B存储库上的所有远程A分支
  • git rebase A/devBranch(在您正在开发的B上)
  • git rebase A/devBranchA/devBranch(丢失的开发)之上重播B(即您开发的内容或从备份中重新开发的内容)。 有点像这样的问题。

最后一步使您可以将开发人员与丢失的开发人员同步。
但是实际上,一旦您从A处获取,就可以完成:B现在包含“全部”历史记录(丢失的记录和当前的工作)

VonC answered 2019-11-15T21:01:55Z
2 votes

首先,从复制repo A的工作克隆开始。

然后只需从B拉入并合并即可。 您可能更喜欢创建一个新分支,拉到该分支上,然后合并两个分支。 您可能还需要一个强制标志。 我已经在Mercurial中完成了类似的工作(将两个看似无关的存储库移植在一起),并且它需要“ -f”。

crazyscot answered 2019-11-15T21:02:27Z
translate from https://stackoverflow.com:/questions/2428137/how-to-rebase-one-git-repository-onto-another-one