两次提交之间的提交次数

问题描述 投票:0回答:4

如何找到

git
中两次提交之间的提交数量?

此外,有什么方法可以让我对 GitHub 上的任何项目执行相同的操作(使用 UI,而不是 API)?

git github
4个回答
68
投票

在我给你答案之前,请考虑一下这个提交图:

        o -----------
       /             \
... - A - o - o - o - B
       \         /
        o ----- o

每个

o
代表一次提交,
A
B
也是如此(它们只是让我们谈论特定提交的字母)。 提交
A
B
之间有多少次提交?

也就是说,在更线性的情况下,只需使用

git rev-list --count A..B
,然后决定“之间”的含义(它是否包括 B 并排除 A?这就是
git rev-list --count
的行为方式)。 在像这样的分支情况下,您将获得所有分支的所有提交;例如,添加
--first-parent
,仅遵循“主线”。

(您还提到了“commitish”,表明我们可能有带注释的标签。这不会影响

git rev-list
的输出,它只计算特定的提交。)


编辑:由于

git rev-list --count A..B
包含提交
B
(同时省略提交
A
),并且您想要排除两个端点,因此需要减去 1。 在现代 shell 中,您可以使用 shell 算术来完成此操作:

count=$(($(git rev-list --count A..B) - 1))

例如:

$ x=$(($(git rev-list --count HEAD~3..HEAD) - 1))
$ echo $x
2

(这个特定的存储库具有非常线性的图形结构,因此这里没有分支,并且在提示“之间”和提示后面的三个提交有两个提交)。 但请注意,如果

A
B
标识 same 提交,这将产生 -1:

$ x=$(($(git rev-list --count HEAD..HEAD) - 1))
$ echo $x
-1

所以你可能想先检查一下:

count=$(git rev-list --count $start..$end)
if [ $count -eq 0 ]; then
    ... possible error: start and end are the same commit ...
else
    count=$((count - 1))
fi

52
投票
$ git log 375a1..58b20 --pretty=oneline | wc -l

指定开始提交,然后指定结束提交,然后计算行数。 这应该是这两个提交范围之间的提交计数。 使用

--pretty=oneline
格式,以便每次提交占用一行。

请注意,使用两个点 (

375a1..58b20
) 与使用三个点 (
375a1...58b20
) 不同;请参阅Git 提交范围中双点“..”和三点“...”之间有什么区别?了解有关此内容的更多信息并确定您要使用哪一个。

至于 GitHub 中的 GUI,我不知道有什么方法可以完成同样的任务。 但这应该是微不足道的,因为上面是直接使用 Git 和 Bash 来完成此操作的可能方法。


8
投票

获取提交数量:

git rev-list newer ^older --pretty=oneline --count

使用修订号或 SHA:

git rev-list db8fb95e6256bd52a668bae82d8b5a73152869fa ^1aeae117c58c173fee9cb3550297498142887aa5 --pretty=oneline --count
  • [newer] 和 [older] 可以是 SHA、分支或标签。
  • 重要提示:如果您有复杂的 git 图,您应该阅读 @torek 的优秀答案
  • 感谢@matt wilkie 的评论和原始来源

0
投票

提交范围可能会在损坏的存储库上失败:

$ git rev-list --count b00aa8ded74..master
error: Could not read 29026cc404895cc9f9afa55c4e2d53b7a4a5a319
fatal: revision walk setup failed

$ git log --oneline b00aa8ded74..master | wc -l
error: Could not read 29026cc404895cc9f9afa55c4e2d53b7a4a5a319
fatal: revision walk setup failed

替代方案:

git log
grep

depth=$(git log --format=%H $rev2 | grep -m1 -n -x $rev1 | cut -d: -f1)

grep -m1
会在第一场比赛后停止
git log
,所以不会有错误

© www.soinside.com 2019 - 2024. All rights reserved.