Что делает каретка (^!) После хэша commit при вызове git diff?

Просматривая исходный код brackets-git (расширение git для Brackets), я вижу, что ^! (cart bang) добавляется к хэшу commit при вызове git diff. См. GitCli.js, строка 754:

function getDiffOfFileFromCommit(hash, file) {
    return git(["diff", "--no-ext-diff", "--no-color", hash + "^!", "--", file]);
}

Это означает следующее в командной строке, используя данный файл в качестве примера:

$ git diff --no-ext-diff --no-color 1f9ea6e^! -- src/git/GitCli.js

Я знаю, что ^ будет ссылаться на родителя коммита. Что делает ^!?

Ответы

Ответ 1

commit^! - спецификатор диапазона, который означает: это фиксация, но ни один из ее родителей. Это эквивалентно заданию: commit ^parent1 ^parent2 ^parentN.

Для diff это не имеет смысла (вы можете сравнить только два дерева) Из тестирования команда, похоже, показывает различия между базой слияния родителей и последним родителем. Я думаю, что git (mis) интерпретирует параметры, похожие на диапазон A...B, который будет показывать различия между merge-base A B и B (git diff parent1...parent2 будет производить тот же самый diff). Не уверен, что произойдет в случае слияния осьминога.

Возможно, я ошибаюсь, это только предположения, которые я извлек из тестирования с помощью репозитория и посмотрел код git (builtin/diff.c).