git 两个提交之间的提交数

eivgtgni  于 2023-02-14  发布在  Git
关注(0)|答案(4)|浏览(317)

我如何在git中找到两次提交之间的提交数?
另外,有没有什么方法可以让我对GitHub上的任何项目都做同样的事情(使用UI,而不是API)?

jaql4c8m

jaql4c8m1#

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

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

每个o代表一次提交,AB也是如此(它们只是字母,让我们讨论 * 特定 * 的提交)。在提交AB之间有多少次提交?
也就是说,在更线性的情况下,只需要使用git rev-list --count A..B,然后决定"between"是什么意思(它包含B而不包含A吗?git rev-list --count就是这样做的)。在像这样的分支情况下,你会得到所有分支下的所有提交;例如,添加--first-parent以仅跟随"主线"。
(You我还提到了"commitish",这意味着我们可能已经注解了标签,但这不会影响git rev-list的输出,因为git rev-list只统计特定的提交。
编辑:由于git rev-list --count A..B包含了提交B(而省略了提交A),并且你想排除这两个端点,你需要减去一个端点。在现代的shell中,你可以使用shell算法来实现这一点:

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

例如:

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

(this一个特定的repo有一个非常线性的图结构,所以这里没有分支,并且有两个"在" tip "之间的提交和三个在tip之后的提交)。但是,注意,如果AB标识了 * 相同的 * 提交,这将产生-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
rt4zxlrg

rt4zxlrg2#

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

指定开始提交和结束提交,然后计算行数。这应该是这两个提交范围之间的提交数。使用--pretty=oneline,使每个提交占一行。
注意,使用两个点(375a1..58b20)不同于使用三个点(375a1...58b20);请参阅What are the differences between double-dot “..” and triple-dot “…” in Git commit ranges?以获取更多信息,并确定您要使用哪个。
至于GitHub中的GUI,我不知道有什么方法可以完成同样的任务,但这应该是微不足道的,因为上面的方法可以直接使用Git和Bash来完成。

wbgh16ku

wbgh16ku3#

另一个内衬

git rev-list newer ^older --pretty=oneline --count
使用修订号或SHA:
git rev-list db8fb95e6256bd52a668bae82d8b5a73152869fa ^1aeae117c58c173fee9cb3550297498142887aa5 --pretty=oneline --count
  • [较新]和[较旧]可以是SHA、分支或标记。
    ***重要提示:**如果你有一个复杂的git图表,你应该阅读@torek的excellent answer
  • 这要归功于@matt wilkie的评论和original source
kt06eoxx

kt06eoxx4#

提交范围可能在损坏的repo上失败:

$ 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 loggrep

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

grep -m1将在第一次匹配后停止git log,因此没有错误

相关问题