git提交所有分支

时间:2014-01-30 15:02:35

标签: git commit

如果我修复了分支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存储库。在与所有分支/分支相关的错误的情况下,我正在寻找自动更新所有分支。

2 个答案:

答案 0 :(得分:11)

不 - 或严格来说,“是的,但它与其他任何方式一样多”。新提交总是添加到“当前分支”,,即使这是“分离的HEAD”。 (下面,我将展示一种使用“分离的HEAD”状态执行此操作的方法,但如果您要向现有分支提示添加提交,则更多工作而不仅仅是检查它们。)

假设你有类似的东西:

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

并且您必须在XCF之上应用一些修复G,以便:

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

(请注意,所有3个Xn提交都是不同的提交,因为它们具有不同的父级),然后必须添加“patch X”以提交C,然后添加“patch X”以提交{ {1}},然后添加“patch X”以提交F

请注意,无法保证,例如,从GC的更改与此处X1F的更改完全匹配。您可以通常的方式首先构造三个X2提交中的任何一个。然后(如您的问题),您只需移动到其他分支Xn以创建(并可能解决冲突)其他git cherry-pick - es。但是你需要在“那些”分支上“添加提交”,所以:

X

对必须复制补丁的所有分支重复(如有必要,修改以适合该分支)。


还有替代方法可以做到这一点。例如,假设分支$ 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已损坏且需要修复,从而影响提交EF。进一步假设没有其他人提交GF - 或者,您愿意强迫那些的人提交这两个提交,做一大堆工作来恢复你将要做的事情。在这种情况下,您可以查看提交G并进行D之后的新提交E'。让我们画出起点,省略DA。我们C(通过它的SHA-1,或等效地使用此图表 - 通过使用git checkout D命名它)来获得“分离的HEAD”:

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

(这是我上面写的“或严格来说”部分:你可以将提交添加到存储库,然后移动分支标签,以便它们标记新的提交链,而不是旧的提交链。所有添加的提交移动{ {1}}:只是如果 F' <-- HEAD, br2 / E' / | | D | | F [abandoned] \ / E \ G <-- br3 是对分支的引用,那么在您工作时将分支向前移动一步。让HEAD引用分支是“正常”的工作方式,但你可以使用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'回到“分支”,并远离这个“分离的HEAD”状态。

如评论中所述,需要广泛应用补丁(这是一个单词吗?),因为这表明整个过程可能存在问题。 (但是当你有一堆不同的产品都与零日bug一起共享代码库时,这就是修复“日零错误”的原因。)

答案 1 :(得分:4)

这不存在,因为每次合并都可能导致需要用户干预的单独冲突。你需要编写一个脚本来做你想做的事。