Предоставляет ли Git предупреждение, если стенографический идентификатор фиксации может ссылаться на 2 разных фиксации?

Если cee157 может ссылаться на 2 разных идентификатора фиксации, например

cee157eb799af829a9a0c42c0915f55cd29818d4 и cee1577fecf6fc5369a80bd6e926ac5f864a754b

будет Git предупредить меня, если я наберу git log cee157? (или Git 1.8.5.2 (Apple Git -48) позволяет ввести git log cee1).

Я думаю, что это должно произойти, хотя я не могу найти авторитетный источник, который говорит, что это будет.

Ответ 1

Он должен дать вам что-то вроде этого:

$ 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 коммитов я нашел немало изменений с общим четырехзначным префиксом. Я выбрал четырехзначный префикс, потому что это самая короткая юридическая длина, поддерживаемая Git. (Не работает с 3 цифрами или меньше, даже если не двусмысленно.)

Btw это не была опечатка, я не знаю, почему сообщение об ошибке с неоднозначным SHA1 появляется дважды, независимо от количества дубликатов SHA1 (с двумя и тремя):

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 предупредит вас о дубликатах. (Он откажется работать с дубликатами.) Я бы предположил, что многие старые версии тоже работали.

UPDATE

При тестировании этого вам требуется минимум 4-значный SHA1, из-за int minimum_abbrev = 4 в environment.c. (Спасибо @devnull за то, что указали это!)

Ответ 2

Оригинальный плакат гласит:

Я думаю, что это должно быть, хотя я не могу найти авторитетный источник, говорит, что это будет.

Авторитетный источник можно найти в исходном коде get_short_sha1().

Цитата this:

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

и this:

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;

Кроме того, существуют тесты, чтобы гарантировать, что функция работает должным образом.