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

Git: applying changes to two branches

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

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

新提交将 "have the same effect as" 原始提交(相同的差异、相同的消息等),但在其他方面是独立的。

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

例如,您在 [=18] 上提交了 ABCDEF =] 并且您希望将提交 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(其中还包括一些很棒的图表,我不会在这个答案中使用)。

是的,有许多不同的选项可供选择。这是一个基本且常见的解决方案,reader 可以在了解其工作原理后选择应用。 git rebase --onto 是另一种选择,不同的分支机构管理也是如此,但如果没有考虑非常具体的情况,挑选樱桃应该获得最大的里程数。

最好的方法是为更改创建一个功能分支,并在 masterperformance_testing 的末尾合并它。 Cherry-picking 被认为是一种反模式。

要创建功能分支,首先找到 2 个分支的最近共同祖先:

git merge-base master performance_testing

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

git branch feature_branch <output of merge-base command>

切换到 feature_branch 分支,进行更改并将其合并到 masterperformance_testing.

的末尾

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

这种方法优于 cherry-picking 的优点是您将获得一个统一的日志,在两个分支上具有相同的提交散列。

I need to keep the two branches existent and separate, so merging would not be appropriate.

不一定是这样;合并后,两个分支仍然存在并且仍然是独立的。如果每个分支 当前 包含不能在另一个分支中的更改,则合并是不合适的。

当你说你 "received changes for the master branch" 时,这到底是什么意思?如果您的意思是有人将更改推送到 origin/master,那么这会限制您的选择。否则最好的解决方案是什么(在 masterperformance_testing 之间的合并基础上创建一个分支,在那里应用更改,然后将该分支合并到 masterperformance_testing) 会因为需要重写影响已经共享的提交的历史而变得复杂(以删除对 master 的更改的直接应用)。

如果更改直接应用于 master,并且 master 包含无法引入 performance_testing 的更改:那么除非可以接受协调历史记录重写,否则您剩下的选择可能是挑选零钱。在我看来,通常建议 方式 挑选樱桃,并且有明显的缺点,但如果您排除了所有其他解决方案,那么剩下的就是这个。