假设我有两个分支,master
和new_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
(从主分支出来)?
答案 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
这样的事情应该成为解决问题的起点。