在Git中,如何将bug修复提交应用到其他较新的分支?

在Git中,如何将bug修复提交应用到其他较新的分支?,git,Git,如果我有一个包含如下3个分支的公共Git存储库: (release-to-customerA) | U (master) / | A---B---C---D---E ... S---T | (release-to-customerB) 其中提交“B”是原始发布版本,提交“U”解决了“B”中的一些错误。我想将commit'U'应用于master和release-to-

如果我有一个包含如下3个分支的公共Git存储库:

  (release-to-customerA)
      |
      U               (master)
     /                    |
A---B---C---D---E ... S---T 
        |
    (release-to-customerB)
其中提交“B”是原始发布版本,提交“U”解决了“B”中的一些错误。我想将commit'U'应用于master和release-to-customerB分支,下次我根据commit'D','E',…'向客户交付新版本时T',我希望包括提交'U'。最干净的方法是什么

我知道,
git-rebase
git-cherry-pick
可能会在我的本地存储库中起作用,但是当我将基于基址的工作提交到公共存储库时,我会把历史搞砸吗


谢谢你的回答

您不需要为此特定操作重新设置基准,樱桃采摘可以:

git checkout release-to-customerB
git cherry-pick U
git checkout master
git cherry-pick U

Cherry picking只会创建新的提交,不会重写历史记录,因此即使您稍后推送到另一个存储库,它也始终是安全的。

尽管Cherry picking可以工作,但我不确定您为什么要这样做。它会创建重复的提交,如果要合并,可能会导致问题。事实上,这似乎是您想要合并的情况

  (bugfixB, releaseA)
        --------------------- Y (master)
       /                     /
      U---X (releaseB)      /
     /   /                 /
A---B---C---D---E ... S---T
注意,我添加了一个分支名bugfixB——这是一个非常普遍的想法。提交
U
应该在一个分支上进行,该分支的目的是修复B(可能是多次提交)。然后,该分支应该合并到所有需要修复错误的分支中——在本例中是releaseA、releaseB和master

 git checkout -b bugfixB <SHA1 of B>
 # fix things, add changes
 git commit

 # for each branch...
 git checkout releaseA
 git merge bugfixB
 git checkout releaseB
 git merge bugfixB
 git checkout master
 git merge bugfixB
git签出-b bugfix
#解决问题,添加更改
git提交
#对于每个分支。。。
git签出版本a
git合并错误修复
git签出版本B
git合并错误修复
切换到主分支
git合并错误修复

在这种情况下,您不应该重新设置基址,因为其他人显然已经看到了从C到t的提交

正如格雷格所说,你可以使用git cherry pick来获得U;但是,这将创建一个具有相同差异但ID不同的新提交。如果您想将发布到customerA的所有提交转换为发布到customerB和master的所有提交,您可以像这样使用
git merge

git checkout release-to-customerB
git merge release-to-customerA

git checkout master
git merge release-to-customerA

谢谢你的回答。如果我尝试合并“X”和“Y”,会发生什么?git够聪明吗?它可以快速前进到Y吗?@YYC:不确定你指的是X到Y还是Y到X,但它们本质上是一样的。不过,这两种情况都不是快进。U很可能与从D到T的某个地方的commit冲突,因此很难快速前进。当然,这应该是一个非常简单的递归合并,因为只有一个bug修复提交值的分歧。(当然,如果合并中存在冲突,那么如果您重新设置基准或选择基准,则会有冲突。就引擎盖下合并而言,这最终是相同的操作。)