在Git中,如何将bug修复提交应用到其他较新的分支?
如果我有一个包含如下3个分支的公共Git存储库:在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-
(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修复提交值的分歧。(当然,如果合并中存在冲突,那么如果您重新设置基准或选择基准,则会有冲突。就引擎盖下合并而言,这最终是相同的操作。)