Git - 如何合并功能分支,但排除一些提交?
Posted
技术标签:
【中文标题】Git - 如何合并功能分支,但排除一些提交?【英文标题】:Git - how to merge feature branch, but exclude some commits? 【发布时间】:2017-02-27 12:30:38 【问题描述】:我已经使用 Git 很长时间了,但是今天我遇到了一个问题,将一些更改从一个分支合并到另一个分支。我遇到的这种情况是 - 我有 4 个分支:2 个主要分支和 2 个特色分支。假设它们的名称如下:main_branch1
、main_branch2
、feature_branch1
和 feature_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 <SHA of merge feature_branch1 into main_branch1>..main_branch1
。以上是关于Git - 如何合并功能分支,但排除一些提交?的主要内容,如果未能解决你的问题,请参考以下文章