2010-03-11 112 views
42

我有一个Git仓库(A),其中包含一个项目的开发,直到某个点。然后我失去了这个回购A的USB棒。幸运的是我有最新的提交备份,所以我可以在稍后导入最新项目状态并继续开发的情况下创建新的存储库(B)。 现在我恢复了丢失的USB存储棒,所以我有两个Git存储库。如何将一个Git存储库重新绑定到另一个?

我想我只需要将repo B转换为repo A不知何故,但我不知道如何做到这一点,也许使用fetch/pull和rebase?

回答

57

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

让我们假设你已经添加了一个为B中每VonC’s answer远程和回购看起来像这样:

~/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


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

+2

为了照顾“其他场景”,A和B在提交历史中完全不同。 – VonC 2010-03-11 21:25:18

+3

这是一个很棒的帮助;尽最大努力做到了我想要的东西。谢谢! – 2011-02-18 02:41:24

+1

我刚刚使用了子树合并的方法将几个存储库缝合为一个。我先后失败,试图将它们彼此重新绑定。使用移植点,我现在可以将它们缝合到单个开发时间表上,谢谢! – 2011-04-19 14:55:51

24

如果A和B是相同的回购(第一SHA1是常见的),可以:

  • 声明一个作为B中的远程:git remote add A /path/to/A
  • git fetch Aupdate all remote A branches在B回购
  • git checkout dev(在B,你在哪里开发)
  • git rebase A/devBranch重播B(即你开发什么,或者从备份重新开发)上的A/devBranch顶部(发展你丢失)。有点像这样SO question

最后一步可以让你与你失去了一个同步你的开发。
但实际上,一旦你拥有了从A中获取数据,完成:B现在包含“所有”历史(在你失去了一个和你现在的工作)

+0

谢谢,似乎工作,就必须解决合并过程中一些冲突/现在变基:) – kroimon 2010-03-11 21:13:55

+0

@kroimon:冲突是不可避免的,我想,因为你是重新开发B中承诺在A中的代码的某些部分 – VonC 2010-03-11 21:24:46

+0

我结束了一个分离的HEAD,并不得不引用此:https://stackoverflow.com/a/25670296/1807668 – 2017-06-13 23:01:40

2

首先,通过使工作克隆启动的回购A.

然后只需从B中拉入并合并。你可能更喜欢创建一个新的分支,拉到它,然后合并两个分支。你可能还需要一个强制标志;我已经做了这样的事情在水银(嫁接两个明显无关的库一起),它需要“-f”。

相关问题