如果一个速记提交 ID 可以引用2个不同的提交,Git 会警告我吗?

如果 cee157可以引用2个不同的提交 ID,例如

cee157eb799af829a9a0c42c0915f55cd29818d4cee1577fecf6fc5369a80bd6e926ac5f864a754b

如果我输入 git log cee157 Git 会警告我吗?(或者 Git 1.8.5.2(Apple Git-48)允许我输入 git log cee1)。

我认为应该是这样的,尽管我找不到任何权威的消息来源来证明这一点。

4937 次浏览

它应该给你这样的东西:

$ git log cee157
error: short SHA1 cee157 is ambiguous.
error: short SHA1 cee157 is ambiguous.
fatal: ambiguous argument 'cee157': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'

我只是在一个真正的 Git 存储库中测试了一下,通过找到带有如下重复前缀的提交:

git rev-list master | cut -c-4 | sort | uniq -c | sort -nr | head

这将获取 master中的修订列表,删除前4个字符,抛弃其余字符,计算重复字符并进行数字排序。在我相对较小的约1500次提交存储库中,我发现了相当多的修订版本,其前缀通常为4位数。我选择了一个4位前缀,因为它似乎是 Git 支持的最短法定长度。(对于3位或更少的数字不起作用,即使不是模棱两可的。)

顺便说一下,这不是一个输入错误,我不知道为什么关于模棱两可的 SHA1的错误消息出现了两次,而不管重复的 SHA1的数量(尝试用2和3) :

error: short SHA1 cee157 is ambiguous.
error: short SHA1 cee157 is ambiguous.

(都在 stderr上。实际上整个输出在 stderr上,在 stdout上没有输出。)

Windows 测试:

$ git --version
git version 1.8.1.msysgit.1

我认为可以这样说,如果您的版本 > = 1.8.1,Git 威尔会提醒您注意重复。(它将拒绝使用复制品。)我猜更老的版本也是这样工作的。

更新

当测试这个时,您需要至少4位 SHA1,因为 环境保护中的 int minimum_abbrev = 4。(谢谢 @ devnull指出这一点!)

原来的海报上写着:

我认为它应该,虽然我找不到任何权威的来源 他说会的。

可以在源代码 get_short_sha1()中找到权威的源代码。

引用 这个:

if (!quietly && (status == SHORT_NAME_AMBIGUOUS))
return error("short SHA1 %.*s is ambiguous.", len, hex_pfx);

这个:

if (!ds->candidate_checked)
/*
* If this is the only candidate, there is no point
* calling the disambiguation hint callback.
*
* On the other hand, if the current candidate
* replaced an earlier candidate that did _not_ pass
* the disambiguation hint callback, then we do have
* more than one objects that match the short name
* given, so we should make sure this one matches;
* otherwise, if we discovered this one and the one
* that we previously discarded in the reverse order,
* we would end up showing different results in the
* same repository!
*/
ds->candidate_ok = (!ds->disambiguate_fn_used ||
ds->fn(ds->candidate, ds->cb_data));


if (!ds->candidate_ok)
return SHORT_NAME_AMBIGUOUS;

此外,测试的存在也是为了确保特性按预期工作。