Git:将更改应用于两个分支

时间:2017-07-18 14:24:13

标签: git branch git-branch

我的存储库中有两个分支(出于此问题的目的):masterperformance_testing。我收到了master分支的更改。我也需要将它们放入performance_testing。我需要保持两个分支存在和分离,因此合并是不合适的。我想我可以在一个分支中引入更改并提交,然后在另一个分支中执行相同的操作。但这似乎容易出错,我认为git可以通过某种方式更直接地做到这一点。我该怎么做呢?

4 个答案:

答案 0 :(得分:4)

在这种情况下,您通常要做的是cherry picking,其中只涉及将一个分支的提交子集应用到另一个分支。

例如,您在A上提交了BCDEFmaster并且您希望将提交BCD带入performance_testing

git checkout performance_testing
git cherry-pick B^..D

或者您可以在多个单独的cherry-pick命令中列出单个提交。当您不一定需要连续的一系列提交时,这非常有用。例如:

git cherry-pick B D

请注意,B在历史记录中 D之前

有关详情,请参阅:How to cherry-pick multiple commits(其中还包括一些我不会在这个答案中挖掘的优秀图表)。

是的,有很多不同的选择可供选择。这是一个基本且通用的解决方案,读者可以选择应用,因为他们了解它是如何工作的。 git rebase --onto是另一种选择,不同的分支管理也是如此,但如果没有非常具体的情况,采摘樱桃应该获得最多的里程。

答案 1 :(得分:2)

最好的方法是为更改创建功能分支,并在masterperformance_testing结束时将其合并。樱桃采摘被认为是一种反模式。

要创建要素分支,首先要找到2个分支的最新共同祖先:

git merge-base master performance_testing

然后使用上一个命令的输出创建feature_branch

git branch feature_branch <output of merge-base command>

切换到feature_branch分支,进行更改并在masterperformance_testing的最后合并。

如果您更改了2个分支中的相同文件,则会发生冲突。这是不可避免的,即使采摘樱桃,但很容易解决。

这种方法优于采摘樱桃的优势在于,您将获得一个统一的日志,并在两个分支上使用相同的提交哈希值。

答案 2 :(得分:1)

您可以使用git cherry-pick将一个或多个提交(副本)应用到新分支。

新提交将“与原件具有相同的效果(相同的差异,相同的消息等),但在其他方面是独立的。”

答案 3 :(得分:1)

  

我需要保持两个分支存在并分开,因此合并是不合适的。

这不一定遵循;在合并之后,两个分支仍然存在并且仍然是分开的。合并不合适的情况是,每个分支当前包含不能在另一个分支中的变化。

当您说“收到master分支的更改”时,这究竟是什么意思?如果您的意思是有人将更改推送到origin/master,那么这会限制您的选择。什么是最好的解决方案(在masterperformance_testing之间的合并基础创建分支,在那里应用更改,然后将该分支合并到master和{{1}由于需要进行影响已经共享的提交的历史记录重写(以删除对performance_testing的更改的直接应用),会变得复杂。

如果更改直接应用于master,并且master包含无法进入master的更改:那么除非可以接受协调历史记录重写,否则您的剩余选项可能是樱桃 - 挑选变化。在我看来,经常推荐采用方式进行挑选,并且有明显的缺点,但如果你排除了所有其他解决方案,那么这就是剩下的。