2012-06-27 35 views
3

另一個git的問題...我在下面的情況:正確變基合併

A1 ---- B1 ---- C1 
        \ 
        > D ---- E ---- F 
       /
A2 ---- B2 ---- C2 

凡{A1,B1,C1}和{A2,B2,C2}有沒有公共文件(這是合併兩個不同的存儲庫的結果,所以我現在有兩個根)

我想歷史上像這樣

A1 ---- B1 ---- C1 ---- A2 ---- B2 ---- C2 ---- D ---- E --- F 

但我想不出如何用git-rebase做到這一點,任何想法?

獎勵:如果我能保持標籤(我對所有三個部門),而不必做手工......

+0

您是否嘗試使用交互模式? –

+0

我知道什麼是互動模式,但我無法找到我應該給予的基礎,以便他做我想做的事! – Immae

回答

3

合併的方式,兩個庫我設法用下面的兩個命令來做到這一點共同文件,按順序:

git filter-branch -f --parent-filter 'test $GIT_COMMIT = <a2> && echo "-p <c1>" || cat' 
git filter-branch -f --parent-filter 'test $GIT_COMMIT = <new head> && echo "-p <c2>" || cat' 

當然,您必須用相應的提交哈希替換<a2><c1>,<new head>等。請注意,第一個命令後頭部的哈希值會發生變化,這就是我稱之爲<new head>而不僅僅是<d>的原因。

實際上它非常簡單:第一個命令將C1設置爲A2的父項。第二個命令通過將C2設置爲D的唯一父項來修復該圖。

+0

你的答案簡短而有效。我喜歡我的意思,它讓我對git的工作方式有了一個新的認識,但現在我知道了你的無疑更好:) – Immae

+0

(順便說一句,我看到你在我面前回答了我的問題,但我很高興我沒有看到它,然後我發現我的解決方案,否則我不會看得更遠) – Immae

+0

是的,玩弄git總是很好的理解。我從你的答案中學到了東西,例如我不知道'git replace',看起來很有用!反之亦然,我也很高興在找到我的解決方案之前,我沒有閱讀您的答案。與你的原因相同:D –

1

好,我想出了一個辦法做到這一點。因爲它給出了一個大起來的git的內部的理解,我給一個詳細的解答在這裏:

首先,你必須給到A2新的父親,因爲它以前是沒有的:

git cat-file commit A2 

產生一個沒有「父母出現」的摘要。因此,創建行,並創建一個新的哈希:

git cat-file commit A2 | sed -e '2aparent C1' | git hash-object -t commit -w --stdin 

這會給哈希{H1}作爲輸出,我們使用這個新的哈希更換A2:

git replace A2 H1 

瞧A2現在有C1作爲父母。但現在的歷史看起來像這樣:

A1 ---- B1 ---- C1 --------------------- D ----- E ----- F 
        \     /
        A2 ---- B2 ---- C2 

所以照此d,其中有兩個親本(C1和C2):

git cat-file commit D 

刪除對應C1「父」行,哈希,並替換:

H2=`git cat-file commit D | sed -e '/parent C1/d' | git hash-object -t commit -w --stdin` 
git replace D H2 

它看起來像它爲我工作。如果我理解我做了什麼,這很好,因爲我在這兩個存儲庫上都有不同的文件。我想事情會變得錯的,如果我不得不在D.