Git - 如何合并功能分支,但排除一些提交?

Posted

技术标签:

【中文标题】Git - 如何合并功能分支,但排除一些提交?【英文标题】:Git - how to merge feature branch, but exclude some commits? 【发布时间】:2017-02-27 12:30:38 【问题描述】:

我已经使用 Git 很长时间了,但是今天我遇到了一个问题,将一些更改从一个分支合并到另一个分支。我遇到的这种情况是 - 我有 4 个分支:2 个主要分支和 2 个特色分支。假设它们的名称如下:main_branch1main_branch2feature_branch1feature_branch2。功能分支总是从main_branch1 创建的,当你完成你的工作时,你将它们合并回它。然后在某个时间点,它们的更改也会合并到main_branch2。两个主要分支之间没有合并! 问题来了。在我现在的情况下,feature_branch1 有时是从main_branch1 创建的,在其中进行了一些更改并将其合并回主分支。然后我从main_branch1 再次创建feature_branch2,在那里也进行了更改并将其合并回其中。现在我想将feature_branch2 合并到main_branch2 中,但只是它所具有的更改——因为当我创建它时,我从feature_branch1 中得到了更改。我尝试使用git rebase,但无法让事情顺利进行,而且我的工作树看起来一团糟。

这是我想要实现的目标以及我的树应该是什么样子的图表:

o---------------o---------------------o  main_branch1
 \             / \                   /
  o-----------o   \                 /
feature_branch1    \               /
                    \             /
                     o-----------o
                  feature_branch2 \
                                   \
                                    o-----------o  main_branch2

正如您在创建 feature_branch2 时所看到的,我已经从 feature_branch1 获得了更改,这些更改已合并到 main_branch1。当我将feature_branch2 合并到main_branch2 时如何排除它们?但是当我决定将feature_branch1 合并到main_branch2 时,我需要稍后添加它们...

知道我该怎么做吗?谢谢! :)

【问题讨论】:

【参考方案1】:

查看rebase --onto - 它可以让您变基,但可以让您对所涉及的特定提交有更多的控制。

git rebase --onto <new_base_branch> <old_base_branch> <branch_to_rebase>

在您的情况下,该命令可能类似于:

git rebase --onto main_branch2 <hash_of_commit_at_base_of_main_branch2> feature_branch2

这将检查 main_branch2 并在其上一一应用来自 feature_branch2 的提交。然后您可以将feature_branch2 合并到main_branch2

这是否符合您想要实现的目标?如果没有分支当前状态的图表,就很难确定!

【讨论】:

是的,我查看了--onto 参数,但我不确定它实际上对我有什么帮助。问题是分支feature_branch1 的合并提交在我创建它时已经在feature_branch2 中。现在我只想将feature_branch2 合并到main_branch2,但没有来自feature_branch1 的合并提交。上图实际上说明了这一点。【参考方案2】:

如果您想从feature_branch1 中排除更改,那么您需要在创建之前签出一个新分支并从feature_branch2 中挑选提交,然后您将能够在以后完全合并。

git checkout -b nofeature1 <SHA before feature_branch1>
git cherry-pick <first SHA feature_branch2>^..feature_branch2
git checkout main_branch2
git merge nofeature1

【讨论】:

所以每次我合并到main_branch2 时,我都需要创建一个没有feature_branch1 更改的新分支? @nogravity 如果你的起点是main_branch1,那么是的,因为它的历史记录中有feature_branch1。我认为在其历史中创建一个没有feature_branch1 的新基础分支会更好。否则,您将不断合并回main_branch1,那么您可能也想要所有其他更改,因此每次看起来都像git cherry-pick &lt;SHA of merge feature_branch1 into main_branch1&gt;..main_branch1

以上是关于Git - 如何合并功能分支,但排除一些提交?的主要内容,如果未能解决你的问题,请参考以下文章

GIT 工作流程:将大部分功能分支合并到 master 中,省略一个特定的提交?

git把一个分支上的某个提交合并到另一个分支

如何将多个提交合并到另一个分支上作为单个压缩提交?

如何将本地未提交的更改合并到另一个 Git 分支?

Git:如何列出此分支上的提交而不是合并分支上的提交

合并后的 Git 分支和提交历史记录