在从主分支(例如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
分支的尖端。
答案 0 :(得分:1)
似乎没有git
命令可让您精确地执行此操作。 master..HEAD
语法的意思是:
在
HEAD
上提交,但在master
上不是
以下语句是等效的:
git log --oneline master..HEAD
git log --oneline HEAD --not master
因此,尤其是在处理合并提交时,要解释git要排除的历史记录的哪一部分是很复杂的。
不过,您可以告诉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
。也就是说,B
或git 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-H
和E
已修饰,并将包括边界提交H
。生成的图形将非常清楚地显示B
是共享的基于合并的提交。
当图形变得复杂时,B
会添加回太多个提交。无论如何,当--boundary
引入的图线数量多时,多余的提交仍将被合理清晰地显示出来-就像这些东西一样清晰。您可以添加git log --graph
来帮助消除许多视觉混乱:生成的图形可能可读,并且可以让您识别共享的提交。