繁体   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