Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git 将两个分支之间的差异合并到第三个分支_Git_Diff - Fatal编程技术网

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功能
    中合并的最后一个
    new\u功能
    commit)合并到新的
    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