# git rev-parse _Инструменты · GitLab Knowledge Base_ **TL;DR:** Plumbing-команда, которая переводит человекочитаемые имена ссылок (HEAD, main~2, v1.0, :/typo) в полные SHA. Используется всеми porcelain-командами под капотом и удобна в скриптах. `git rev-parse` - словарь Git'а. Знает все формы записи коммитов и ссылок и переводит их в один канонический SHA. ## Базовая форма ```bash 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» | | `^{commit}` | коммит, на который указывает annotated tag | | `HEAD:src/main.rs` | blob этого файла из текущего коммита | ## Утилитарные режимы Помимо перевода имени в SHA, у rev-parse есть несколько практичных режимов: ```bash 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 и сохранить: ```bash CURRENT=$(git rev-parse HEAD) ``` Проверить, что в репозитории: ```bash if git rev-parse --git-dir > /dev/null 2>&1; then echo "это git repo" fi ``` Получить имя текущей ветки (без `refs/heads/`): ```bash BRANCH=$(git rev-parse --abbrev-ref HEAD) ``` Это всё стандартные приёмы в bash-скриптах вокруг Git. ## Подводные камни - `HEAD^` и `HEAD~1` это одно и то же. Но `HEAD^2` ≠ `HEAD~2`: первое - второй родитель merge-коммита, второе - второй коммит назад по первому родителю. - `git rev-parse ` для annotated tag вернёт SHA tag-объекта, а не коммита. Если нужен коммит - `^{commit}`. - На пустом репозитории `git rev-parse HEAD` вернёт ошибку, потому что HEAD ещё ни на что не указывает. ## Команды ```bash git rev-parse HEAD ``` SHA текущего коммита ```bash git rev-parse --abbrev-ref HEAD ``` Имя текущей ветки ```bash git rev-parse --show-toplevel ``` Путь к корню репозитория ```bash git rev-parse HEAD:src/main.rs ``` SHA blob'а этого файла в текущем коммите ## См. также - [git cat-file](/courses/git/kb/cat-file.md) - [git log](/courses/git/kb/log.md) - [Ветка (branch)](/courses/git/kb/branch.md)