当前分支和主节点之间的Git差异,但不包括未合并的主节点提交


171

我想要一个尚未合并到master的分支的所有更改的差异。

我试过了:

git diff master
git diff branch..master
git diff branch...master

但是,在每种情况下,差异文件都包含master中尚未合并到我的分支中的内容。

有没有一种方法可以在我的分支和主服务器之间进行区分,以排除尚未合并到我的分支中的主服务器中的更改?


9
如果翻阅第二个版本,您会得到想要的:git diff master..branch。您可以将其缩短为git diff master..分支机构。该r1..r2语法是短期的^r1 r2,意思是“给我的一切,从下降r2,无法从可达r1”。 git help gitrevisions提供有关您可以使用的各种语法的信息。
John Szakmeister

1
阅读更多有关的...语法后,我扩大了答案git diff。@jszakmeister您的评论是错误的,因为所描述的修订范围与gitrevisions无关git diff。Diff比较历史记录中的两个点,不能与范围一起使用。
Palec 2014年

你是对的。我总是忘了它的git diff工作原理与其他命令不同……我发现这很令人沮丧。:-(
约翰·萨克梅斯特

比较之前请确保您更新了master的本地副本
joe

Answers:


232
git diff `git merge-base master branch`..branch

合并基础branch偏离的点master

Git diff为此支持一种特殊的语法:

git diff master...branch

您不得交换双方,因为那样您将获得另一个分支。您想知道branch自从发生变化以来发生了什么变化master,而不是相反。

松散相关:


请注意,.....语法与其他Git工具中的语义不同。它与中指定的含义不同man gitrevisions

报价man git-diff

  • git diff [--options] <commit> <commit> [--] [<path>…]

    这是为了查看两个任意之间的变化<commit>

  • git diff [--options] <commit>..<commit> [--] [<path>…]

    这与以前的形式同义。如果<commit>省略了一侧,它将具有与HEAD代替相同的效果。

  • git diff [--options] <commit>...<commit> [--] [<path>…]

    此表格用于查看包含且直到第二个分支的分支上的更改,从两个分支<commit>的共同祖先开始<commit>。“ git diff A...B”等同于“ git diff $(git-merge-base A B) B”。您可以省略中的任何一个<commit>,与使用效果相同HEAD

万一您在做异国情调的情况下,应该注意的是<commit>,除了使用“ ..”符号的最后两种形式以外,上述描述中的所有内容都可以是任何<tree>

有关拼写方式的更完整列表<commit>,请参见中的“指定修订版本”部分gitrevisions[7]。但是,“ diff”是关于比较两个端点,而不是范围,并且范围符号(<commit>..<commit>“和<commit>...<commit>”)不表示的“指定范围”部分中定义的范围gitrevisions[7]


对我来说,$ git diff master...branch产生的fatal: ambiguous argument 'master...branch': unknown revision or path not in the working tree.-这是一个版本相关的命令?
乔尔·佩尔顿

实际上,我只是意识到“分支”必须是您分支的名称,我认为这是对当前分支的引用
Joel Peltonen

4
您是对的,我的答案取决于被称为的分支branch。我选择保留OP在问题中选择的名称。如果要使用当前分支,请替换branchHEAD
Palec

14
请注意,您可以使用git diff master...避免指定分支(将采用当前分支)。
VasiliNovikov '16

1
签出devel@ChrisGuest 后,原始命令是否有效?Git可能在结帐时为您创建了分支,作为远程​​分支的本地副本(通常是origin/devel)。如果真是这样,git diff origin/devel...bugfix/API-353-api-allows-database-access-when即使在结帐之前也可以使用。
Palec'8

44

这对我有用:

git diff origin/master...

这仅显示我当前选择的本地分支和远程主分支之间的更改,并忽略本地分支中来自合并提交的所有更改。


作为参考,如果您需要包含这些更改的提交的提交引用,请使用git cherry origin/master
jaytibann

如果这显示了一堆您没想到的垃圾,则master可能是从您下面重新构建了一组提交。
Michael-Clay Shirky在哪里

21

正如John Szakmeister和VasiliNovikov所指出的那样,从master的角度对您的分支获取完整差异的最短命令是:

git diff master...

这将使用您的母版本地副本。

要比较特定文件,请使用:

git diff master... filepath

输出示例:

用法示例

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.