git log显示两个分支(包括共同祖先)之间的提交有所不同

时间:2019-12-10 18:17:45

标签: git git-branch git-diff git-log

在从主分支(例如feature)创建的功能分支(例如master)上工作时,我使用以下git命令查看已添加到的提交列表不在feature分支上的master分支:

git log --oneline master..HEAD

这会输出feature上不在master上的提交的简短摘要(请注意,此命令是在检出feature分支之后运行的):

$ git log --oneline master..HEAD
1ca070a (HEAD -> feature) foo the bar
03a1047 baz the wuz
c9e8279 fop the sip
6ee6d6f up the ante
5812200 bop the binky

问题是,它没有显示master分支上的共同祖先提交。我想要的命令是再增加一行,这是共同的祖先提交,如下所示:

1ca070a (HEAD -> feature) foo the bar
03a1047 baz the wuz
c9e8279 fop the sip
6ee6d6f up the ante
5812200 bop the binky
fb37d68 (master) fuzzy the wuzzy

我希望将master替换为master~1会比共同祖先先提交一次,因此也要包括共同祖先,

git log --oneline master~1..HEAD

但是无论我指定master还是master~1,日志摘要始终是相同的。

$ git log --oneline master~1..HEAD
1ca070a (HEAD -> feature) foo the bar
03a1047 baz the wuz
c9e8279 fop the sip
6ee6d6f up the ante
5812200 bop the binky

我的问题是,如何在日志摘要中包括公共祖先提交?请注意,公共祖先不一定是master分支的尖端。

2 个答案:

答案 0 :(得分:1)

似乎没有git命令可让您精确地执行此操作。 master..HEAD语法的意思是:

  

HEAD上提交,但在master不是

以下语句是等效的:

git log --oneline master..HEAD
git log --oneline HEAD --not master

因此,尤其是在处理合并提交时,要解释git要排除的历史记录的哪一部分是很复杂的。

bash解决方法

不过,您可以告诉git log他应该显示多少次提交,因此使用一点bash魔术,下面的命令应该可以完成您想要的操作:

git log --oneline -$(( $(git rev-list --count HEAD ^master) + 1))

解释:

  • $(git rev-list --count HEAD ^master)计算自master以来当前分支上的提交次数
  • $(( num + 1 ))将数字增加1。
  • 然后我们运行git log --oneline -123(分支上的123提交数+ 1)

答案 1 :(得分:1)

我发现这种--boundary包含太多次提交,但是:

git log --boundary --right-only --oneline master...HEAD

应该使您接近。添加--graph(为了完整性--decorate,尽管显然已经设置了log.decorate),以获得更多有用的信息。省略--right-only以获得最有用的输出。给定--right-only,您可以将其简化为--boundary master..HEAD,但请继续阅读以了解为什么我建议不使用--right-only,而是使用--graph

这有点复杂:

  • 三点语法master...HEAD请求对称差异。也就是说,我们从三个点的左侧获取了master可以到达的所有提交,而HEAD却无法访问HEAD的所有提交,在右侧。

  • master选项(如果指定)将消除左侧提交。

  • --right-only选项将添加到图遍历要访问的提交集合中,这些选择被专门选择为 not 并通过对称显示差异算法。

考虑此图,绘制时将父提交向左提交,将孩子向右提交(而不是像--boundary那样,父级位于下方,子级位于上方)

git log --graph

这里的大写字母代表提交哈希ID。从 C--D--E <-- master / ...--A--B \ F--G--H <-- feature (HEAD) 可以将E返回C,从master可以将H通过F返回{名称HEAD)。提交feature是这两套提交的合并基础。

此处,B在左侧选择提交master...feature,在右侧选择C-D-E。 (请注意,颠倒名称F-G-H会选择相同的提交,但是现在feature...master就在右边。)因此,在此集合中添加C-D-E几乎可以使您 您想要的内容:通过--right-only进行提交,但不包括从HEAD可到达的提交。这就是您从简单的master获得的相同输出。

现在,如果我们添加master..feature,Git也将包括提交--boundary。也就是说,Bgit log --boundary master..feature都将显示提交git log --boundary --right-only master...feature(以其他顺序)。

对于B-F-G-H,当--decorate显示提交git log时,它将添加H装饰。但是,提交HEAD -> feature没有分支名称,因此不会被修饰。很难说提交B属于两个分支。

在没有B且没有--right-only--boundary的情况下,Git将在master上显示提交--graph,在功能上显示C-D-E,使用F-G-HE已修饰,并将包括边界提交H。生成的图形将非常清楚地显示B是共享的基于合并的提交。

当图形变得复杂时,B会添加回太多个提交。无论如何,当--boundary引入的图线数量多时,多余的提交仍将被合理清晰地显示出来-就像这些东西一样清晰。您可以添加git log --graph来帮助消除许多视觉混乱:生成的图形可能可读,并且可以让您识别共享的提交。