2013-08-02 42 views
2

讓我們考慮以下地方git倉庫的場景,被同步到遠程:如何在主分支分歧時僅合併一次?

 
──(A)─┬─(B)── master 
     │ 
     └─(C)── branch 

合併分支到主(本地,需要很長的時間,因爲(C)=許多提交)後:

 
──(A)─┬─(B)─┬─(D)── master 
     │  │ 
     └─(C)─┘ branch 

在合併這件事發生在遠程倉庫:

 
──(A)───(B)───(E)── master 

現在,我希望能有這樣的結果:

 
──(A)─┬─(B)─┬─(D)──(E)── master 
     │  │ 
     └─(C)─┘ branch 

或這個結果

 
──(A)─┬─(B)───(E)─┬──(F)── master 
     │   │ 
     └────(C)────┘ branch 

即我不想讓更多的合併線。 通過再次合併很多東西(C),可以不花費很長時間嗎?

+0

讓我試着理解這一點,你想避免再次合併'C',因爲它需要很長時間?你知道爲什麼合併'C'需要這麼長時間嗎?這似乎很奇怪。 – 2013-08-02 11:35:32

+0

如果您已經完成合並;這意味着你的分支是2個落後,1個落後。現在,如果你做混帳(或提取和重新組織起源/ branchname)那些提交將被附加到C作爲D - E。那麼問題在哪裏? – forvaidya

回答

1

如果有人推碼到您的遙控器,看起來像這樣

──(A)───(B)───(E)── master 

然後就是公共歷史,你不應該重寫它,除非其他開發該項目的工作與你好吧,不會因爲需要將他們的工作與新的改寫歷史同步而感到煩惱。如果他們不能確定與你重寫他們的歷史,那麼你不應該因爲那時E成爲D一個孩子,而不是B,這是不是有什麼是公共歷史做

──(A)─┬─(B)─┬─(D)──(E)── master 
     │  │ 
     └─(C)─┘ branch 

在這種情況下,大多數人會做的是在硬復位的本地撤銷合併,然後重新合併或重新綁定來自遠程的新主控端。讓我們假設你剛剛重新合併,那麼你的歷史看起來就像這樣,因爲你所描述:

──(A)─┬─(B)───(E)─┬──(F)── master 
     │   │ 
     └────(C)────┘ branch 

,或者你可以變基CE得到的東西更線性,像這樣:

───(A)───(B)───(E)───(C')── master 

雖然沒有更多的信息,但我無法幫助您找出一種避免合併的方法,花了這麼長時間,我不知道爲什麼你會遇到這個問題。

+0

對於第一部分:你是對的,那麼我們不要再考慮這種情況。問題是在許多文件中有很多衝突。 – majvan

+0

那麼rebasing如何呢?你必須解決相同數量的衝突,但是每次你需要在之後進行rebase(比如,如果有人向你的遠程'master'推送更多的提交),那麼這些衝突已經被解決了,你會只需要解決出現的任何新衝突。 – 2013-08-02 12:01:53

+0

隨着重新貸款你是對的,但sice分支有很多變化即將被合併,我更喜歡保留原來的分支歷史。謝謝你的意見。 – majvan

0

有沒有一種簡單的方法來做你想做的。如前所述,大多數人會根據 上游分支的新狀態撤銷合併並重新進行合併。但這是可以完成的。

如果您目前有一個master分支擁有您的合併的最新 提交和origin/master具有不同於其他人的近期發展 你可以做以下,使它看起來像你這樣的 當前的頂部合併origin/master,而不是舊版本:

git checkout master 
git branch savepoint 
git merge -m temporary origin/master 
git reset --hard $(git show --pretty=format:%B 'HEAD^' | git commit-tree -p 'HEAD^2' -p 'HEAD^^2' -F - 'HEAD^{tree}') 

可見的合併將有創建一個額外的合併提交,但將 用下面的命令來要走了。該合併僅用於獲取存儲庫內容的期望最終狀態。

最後的命令是複雜的。 commit-tree部分創建 另一個已提交E和C作爲父母的合併提交,由前一個合併操作創建的內容庫 ,以及從之前完成的合併的 提交消息(感謝show命令和 -F -選項)。然後reset導致這個新的合併提交成爲新的 狀態。這應該爲您提供期望結果的第一個選項,並且它不會重寫任何已共享的歷史記錄。

由於這使用git reset --hard這將消除任何未提交的 更改。 savepoint分公司創建時只是爲了方便將 備份到起點上,以防出現問題。

相關問題