[英]git commit to all branches
如果我修復了branch_a
分支中的文件中的錯誤,則該錯誤應應用於所有分支。 有沒有一種方法可以將更改應用於所有分支,而不必分別檢出分支。
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倉庫和多個分支。 在與所有分支/叉相關的錯誤的情況下,我一直在尋找自動更新所有分支的方法。
不,或者嚴格來說,“是的,但是其他方面的工作都是一樣的”。 即使是“分離的HEAD” ,新的提交也總是添加到“當前分支”中 。 (下面,我將展示一種使用“分離的HEAD”狀態執行此操作的方法,盡管如果您要將提交添加到現有的分支提示中,那不僅是將它們檢出,還需要更多工作。)
假設您有這樣的事情:
A-B-C <-- br1
\
D F <-- br2
\ /
E
\
G <-- br3
並且您必須在C
, F
和G
之上應用一些修訂X
才能得出:
A-B-C-X1 <-- br1
\
D F-X2 <-- br2
\ /
E
\
G-X3 <-- br3
(請注意,所有3個Xn
提交都是不同的提交,因為它們具有不同的父級),則必須添加“ patch X”來提交C
,然后添加“ patch X”來提交F
,然后添加“ patch X”來提交G
。
注意,這里也不保證例如從C
到X1
的變化與從F
到X2
的變化完全匹配。 您可以按照通常的方式首先構造三個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
已損壞並且需要修復,從而影響提交F
和G
進一步假設,要么沒有其他人提交F
和G
-或者,你願意迫使那些誰真的有兩個提交,做一堆的工作,從您將要做些什么恢復。 在這種情況下,您可以檢出提交D
並進行一個新的提交E'
,它從D
發出。 讓我們畫出起點,省略A
到C
我們將git checkout D
(通過其SHA-1,或者(等效於此圖,通過使用br2~2
來命名)它)在那里得到一個“分離的HEAD”:
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
現在我們可以將提交F
復制到F'
:
$ 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
(這是我上面寫的“或嚴格來說”部分:您可以將提交添加到存儲庫,然后到處移動分支標簽,以便它們標記新的提交鏈,而不是舊的。所有添加的提交都移動HEAD
:如果HEAD
是對分支的引用,那么他們也會在工作時將分支向前移動。讓HEAD
引用分支是“正常”的工作方式,但是您可以事后在“分離式”中偽造它帶有git branch -f
“ HEAD”模式。在這種情況下,我這樣做是在不使用分支名稱的情況下構建新的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
(這是我們將F
復制到F'
或多或少的操作)給出:
F' <-- br2
/
E'
/ \
| G' <-- HEAD, br3
|
D
|
| F [abandoned]
\ /
E
\
G [abandoned]
完成所有操作后,您可能應該git checkout somebranch
以返回“分支上”,並遠離此“分離的HEAD”狀態。
正如評論中指出的那樣,需要廣泛應用補丁(這是一個詞嗎?),因為這表明整個過程可能有問題。 (但這就是修復“零日漏洞”的樣子,當您有許多不同的產品都共享零日漏洞的代碼庫時。)
這並不存在,因為每次合並都可能導致需要用戶干預的單獨沖突。 您將需要編寫腳本來執行所需的操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.