簡體   English   中英

git提交到所有分支

[英]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

並且您必須在CFG之上應用一些修訂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

注意,這里也不保證例如從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發出。 讓我們畫出起點,省略AC 我們將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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM