如果我修复了分支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存储库。在与所有分支/分支相关的错误的情况下,我正在寻找自动更新所有分支。
答案 0 :(得分:11)
不 - 或严格来说,“是的,但它与其他任何方式一样多”。新提交总是添加到“当前分支”,,即使这是“分离的HEAD”。 (下面,我将展示一种使用“分离的HEAD”状态执行此操作的方法,但如果您要向现有分支提示添加提交,则更多工作而不仅仅是检查它们。)
假设你有类似的东西:
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
提交都是不同的提交,因为它们具有不同的父级),然后必须添加“patch X”以提交C
,然后添加“patch X”以提交{ {1}},然后添加“patch X”以提交F
。
请注意,无法保证,例如,从G
到C
的更改与此处X1
到F
的更改完全匹配。您可以通常的方式首先构造三个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
已损坏且需要修复,从而影响提交E
和F
。进一步假设没有其他人有提交G
和F
- 或者,您愿意强迫那些做的人提交这两个提交,做一大堆工作来恢复你将要做的事情。在这种情况下,您可以查看提交G
并进行D
之后的新提交E'
。让我们画出起点,省略D
到A
。我们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)
这不存在,因为每次合并都可能导致需要用户干预的单独冲突。你需要编写一个脚本来做你想做的事。