如何将一个Git存储库重新绑定到另一个存储库?

时间:2010-03-11 19:47:01

标签: git merge repository rebase

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

我想我不得不以某种方式将回购B重新命名为回购A,但我不知道怎么做,也许使用fetch / pull和rebase?

4 个答案:

答案 0 :(得分:61)

如果A和B不是同一个仓库(您使用最新的工作副本创建了B),则必须使用graft假装他们有共同的历史记录。

假设您已根据VonC’s answer将A添加为B的远程,并且回购看起来像 1

~/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,没有参数。但是,在filter-branch之后,您不在任何分支上,因此您应该git branch -D master; git checkout -b master


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

答案 1 :(得分:27)

如果A和B是相同的仓库(第一个SHA1是常见的),您可以:

  • 将A声明为B的远程:git remote add A /path/to/A
  • 在B repo上
  • git fetch Aupdate all remote A branches
  • git checkout dev(在B,您正在开发的地方)
  • git rebase A/devBranchA/devBranch(您丢失的开发)之上重播B(即您从备份中开发或重新开发的内容)。有点像SO question

最后一步允许您将您的开发者与您丢失的开发者同步 但实际上,一旦你从A获取,你就完成了:B现在包含“ all ”历史记录(你丢失的那个和你当前的工作)

答案 2 :(得分:2)

首先,首先制作一个repo A的工作克隆。

然后只需从B中拉入并合并即可。您可能更喜欢创建一个新分支,拉入它,然后合并两个分支。你可能还需要一个强制标志;我在Mercurial中完成了这样的事情(将两个显然不相关的存储库嫁接在一起),它需要“-f”。

答案 3 :(得分:2)

2021 年更新

git filter-branch 自 Git 2.24(2019 年第四季度)以来一直是 deprecated。相反,对于 A 和 B 不是同一个 repo 的场景,您可以使用 git replace --graft <commit> <parent>

见: