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

时间:2016-10-18 09:40:16

标签: git version-control merge branch rebase

我现在使用Git很长一段时间了,但今天我遇到了一个问题,即将一些更改从分支合并到分支。我遇到的情况是 - 我有4个分支:2个主要分支和2个功能分支。我们假设他们的调用方式如下:main_branch1main_branch2feature_branch1feature_branch2。功能分支始终从main_branch1创建,当您完成工作后,将它们合并回来。然后在某些时候,他们的更改也会合并到main_branch2。两个主要分支之间没有合并! 这就是问题所在。就我而言,feature_branch1在某个时间从main_branch1创建,在其中进行了一些更改并将其合并回主分支。然后我再次从feature_branch2创建了main_branch1,并在那里进行了更改,并将其合并回来。现在我想将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时,我需要稍后添加它们...

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

2 个答案:

答案 0 :(得分: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

这是否符合你想要达到的目标?如果没有关于分支当前状态的图表,很难确定!

答案 1 :(得分:1)

如果您要从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