[英]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
并且您必须在C
, F
和G
之上应用一些修订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
。
注意,这里也不保证例如从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
发出。 让我们画出起点,省略A
到C
我们将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.