2014-01-30 107 views
7

如果我修復了分支branch_a中應該應用於所有分支的文件中的錯誤。是否有辦法將更改應用到所有分支,而不必單獨檢出分支。git commit to all branches

git commit -m 'commit msg' # on branch a 

git checkout branch_b 
git cherry-pick branch_a 

git checkout branch_c 
git cherry-pick branch_a 

什麼,我想有一個git commit --to-all-branches它試圖更改傳播到可能的話所有分支。

編輯

澄清了一下我的情況,我寫的代碼爲計算問題。通常我最終會遇到哪種方法最能解決給定問題的情況。所以我創建了一個分支。這些分支往往分歧,更像叉子。但是爲了保持所有的文件,我只是使用一個Git倉庫與多個分支。在與所有分支機構/分支機構相關的錯誤情況下,我一直在尋找自動更新所有分支機構。

+0

我強烈建議git合併,而不是git cherry-pick用於日常合併。 –

+1

經常需要將相同的補丁應用於多個分支,這表明您正在做一些您不應該做的奇怪事情。例如,您可能會在靜態配置更合適的情況下使用分支。 –

+1

Atlassian Stash支持[自動分支合併](https://confluence.atlassian.com/display/STASH/Automatic+branch+merging),但它不是原生Git特性。 –

回答

8

沒有或嚴格地說,「是的,但其他任何方式都是一樣的」。新的提交是總是添加到「當前分支」,即使這是一個「分離的頭」。 (下面,我將展示的「分離的頭的」國家這樣做的方式,但如果你要添加提交現有的分支提示,這不僅僅是檢查出來更多工作。)

假設你有這樣的事情:

A-B-C   <-- br1 
    \ 
    D F  <-- br2 
    \/
     E 
     \ 
     G  <-- br3 

和你有一些解決X必須對CF頂部被應用,並G給:

A-B-C-X1  <-- br1 
    \ 
    D F-X2 <-- br2 
    \/
     E 
     \ 
     G-X3 <-- br3 

(注意,所有3 Xn提交是不同的提交,因爲它們具有不同的父項),那麼您必須添加「補丁X」來提交C,然後添加「補丁X」來提交F,然後添加「補丁X」 G

注意,有沒有保證,例如,從CX1的變化正好從FX2這裏的變化相匹配,無論是。您可以通常的方式首先構造任意的Xn提交。然後(如您的問題),您只需移動到其他分支並git cherry-pick創建(並可能解決衝突)其他X -es。但是,你需要「的」那些分支機構提交加入到他們,所以:

$ git checkout br1 
... make fix, "git add", "git commit" to create X1 

$ git checkout br2 
Switched to branch 'br2'. 
$ git cherry-pick br1 # take diff of `C`-vs-`X1`, apply to `F` to make `X2` 
... etc 

重複的到的補丁必須複製所有分支(如果有必要,修改,以適應該分支)。


還有其他方法可以做到這一點。例如,假設分支br1實際上是確定的,並且您發現的是承諾E已損壞並需要修復,從而影響提交FG。進一步假設,或者沒有其他人提交FG - 或者,你願意強迫那些做了有這兩個提交,做一堆工作來恢復你將要做的事情。在這種情況下,您可以檢出D,並提交一個新的提交E',該提交來自D。讓我們畫出起點,通過C忽略A。我們將git checkout D(由它的SHA-1,或對等地與此圖的使用br2~2來命名),以獲得一個 「分離的頭」 有:

D  <-- HEAD 
| 
| F <-- br2 
\/
    E 
    \ 
    G <-- br3 

現在:

$ git cherry-pick -n br2^ # make a copy of E but don't commit yet 
# edit to fix it 
$ git commit    # make new commit E' that's fixed 

一旦提交結束,我們有這個(仍然與「沾邊HEAD):

E' <-- HEAD 
/
| 
| 
D 
| 
| F <-- br2 
\/
    E 
    \ 
    G <-- br3 

現在我們可以複製承諾FF'

$ git cherry-pick br2 

,並提供:

F' <-- HEAD 
/
    E' 
/
| 
| 
D 
| 
| F <-- br2 
\/
    E 
    \ 
    G <-- br3 

現在,我們已準備好進行br2是指犯F'

$ git branch -f br2 HEAD 

捐贈:

F' <-- HEAD, br2 
/
    E' 
/
| 
| 
D 
| 
| F [abandoned] 
\/
    E 
    \ 
    G <-- br3 

(這是「或嚴格說話ing「部分:您可以將提交添加到存儲庫,然後移動分支標籤,以便標記新的提交鏈,而不是舊標籤。所有添加的提交移動HEAD:只是如果HEAD是對分支的引用,他們在您工作時向前邁進了一步。有HEAD是指分支是「正常」的工作方式,但是你可以在git branch -f的「分離頭部」模式下事後僞造它。在這種情況下,我這樣做,要建立新的br2不使用分支,然後移動分公司名稱提交的新鏈,一旦它準備好了。)

現在我們需要G複製到G' ,附G'E'。以下是具體步驟:

$ git checkout br2^  # get back on E' as a detached HEAD 
[git says stuff here about moving the detached HEAD] 
$ git cherry-pick br3 # copy commit G 
$ git branch -f br3 HEAD # and move br3 label here 

(這就是我們所做的複製FF',更多或更少),並提供:

F' <-- br2 
/
    E' 
/\ 
| G' <-- HEAD, br3 
| 
D 
| 
| F [abandoned] 
\/
    E 
    \ 
    G [abandoned] 

一旦你完成所有操作,你應該git checkout somebranch得到回到「分支上」,並遠離這種「分離的頭部」狀態。

正如評論中指出的,需要廣泛應用補丁(這是一個詞?),因爲這表明整個過程可能有問題。 (但是,當你有一堆不同的產品共享代碼庫和日零錯誤時,修復「日零錯誤」的方法就是這樣。)

4

這不存在,因爲每個合併都可能導致需要用戶干預的單獨衝突。你需要寫一個腳本來做你想做的事。