我有一個Git倉庫(A),其中包含一個項目的開發,直到某個點。然後我失去了這個回購A的USB棒。幸運的是我有最新的提交備份,所以我可以在稍後導入最新項目狀態並繼續開發的情況下創建新的存儲庫(B)。 現在我恢復了丟失的USB存儲棒,所以我有兩個Git存儲庫。如何將一個Git存儲庫重新綁定到另一個?
我想我只需要將repo B轉換爲repo A不知何故,但我不知道如何做到這一點,也許使用fetch/pull和rebase?
我有一個Git倉庫(A),其中包含一個項目的開發,直到某個點。然後我失去了這個回購A的USB棒。幸運的是我有最新的提交備份,所以我可以在稍後導入最新項目狀態並繼續開發的情況下創建新的存儲庫(B)。 現在我恢復了丟失的USB存儲棒,所以我有兩個Git存儲庫。如何將一個Git存儲庫重新綁定到另一個?
我想我只需要將repo B轉換爲repo A不知何故,但我不知道如何做到這一點,也許使用fetch/pull和rebase?
如果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
如果A和B是相同的回購(第一SHA1是常見的),可以:
git remote add A /path/to/A
git fetch A
到update all remote A branches在B回購git checkout dev
(在B,你在哪裏開發)git rebase A/devBranch
重播B(即你開發什麼,或者從備份重新開發)上的A/devBranch
頂部(發展你丟失)。有點像這樣SO question。最後一步可以讓你與你失去了一個同步你的開發。
但實際上,一旦你擁有了從A中獲取數據,完成:B現在包含「所有」歷史(在你失去了一個和你現在的工作)
首先,通過使工作克隆啓動的回購A.
然後只需從B中拉入併合並。你可能更喜歡創建一個新的分支,拉到它,然後合併兩個分支。你可能還需要一個強制標誌;我已經做了這樣的事情在水銀(嫁接兩個明顯無關的庫一起),它需要「-f」。
爲了照顧「其他場景」,A和B在提交歷史中完全不同。 – VonC 2010-03-11 21:25:18
這是一個很棒的幫助;盡最大努力做到了我想要的東西。謝謝! – 2011-02-18 02:41:24
我剛剛使用了子樹合併的方法將幾個存儲庫縫合爲一個。我先後失敗,試圖將它們彼此重新綁定。使用移植點,我現在可以將它們縫合到單個開發時間表上,謝謝! – 2011-04-19 14:55:51