git diff 只显示 A 分支领先于 B 分支的提交记录

54
有时我遇到如下问题:
  1. 在一个功能分支中添加一些提交。

  2. 从上游更新主分支。

  3. 想要查看功能分支与主分支之间的差异,但是 git diff master 显示了主分支中所有已添加/删除的内容,而我真正想要看到的只是功能分支领先于主分支的提交,而不是落后于主分支的提交。

是否有一种方法可以在不将主分支合并到功能分支中的情况下完成这个操作?


1
这个问题并没有明确说明你是想看到feature分支有而master分支没有的提交,还是只想看到在feature分支中做出的尚未在master分支中完成的更改差异。 - user456814
可能是[使用Git,显示一个分支中而不在另一个(些)分支中的所有提交]的重复问题(https://dev59.com/8XI-5IYBdhLWcg3wta7w)。 - 0 _
5个回答

76

16
如果你在特性分支上,并执行git diff master...,省略特性分支名称,这也是有效的。 - lee penkman

38

我通常选择

git log -p feature-branch --not master

但如果您想要一个差异,您正在寻找

git diff <common-ancestor> master

其中<common-ancestor>是你想要与主分支进行比较的功能分支和主分支共同的祖先。你可以使用merge-base来找到它。

git diff `git merge-base feature-branch master` feature-branch

1
这不会显示分支点之后主分支上的提交,而是显示功能分支上的更改吗? - gtrig
1
使用 git log master --not <commit-sha-id> 而不带 -p 参数,我得到了没有差异的提交记录。 - Rubens Mariuzzo
如果您想要在分支中查看所有提交的差异,但不包括master分支中的提交,您也可以使用git diff master^ feature-branch或者只是git diff master^。即使在Windows上,其中cmd.exe没有反引号,这个命令也能正常工作。 - Andrey Starodubtsev

34

你的问题有点不清楚,因为我不确定你是想看到masterfeature之间更改的差异/补丁,还是只想看到哪些分支包含了另一个分支没有的提交。

假设你只想看到在feature分支中存在但在master中不存在的提交(即feature中哪些提交领先于master),那么你可以执行以下操作:

$ git log --oneline --graph master..feature

如果您想查看masterfeature如何分叉,可以使用以下命令:
$ git log --oneline --graph --first-parent \
--decorate --left-right master...feature
> 5bef654 (feature) A ...
> f7c65ea B ...
> fc66245 C ...
> 7435fc0 D ...
< bf68204 (master) X ...
< 0c10ed1 Y ...
< 27bb774 Z ...

以上输出显示了在feature中没有的master提交,这些提交前面带有<(因为您在命令中使用了master...feature,并将master放在左侧),而在master中没有的feature提交则标有>,因为您在master...feature命令中使用了右侧的feature。在此形式中,三个点...很重要,请不要遗漏。

您可以从Pro Git书籍中了解更多关于指定提交范围的信息。


4
$ git log --oneline --graph master..feature 这个命令完美运行。 - eloone

0

如果我理解你的问题正确,你的功能分支基于主分支,你想查看你在功能分支上提交的内容与从中分支时主分支的差异。

A----B----C
 \
  D----E----F

在这种情况下,您可以使用带有相应提交哈希的git diff命令。 因此,对于从A点分支并随后提交D、E和F的功能分支,您可以执行以下操作:
git diff <hash of commit F> <hash of commit A>

您可以使用git merge-base feature master命令查看要使用的点A的哈希值,使用git log命令查看功能分支上最新提交F的哈希值。或者,您可以使用以下命令将所有操作都放在一行中:

git diff feature `git merge-base feature master`

1
请注意,您可以使用 git merge-base 在一行中完成此操作。 - Dietrich Epp

0

这不是一个确切的答案,但对于我的需求,它是一个有效的一行代码。

git difftool -d master..


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接