2013-10-06 37 views
4

我有一個包含多個存儲庫的目錄,它看起來像這樣:將多個孤兒分支成一路

folder 
|- repo1 
| |- .git 
| |- File1.txt 
|- repo2 
| |- .git 
| |- File2.txt 
|- repo3 
| |- .git 
| |- File3 

我想將它們合併爲單一的Git倉庫而我做了由 以下these說明。

這些指令後,我有以下結構:

folder 
|- .git 
|- repo1 
| |- File1.txt 
|- repo2 
| |- File2.txt 
|- repo3 
| |- File3 

這是偉大的。 但現在我有主枝(從repo1)和從兩部孤兒分支:

* Merge repo3 
|\ 
| * Add third file 
* Merge repo2 
|\ 
| * Add second file 
* Add first file 

我希望得到的是這樣的

* Merge repo 3 
* Add third file 
* Merge repo 2 
* Add second file 
* Add first file 

甚至更​​好

* Add third file 
* Add second file 
* Add first file. 

是這樣的可能嗎?如何?


更多答案由VonC提供。

我開始與此:

$ git log --graph 
* commit 888bb0d7a81a40f8b42da7ad3f02103e898f5c1f 
|\ Merge: cf85078 eab1269 
| | Author: Bojan Delic <...> 
| | Date: Sun Oct 6 13:12:36 2013 +0200 
| | 
| |  Merge repo3 
| | 
| * commit eab1269be53929450c34c30416820c13a8058678 
| Author: Bojan Delic <...> 
| Date: Sun Oct 6 13:07:39 2013 +0200 
| 
|  Add third file 
| 
* commit cf85078ca96d52f2277ad7e4c6f45b04a38cf7ee 
|\ Merge: 92fa311 42333f8 
| | Author: Bojan Delic <...> 
| | Date: Sun Oct 6 13:12:33 2013 +0200 
| | 
| |  Merge repo2 
| | 
| * commit 42333f8589e20d29e5e444d5e16ff1a5d63b8288 
| Author: Bojan Delic <...> 
| Date: Sun Oct 6 13:07:09 2013 +0200 
| 
|  Add second file 
| 
* commit 92fa3113507548a62407431188c308685f72865d 
    Author: Bojan Delic <...> 
    Date: Sun Oct 6 13:06:39 2013 +0200 

     Add first file 

然後我做的:

$ git branch -v 
* master 888bb0d Merge repo3 
$ git checkout -b branch2 eab1269be53929450c34c30416820c13a8058678 
$ git checkout -b branch3 42333f8589e20d29e5e444d5e16ff1a5d63b8288 
$ git checkout branch2 
Switched to branch 'branch2' 
$ git rebase master 
First, rewinding head to replay your work on top of it... 
Fast-forwarded branch2 to master. 
$ git checkout master 
Switched to branch 'master' 
$ git merge branch2 
Already up-to-date. 
$ git checkout branch3 
Switched to branch 'branch3' 
$ git rebase master 
First, rewinding head to replay your work on top of it... 
Fast-forwarded branch3 to master. 
$ git checkout master 
Switched to branch 'master' 
$ git merge branch3 
Already up-to-date. 

之後:

$ git log --graph 
* commit 888bb0d7a81a40f8b42da7ad3f02103e898f5c1f 
|\ Merge: cf85078 eab1269 
| | Author: Bojan Delic <...> 
| | Date: Sun Oct 6 13:12:36 2013 +0200 
| | 
| |  Merge repo3 
| | 
| * commit eab1269be53929450c34c30416820c13a8058678 
| Author: Bojan Delic <...> 
| Date: Sun Oct 6 13:07:39 2013 +0200 
| 
|  Add third file 
| 
* commit cf85078ca96d52f2277ad7e4c6f45b04a38cf7ee 
|\ Merge: 92fa311 42333f8 
| | Author: Bojan Delic <...> 
| | Date: Sun Oct 6 13:12:33 2013 +0200 
| | 
| |  Merge repo2 
| | 
| * commit 42333f8589e20d29e5e444d5e16ff1a5d63b8288 
| Author: Bojan Delic <...> 
| Date: Sun Oct 6 13:07:09 2013 +0200 
| 
|  Add second file 
| 
* commit 92fa3113507548a62407431188c308685f72865d 
    Author: Bojan Delic <...> 
    Date: Sun Oct 6 13:06:39 2013 +0200 

     Add first file 

$ git branch -a 
    branch2 
    branch3 
* master 

回答

6

你可以變基您當前master的頂部的兩個孤兒分支(來自repo1

git checkout branch2 
git rebase master 
git checkout master 
git merge branch2 # fast-forward master to branch2 

git checkout branch3 
git rebase master 
git checkout master 
git merge branch3 # fast-forward master to branch3 

但是,你的情況(在後的問題編輯),有...無關:

這兩個孤兒分公司分別已經合併爲master
這就是爲什麼rebase只會將它們快速轉發到master ......因爲它們已經合併爲master
你可以放心地忽略eab126942333f:如果它們沒有被標籤或分支引用,它們將被垃圾收集。
例如,嘗試克隆你的回購,看看這些提交仍然在周圍(如果是,嘗試git gc --aggressive --prune=now於克隆)


注:混帳2。9(2016年6月)將讓你合併孤兒分支commit d04aa7e僅與--allow-unrelated-histories選項:

git merge --allow-unrelated-histories a b 
+0

也許我不明白,但沒有BRANCH2,只有'master'的和'HEAD ',並且他們指向提交'合併repo3',如果我添加了分支,指向提交'添加第三個文件'並且進行rebase和merge,就像你所建議的那樣,新分支移動到'合併repo3' commit,但是孤立分支仍然存在。 –

+0

@ del-boy你說有兩個孤兒分支,所以我把他們稱爲'branch2'和'branch3'。'git branch -v'返回什麼? – VonC

+0

是的,我很傷心有兩個孤兒分支,因爲我發現了這個術語,但是沒有任何指向anywh的真正的git分支除了主人之外,那指向頭。 'git branch -v'只返回'* master 888bb0d合併repo3'。 –