将两个分支之间的差异合并到第三个分支

时间:2015-03-28 08:48:48

标签: git diff

假设我有两个分支,masternew_feature

我本来应该处理一个特定的功能,我认为这个功能是new_feature的一部分所以,我从specific_feature分支中检出new_feature分支,就像这样< / p>

git checkout -b specific_feature

现在我在这个specific_feature分支中做了很多开发,将upstream/new_feature合并到其中几次以进行远程更改。

现在,我知道我的specific_feature应该是master而不是new_feature。 (new_feature分支尚未准备好被推送)

有没有办法可以在我的specific_feature分支和new_feature分支之间进行差异化,并将这些更改应用到新分支,例如specific_feature_master(从主分支出来)?

2 个答案:

答案 0 :(得分:5)

这似乎是git rebase --onto的工作:

git rebase --onto master new_feature specific_feature

只需 new_feature之后的提交specific_feature HEAD,然后将其重播到master

请注意,您必须强制将specific_feature推送到上游(如果您之前已将其推送过):git push --force specific_feature

如果其他人已经撤出该分支并正在开展工作,那么这可能会成为一个问题。


davidriod正确指出:

  

我不认为这将作为OP合并多次在特定功能分支中的upstream/new_feature分支

如果new_feature永远不会更新(仅提取,永不拉动),那么它可能仍然有用 如果new_feature已更新(拉)并合并到specific_feature,那么rebase --onto将只播放自上次合并以来的最后几次提交:此处,只有z'次提交将是重播,而不是第一个z

x--x--x
       \
        y--y--Y--y--y (new_feature)
            \  \
             z--M--z'--z' (specific_feature)

而不是采摘樱桃,我会:

  • specific_feature中制作master(并将specific_feature分支标记为tmp
  • 合并Y(在new_feature中合并的最后specifc_feature次提交)到新的specific_feature分支

那是:

git checkout -b tmp specific_feature
git checkout -B specific_feature master
git merge $(git merge-base tmp new_feature) # that merges Y

        ----------M (specific_feature)
       /         /
x--x--x         /
       \       /
        y--y--Y--y--y (new_feature)
            \  \
             z--M--z'--z' (tmp)

然后rebase --onto可以使用相同的共同祖先Y作为正确的基础:

git rebase --onto specific_feature $(git merge-base tmp new_feature) tmp
git branch -D tmp

        ----------M--z''--z'' (specific_feature)
       /         /
x--x--x         /
       \       /
        y--y--Y--y--y (new_feature)

答案 1 :(得分:2)

您可以使用命令git cherry来检索在specific_feature分支上完成的提交,并且该命令不会出现在origin / new_feature分支上。

git cherry origin/new_feature specific_feature

然后,您可以从master创建一个新分支,并挑选所有这些提交。 但是,如果您在specific_feature和origin / new_feature上的开发之间存在依赖关系,那么scm将为您解决这个问题。

git checkout -b specific_feature_master master
git cherry origin/new_feature specific_feature | egrep '^+' | awk '{print $2} | xargs git cherry-pick

这样的事情应该成为解决问题的起点。