2010-03-11 120 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」。

相關問題