将两个分支之间的差异合并到第三个分支
Merge diff between two branches to third branch
假设我有两个分支,master
和 new_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_feature
到 specific_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
类似的东西应该是解决您的问题的起点。
假设我有两个分支,master
和 new_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_feature
到 specific_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
类似的东西应该是解决您的问题的起点。