如果我有一个包含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 rebase
或git cherry-pick
可以在我的本地存储库中执行此操作,但是当我将重新定位的工作提交到公共存储库时,我会搞砸历史记录吗?
感谢您的回答。
答案 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