git rev-parse - словарь Git'а. Знает все формы записи коммитов и
ссылок и переводит их в один канонический SHA.
Базовая форма
git rev-parse HEAD
# a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0
git rev-parse main
# 7c8d9e0f1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d
Если имя неоднозначно - выдаст ошибку. Если такого имени нет - exit code ненулевой.
Синтаксис ссылок
| Запись | Что значит |
|---|---|
HEAD | куда сейчас указывает HEAD |
main | вершина ветки main |
v1.0 | коммит, на который указывает тег |
HEAD~3 | три коммита назад по первому родителю |
HEAD^ | первый родитель (то же что HEAD~1) |
HEAD^2 | второй родитель (для merge-коммитов) |
HEAD@{yesterday} | где была HEAD вчера (через reflog) |
:/fix typo | последний коммит, в сообщении которого есть «fix typo» |
<tag>^{commit} | коммит, на который указывает annotated tag |
HEAD:src/main.rs | blob этого файла из текущего коммита |
Утилитарные режимы
Помимо перевода имени в SHA, у rev-parse есть несколько практичных режимов:
git rev-parse --show-toplevel
# /home/user/project ← корень репозитория
git rev-parse --git-dir
# /home/user/project/.git ← где лежит .git/
git rev-parse --abbrev-ref HEAD
# main ← имя текущей ветки
git rev-parse --short HEAD
# a1b2c3d ← короткий уникальный SHA
git rev-parse --is-inside-work-tree
# true ← мы в репозитории?
--show-toplevel особенно полезен в скриптах и git-hooks: из
любой подпапки даёт корень репозитория.
В скриптах
Перевести «текущий коммит» в SHA и сохранить:
CURRENT=$(git rev-parse HEAD)
Проверить, что в репозитории:
if git rev-parse --git-dir > /dev/null 2>&1; then
echo "это git repo"
fi
Получить имя текущей ветки (без refs/heads/):
BRANCH=$(git rev-parse --abbrev-ref HEAD)
Это всё стандартные приёмы в bash-скриптах вокруг Git.
Подводные камни
HEAD^иHEAD~1это одно и то же. НоHEAD^2≠HEAD~2: первое - второй родитель merge-коммита, второе - второй коммит назад по первому родителю.git rev-parse <tag>для annotated tag вернёт SHA tag-объекта, а не коммита. Если нужен коммит -<tag>^{commit}.- На пустом репозитории
git rev-parse HEADвернёт ошибку, потому что HEAD ещё ни на что не указывает.