git提交到所有分支
如果我修复了branchgit提交到所有分支,git,commit,Git,Commit,如果我修复了branchbranch\u a中的一个文件中的一个bug,它应该应用于所有分支。是否有一种方法可以将更改应用于所有分支,而不必单独签出分支 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 branch,它
branch\u a
中的一个文件中的一个bug,它应该应用于所有分支。是否有一种方法可以将更改应用于所有分支,而不必单独签出分支
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 branch
,它尽可能将更改传播到所有分支
编辑
为了澄清一下我的情况,我为计算问题编写了代码。我经常会遇到这样的情况,即不清楚哪种方法是解决给定问题的最佳方法。所以我创建了一个分支。这些分支倾向于分叉,更像叉子。然而,为了保留所有文件,我只使用一个带有多个分支的git存储库。在一个与所有分支/分支相关的bug的情况下,我一直在寻找自动更新所有分支的方法。这是不存在的,因为每次合并都可能导致单独的冲突,需要用户干预。你需要写一个脚本来做你想做的事。不,或者严格地说,“是的,但其他方式的工作量也一样大。”。新提交总是添加到“当前分支”,即使是“分离的头”。(下面,我将展示一种使用“detached HEAD”状态的方法,尽管如果要将提交添加到现有的分支提示中,这比检查它们要复杂得多。) 假设你有这样的东西:
A-B-C <-- br1
\
D F <-- br2
\ /
E
\
G <-- br3
(请注意,所有3个Xn
提交都是不同的提交,因为它们具有不同的父级),然后必须添加“补丁X”以提交C
,然后添加“补丁X”以提交F
,然后添加“补丁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
——或者,你愿意强迫那些有这两次提交的人做大量工作,从你即将做的事情中恢复过来。在这种情况下,您可以签出commitD
,并从D
生成一个新的commit,E'
。让我们画一个起点,从A
到C
。我们将git checkout D
(通过它的SHA-1,或者通过使用br2~2
来命名它,与此图等效)在那里获得一个“分离头”:
一旦提交完成,我们就有了这个(仍然是“分离的头”
):
给予:
F' <-- HEAD
/
E'
/
|
|
D
|
| F <-- br2
\ /
E
\
G <-- br3
F' <-- HEAD, br2
/
E'
/
|
|
D
|
| F [abandoned]
\ /
E
\
G <-- br3
给予:
F' <-- HEAD
/
E'
/
|
|
D
|
| F <-- br2
\ /
E
\
G <-- br3
F' <-- HEAD, br2
/
E'
/
|
|
D
|
| F [abandoned]
\ /
E
\
G <-- br3
(这是我们将F
复制到F'
时所做的,或多或少)给出:
F'我强烈建议在日常合并中使用git merge而不是git cherry pick。经常对多个分支应用相同的补丁表明您正在做一些不应该做的奇怪的事情。例如,您可能正在使用静态配置更合适的分支。Atlassian隐藏支持,但它不是本机Git功能。OP描述的问题的另一个用例是repo根目录中的repo端自述文件。分支“分支”“在不同的时间点,因此功能分支在repo根目录中可能有过时的自述文件。因此,当我在repo根目录中更新自述文件时,我希望在所有分支中更新该自述文件,因为它只包含repo本身的一般信息。
$ git cherry-pick br2
F' <-- HEAD
/
E'
/
|
|
D
|
| F <-- br2
\ /
E
\
G <-- br3
$ git branch -f br2 HEAD
F' <-- HEAD, br2
/
E'
/
|
|
D
|
| F [abandoned]
\ /
E
\
G <-- br3
$ 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' <-- br2
/
E'
/ \
| G' <-- HEAD, br3
|
D
|
| F [abandoned]
\ /
E
\
G [abandoned]