Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/25.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_Branch_Diff - Fatal编程技术网

git的多分支差异?

git的多分支差异?,git,branch,diff,Git,Branch,Diff,有没有一种简单的方法可以用git获得多个(两个以上)分支之间的差异?(有点像“八达通差异”?) 情况是,存在一个分支(称为分支a),它是多个其他分支(称为B和C)以及其他修改合并的结果。(分支A与分支B不同,进行了大量的本地修改,然后合并了分支C,接着进行了更多的本地修改,然后进行了更多的本地修改和重新合并,以包括对B和C分支的更新。) 我想做的是查看分支机构A特有的所有本地更改——也就是说,查看分支机构A所做的哪些更改不在分支机构B或分支机构C上。(发布一个选项,该选项并不能完全回答我的问题,

有没有一种简单的方法可以用git获得多个(两个以上)分支之间的差异?(有点像“八达通差异”?)

情况是,存在一个分支(称为分支a),它是多个其他分支(称为B和C)以及其他修改合并的结果。(分支A与分支B不同,进行了大量的本地修改,然后合并了分支C,接着进行了更多的本地修改,然后进行了更多的本地修改和重新合并,以包括对B和C分支的更新。)

我想做的是查看分支机构A特有的所有本地更改——也就是说,查看分支机构A所做的哪些更改不在分支机构B或分支机构C上。

(发布一个选项,该选项并不能完全回答我的问题,但我在研究过程中困惑了。)

一种可能性是使用
git log
的-p(patch)选项,它可以为包含和排除使用多个分支标签:

git log -p branch_A ^branch_B ^branch_C
不过,这并不像git diff那样给出一个单一的更改摘要,而是为分支a中包含的每个提交提供单独的更改,而不是分支B或C中包含的每个提交

虽然对于获取分支A引入的更改的总体情况来说并不理想,但当您试图从分支A中挑选更改时,此逐个提交摘要可能更有用。

将分支B中的“bPlusC”去掉,然后合并“C”。用“A”来区分

编辑:根据R.M.的评论:

如果B或C有不在使用中的提交,则:

git checkout -b bPlusC $(git merge-base A B)
git merge --no-ff $(git merge-base A C)
git checkout A
git diff bPlusC..HEAD

只有当B和C完全合并到A中时,这才有效。如果这些分支还没有合并到A中,它们将在差异上显示为相反的变化。为了纠正这一点,我认为git merge base应该有帮助:
git checkout-bPlusC B$(git merge base A B)
git merge--no ff$(git merge base A C)
(虽然你真的需要--no ff?@R.M.我改变了答案。
--no ff
不是严格必要的,但它留下了更多可见的痕迹。因为你不会推动这个分支(我希望),我不太担心制造“丑陋”的问题合并。轻微添加/更正:根据合并模式的复杂程度,可能有多个合并基,但默认情况下只输出一个。标记“-all”将获取所有合并基,但协议略有更改。A
git merge base--all A B C
应(?)找到相关提交的SHA1(A分支必须首先出现,然后是两个或多个负分支)。如果只有一个分支,恭喜你,请将其用作差异参考。如果有多个分支,则对列出的SHA1使用新的分支+合并策略,而不是B&C提交或命令替换。
git checkout -b bPlusC $(git merge-base A B)
git merge --no-ff $(git merge-base A C)
git checkout A
git diff bPlusC..HEAD