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

Merge diff between two branches to third branch

假设我有两个分支,masternew_feature

我应该处理一个特定的功能,我认为这个功能将是 new_feature 的一部分,所以,我从 new_feature 分支中签出了 specific_feature 分支,比如所以

git checkout -b specific_feature

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

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

有什么方法可以区分 specific_feature 分支和 new_feature 分支,并将这些更改应用到新分支,例如 specific_feature_master(从 master 分支出来)?

这似乎适合 git rebase --onto:

git rebase --onto master new_feature specific_feature

这将只接受 after new_featurespecific_feature HEAD 的提交,并将它们重播到 master.

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

如果其他人已经拉下该分支并正在处理它,那可能是个问题。


davidriod 正确指出:

I don't think this will work as the OP as merged several times the upstream/new_feature branch in the specific_feature branch

如果 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)

而不是挑选樱桃,我会:

  • master 中创建 specific_feature(并将 specific_feature 分支标记为 tmp
  • 合并 Y(在 specifc_feature 中合并的最后一个 new_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)

您可以使用命令 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 } | xargs git cherry-pick

类似的东西应该是解决您的问题的起点。