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

时间:2010-07-22 18:46:16

标签: git

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

  (release-to-customerA)
      |
      U               (master)
     /                    |
A---B---C---D---E ... S---T 
        |
    (release-to-customerB)

其中,提交'B'是原始发布版本,提交'U'解决了'B'中的一些错误。我想将提交“U”应用于 release-to-customerB 分支,以及下次我根据客户端向客户提交新版本时提交'D','E',...'T',我想包含提交'U'。最干净的方法是什么?

我知道git rebasegit cherry-pick可以在我的本地存储库中执行此操作,但是当我将重新定位的工作提交到公共存储库时,我会搞砸历史记录吗?

感谢您的回答。

3 个答案:

答案 0 :(得分:5)

虽然挑选樱桃会起作用,但我不确定你为什么要这样做。它会创建重复的提交,如果您想要合并,可能会导致问题。实际上,这似乎是您要合并的情况!

  (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

答案 1 :(得分:0)

你不需要为这个特定的操作重新设计,挑选樱桃很好:

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

Cherry-picking只会创建 new 提交并且不会重写历史记录,所以即使您以后推送到另一个存储库也始终是安全的。

答案 2 :(得分:0)

在这种情况下你不应该改变,因为显然其他人已经看到了C到T的提交。

正如格雷格所说,你可以用git-cherry-pick来获得U;但是,这将创建一个具有相同diff但具有不同ID的新提交。如果您希望将发布到客户A的所有提交都发布到发布到客户B和主服务器,您可以使用git-merge,如下所示:

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

git checkout master
git merge release-to-customerA
相关问题