我如何在git中找到两次提交之间的提交数?另外,有没有什么方法可以让我对GitHub上的任何项目都做同样的事情(使用UI,而不是API)?
git
jaql4c8m1#
在我给出答案之前,先考虑一下这个提交图:
o ----------- / \ ... - A - o - o - o - B \ / o ----- o
每个o代表一次提交,A和B也是如此(它们只是字母,让我们讨论 * 特定 * 的提交)。在提交A和B之间有多少次提交?也就是说,在更线性的情况下,只需要使用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算法来实现这一点:
o
A
B
git rev-list --count A..B
git rev-list --count
--first-parent
git rev-list
count=$(($(git rev-list --count A..B) - 1))
例如:
$ x=$(($(git rev-list --count HEAD~3..HEAD) - 1)) $ echo $x 2
(this一个特定的repo有一个非常线性的图结构,所以这里没有分支,并且有两个"在" tip "之间的提交和三个在tip之后的提交)。但是,注意,如果A和B标识了 * 相同的 * 提交,这将产生-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
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来完成。
--pretty=oneline
375a1..58b20
375a1...58b20
wbgh16ku3#
git rev-list newer ^older --pretty=oneline --count
git rev-list db8fb95e6256bd52a668bae82d8b5a73152869fa ^1aeae117c58c173fee9cb3550297498142887aa5 --pretty=oneline --count
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 log和grep
git log
grep
depth=$(git log --format=%H $rev2 | grep -m1 -n -x $rev1 | cut -d: -f1)
grep -m1将在第一次匹配后停止git log,因此没有错误
grep -m1
4条答案
按热度按时间jaql4c8m1#
在我给出答案之前,先考虑一下这个提交图:
每个
o
代表一次提交,A
和B
也是如此(它们只是字母,让我们讨论 * 特定 * 的提交)。在提交A
和B
之间有多少次提交?也就是说,在更线性的情况下,只需要使用
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算法来实现这一点:例如:
(this一个特定的repo有一个非常线性的图结构,所以这里没有分支,并且有两个"在" tip "之间的提交和三个在tip之后的提交)。但是,注意,如果
A
和B
标识了 * 相同的 * 提交,这将产生-1:因此,您可能需要首先检查:
rt4zxlrg2#
指定开始提交和结束提交,然后计算行数。这应该是这两个提交范围之间的提交数。使用
--pretty=oneline
,使每个提交占一行。注意,使用两个点(
375a1..58b20
)不同于使用三个点(375a1...58b20
);请参阅What are the differences between double-dot “..” and triple-dot “…” in Git commit ranges?以获取更多信息,并确定您要使用哪个。至于GitHub中的GUI,我不知道有什么方法可以完成同样的任务,但这应该是微不足道的,因为上面的方法可以直接使用Git和Bash来完成。
wbgh16ku3#
另一个内衬
使用修订号或SHA:
***重要提示:**如果你有一个复杂的git图表,你应该阅读@torek的excellent answer。
kt06eoxx4#
提交范围可能在损坏的repo上失败:
备选案文:
git log
和grep
grep -m1
将在第一次匹配后停止git log
,因此没有错误