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

Opt*_*mus 6 git diff

假设我有两个分支,master并且new_feature

我应该在一个特定的功能上工作,我认为这个功能将是其中的一部分new_feature,我检查了specific_feature分支机构的new_feature分支,就像这样

git checkout -b specific_feature
Run Code Online (Sandbox Code Playgroud)

现在我在这个specific_feature分支中做了很多开发,并将upstream/new_feature它合并了几次以获得远程更改.

现在,我才知道,我specific_feature应该已经一发不可收拾的master不是new_feature.(new_feature分支尚未准备好被推送)

有没有办法可以把我的specific_feature分支和new_feature分支之间的差异,并将这些更改应用到新的分支说specific_feature_master(分支出主)?

Von*_*onC 5

这似乎是一项工作git rebase --onto

git rebase --onto master new_feature specific_feature
Run Code Online (Sandbox Code Playgroud)

这将需要只有提交 new_feature最多specific_featureHEAD,并对其进行重放上master

请注意,你便要力推specific_feature上游(如果你已经推过它)git push --force specific_feature

如果其他人已经撤出该分支并正在努力,那么这可能是一个问题。


davidriod正确指出:

我不认为这会与OP合并upstream/new_feature为specific_feature分支中的分支几次而起作用

如果new_feature从不更新(仅获取,从不提取),则它可能仍然有效。
如果new_feature已更新(pull)并合并到中specific_feature,则rebase --onto只会播放自上次合并以来的最后几次提交:在这里,仅z'重播提交,而不是第一个z

x--x--x
       \
        y--y--Y--y--y (new_feature)
            \  \
             z--M--z'--z' (specific_feature)
Run Code Online (Sandbox Code Playgroud)

我不想摘樱桃,而是:

  • 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)
Run Code Online (Sandbox Code Playgroud)

然后,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)
Run Code Online (Sandbox Code Playgroud)