Git 将两个分支之间的差异合并到第三个分支
假设我有两个分支,Git 将两个分支之间的差异合并到第三个分支,git,diff,Git,Diff,假设我有两个分支,master和new\u feature 我本应该在一个特定的功能上工作,我认为这个功能将是新功能的一部分所以,我从新功能分支中签出了特定功能分支,就像这样 git checkout -b specific_feature 现在,我在这个特定功能分支中进行了大量开发,将上游/新功能合并到其中几次,以获得远程更改 现在,我知道我的特定功能应该是从主功能扩展而来,而不是新功能。(新功能分支未准备好推送) 有没有一种方法可以将我的特定功能分支和新功能分支之间的差异,并将这些更改应用
master
和new\u feature
我本应该在一个特定的功能上工作,我认为这个功能将是新功能的一部分
所以,我从新功能
分支中签出了特定功能
分支,就像这样
git checkout -b specific_feature
现在,我在这个特定功能
分支中进行了大量开发,将上游/新功能
合并到其中几次,以获得远程更改
现在,我知道我的特定功能
应该是从主功能
扩展而来,而不是新功能
。(新功能
分支未准备好推送)
有没有一种方法可以将我的特定功能
分支和新功能
分支之间的差异,并将这些更改应用到新分支,例如特定功能
(从主分支出来)?这似乎是一项适合以下人员的工作:
这将仅在新功能
之后提交到特定功能
头部,并将其重播到主功能
请注意,然后您必须强制将特定的推送功能推送到上游(如果您之前已经推过):git push--force-specific\u功能
如果其他人已经拔出该分支并正在努力,这可能是一个问题
正确指出:
我不认为这会起作用,因为OP在特定功能分支中多次合并了
上游/new\u功能
分支
如果从未更新过新功能(仅获取,从不提取),则该功能可能仍然有效。如果更新了
new_功能
并将其合并到specific_功能
,则rebase--on
将只播放自上次合并以来的最后几次提交:在这里,只播放z'
提交,而不是第一次z
x--x--x
\
y--y--Y--y--y (new_feature)
\ \
z--M--z'--z' (specific_feature)
我会:
- 从
中创建master
(并将specific\u功能
分支标记为specific\u功能
)tmp
- 将
(在Y
中合并的最后一个specific\u功能
commit)合并到新的new\u功能
分支中specific\u功能
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--on
可以使用相同的公共祖先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命令检索在特定_要素分支上完成的提交,而该提交不会出现在origin/new_要素分支上
git cherry origin/new_feature specific_feature
然后,您可以从master和cherry-pick创建一个新的分支来完成所有这些提交。
但是,如果您的开发依赖于特定的_功能和原始/新_功能,则scm不会为您解决这一问题
git checkout -b specific_feature_master master
git cherry origin/new_feature specific_feature | egrep '^+' | awk '{print $2} | xargs git cherry-pick
像这样的东西应该是解决问题的起点。我认为这不会起作用,因为OP会在特定的功能中与上游/新功能分支合并几次branch@davidriod好的,我已经编辑了这个问题,提出了一个基于合并的备选方案(而不是樱桃采摘,我倾向于避免樱桃采摘,因为提交重复()@VonC我可能理解得很透彻,但基本上这是一个功能重新安排,可能发生在项目中,新功能中的代码根本不应该被合并到主分支中。关于提交重复,如果特定功能被删除,这不是一个真正的问题。基本上我认为OP只是想重新开始从新特性分支独立构造特定特性。小编辑到最后一行:
git cherry origin/new|u特性特定特性| egrep'^\+'| awk'{print$2}'| xargs git cherry pick
git checkout -b specific_feature_master master
git cherry origin/new_feature specific_feature | egrep '^+' | awk '{print $2} | xargs git cherry-pick