沒有或嚴格地說,「是的,但其他任何方式都是一樣的」。新的提交是總是添加到「當前分支」,即使這是一個「分離的頭」。 (下面,我將展示的「分離的頭的」國家這樣做的方式,但如果你要添加提交現有的分支提示,這不僅僅是檢查出來更多工作。)
假設你有這樣的事情:
A-B-C <-- br1
\
D F <-- br2
\/
E
\
G <-- br3
和你有一些解決X
必須對C
,F
頂部被應用,並G
給:
A-B-C-X1 <-- br1
\
D F-X2 <-- br2
\/
E
\
G-X3 <-- br3
(注意,所有3 Xn
提交是不同的提交,因爲它們具有不同的父項),那麼您必須添加「補丁X」來提交C
,然後添加「補丁X」來提交F
,然後添加「補丁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
。讓我們畫出起點,通過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
現在我們可以複製承諾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
(這是「或嚴格說話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
(這就是我們所做的複製F
到F'
,更多或更少),並提供:
F' <-- br2
/
E'
/\
| G' <-- HEAD, br3
|
D
|
| F [abandoned]
\/
E
\
G [abandoned]
一旦你完成所有操作,你應該git checkout somebranch
得到回到「分支上」,並遠離這種「分離的頭部」狀態。
正如評論中指出的,需要廣泛應用補丁(這是一個詞?),因爲這表明整個過程可能有問題。 (但是,當你有一堆不同的產品共享代碼庫和日零錯誤時,修復「日零錯誤」的方法就是這樣。)
我強烈建議git合併,而不是git cherry-pick用於日常合併。 –
經常需要將相同的補丁應用於多個分支,這表明您正在做一些您不應該做的奇怪事情。例如,您可能會在靜態配置更合適的情況下使用分支。 –
Atlassian Stash支持[自動分支合併](https://confluence.atlassian.com/display/STASH/Automatic+branch+merging),但它不是原生Git特性。 –