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

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

cee157eb799af829a9a0c42c0915f55cd29818d4cee1577fecf6fc5369a80bd6e926ac5f864a754b

将Git警告我,如果我inputgit log cee157 ? (或者Git 1.8.5.2(Apple Git-48)允许我inputgit log cee1 )。

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

它应该给你这样的东西:

 $ 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仓库上testing了这个,通过find这样的重复前缀的提交:

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

这取得master版本的修改列表,删除前4个字符并丢弃其余部分,重复计数并按数字sorting。 在我相对较小的约1500个提交库中,我发现了一些常见的4位数前缀的修订。 我select了一个4位数的前缀,因为这似乎是Git支持的最短法定长度。 (即使不明确,也不能使用3位或更less的数字。)

顺便说一句,这不是一个错字,不知道为什么有关不明确的SHA1错误消息出现两次,无论重复SHA1的数量(尝试2和3):

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

(两者都在stderr ,实际上整个输出都是stderrstdout没有任何东西)

在Windows中testing:

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

我认为可以肯定地说,如果你的版本是> = 1.8.1,Git 警告你重复。 (它会拒绝重复操作。)我猜想,旧版本也是这样工作的。

UPDATE

在testing时,由于environment.c中的int minimum_abbrev = 4 ,所以至less需要4位SHA1。 (感谢@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; 

此外, testing也存在以确保该function按预期工作。