↓Перейти к содержанию
  1. Git: руководства и команды/

git cat-file: просмотр внутренних объектов Git

·5 минут·

git cat-file — низкоуровневая команда Git для просмотра содержимого, типа и размера объектов в хранилище объектов. Название происходит от Unix команды cat и «file» — файл объекта. Это основной инструмент для изучения внутреннего устройства Git.

Основные опции #

git cat-file [опция] <объект>

Три главные опции:

# -t: показать тип объекта
git cat-file -t <хеш>
# blob / tree / commit / tag

# -s: показать размер объекта в байтах
git cat-file -s <хеш>
# 1234

# -p: показать содержимое объекта (pretty-print)
git cat-file -p <хеш>

Работа с blob объектами #

Blob хранит содержимое файла:

# Найти хеш blob для файла в HEAD
git ls-tree HEAD README.md
# 100644 blob a8c4e7d3f2b1...  README.md

# Посмотреть содержимое
git cat-file -p a8c4e7d3
# # My Project
# This is the README file.

# Узнать тип
git cat-file -t a8c4e7d3
# blob

# Узнать размер
git cat-file -s a8c4e7d3
# 38

Получить хеш blob для конкретного файла в конкретном коммите:

# Хеш blob файла src/index.js в HEAD
git rev-parse HEAD:src/index.js

# Хеш blob в конкретном коммите
git rev-parse abc1234:src/index.js

Работа с tree объектами #

Tree представляет директорию:

# Посмотреть tree HEAD коммита
git cat-file -p HEAD^{tree}
100644 blob a8c4e7d3...  README.md
100644 blob f3b2c8a1...  package.json
040000 tree 9d2f1b4e...  src
040000 tree 5a8c3e2f...  tests
# Права файлов:
# 100644 — обычный файл
# 100755 — исполняемый файл
# 120000 — символическая ссылка
# 040000 — директория (tree)
# 160000 — gitlink (submodule)

# Посмотреть вложенный tree
git cat-file -p 9d2f1b4e
# 100644 blob b1c2d3e4...  index.js
# 100644 blob c2d3e4f5...  utils.js

Работа с commit объектами #

# Посмотреть последний коммит
git cat-file -p HEAD
tree 9d2f1b4e5a8c3e2f1b4e5a8c3e2f1b4e5a8c3e2f
parent a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0
author Иван Иванов <[email protected]> 1710000000 +0300
committer Иван Иванов <[email protected]> 1710000000 +0300

feat: add user authentication
# Посмотреть конкретный коммит по хешу
git cat-file -p a1b2c3d4

# Посмотреть коммит по ветке
git cat-file -p main

# Посмотреть родительский коммит
git cat-file -p HEAD~1

# Merge commit имеет два родителя:
# parent a1b2c3d4...
# parent e5f6a7b8...

Работа с tag объектами #

Аннотированный тег — отдельный объект:

# Посмотреть тег
git cat-file -p v1.0.0
object a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0
type commit
tag v1.0.0
tagger Иван Иванов <[email protected]> 1710000000 +0300

Release version 1.0.0

This release includes:
- User authentication
- Bug fixes
# Лёгкий тег (lightweight) ссылается напрямую на коммит:
git cat-file -t v1.0.0-light
# commit  ← не tag!

Пакетный режим #

Для обработки множества объектов:

# --batch: читает хеши из stdin, выводит метаданные и содержимое
echo "HEAD" | git cat-file --batch
# a1b2c3d4... commit 234
# tree 9d2f...
# parent a0b1...
# ...

# --batch-check: только метаданные (без содержимого)
echo "HEAD" | git cat-file --batch-check
# a1b2c3d4... commit 234

# Обработать все объекты репозитория
git cat-file --batch-check --batch-all-objects
# a1b2c3d4... commit 234
# b2c3d4e5... blob 38
# ...

# Статистика по типам объектов
git cat-file --batch-check --batch-all-objects | awk '{print $2}' | sort | uniq -c
#  42 blob
#  15 commit
#  15 tree
#   3 tag

Практические примеры #

# Извлечь содержимое файла из прошлого коммита
git cat-file -p HEAD~5:src/config.js > old-config.js

# Проверить, одинаковы ли два файла в разных коммитах
hash1=$(git rev-parse HEAD:file.txt)
hash2=$(git rev-parse HEAD~1:file.txt)
[ "$hash1" = "$hash2" ] && echo "Файлы одинаковы" || echo "Файлы различаются"

# Найти все большие blobs в репозитории
git cat-file --batch-check --batch-all-objects |
  awk '$2=="blob" {print $3, $1}' |
  sort -rn |
  head -10 |
  while read size hash; do
    echo "$size bytes: $(git log --all --oneline --find-object=$hash | head -1)"
  done

# Просмотреть полный граф коммитов вручную
git cat-file -p HEAD
git cat-file -p <parent-hash>  # перейти к родителю

Ссылки на объекты #

git cat-file принимает различные форматы ссылок:

# По полному SHA-1 хешу (40 символов)
git cat-file -p a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0

# По сокращённому хешу (минимум 4 символа)
git cat-file -p a1b2

# По имени ветки
git cat-file -p main

# По тегу
git cat-file -p v1.0.0

# По HEAD с указателями
git cat-file -p HEAD        # текущий коммит
git cat-file -p HEAD^       # родитель
git cat-file -p HEAD~3      # 3 коммита назад
git cat-file -p HEAD^{tree} # tree коммита HEAD
git cat-file -p HEAD:path   # объект по пути в коммите HEAD

Разница с git show #

git show — высокоуровневая команда с форматированием. git cat-file — низкоуровневая с сырыми данными:

# git show форматирует вывод для человека
git show HEAD
# commit a1b2c3d4... (HEAD -> main)
# Author: Иван Иванов <[email protected]>
# Date:   Fri Mar 13 2026
#
#     feat: add user authentication
#
# diff --git a/src/auth.js b/src/auth.js
# ...

# git cat-file показывает сырой объект
git cat-file -p HEAD
# tree 9d2f...
# parent ...
# author ...
# committer ...
#
# feat: add user authentication

Часто задаваемые вопросы #

Зачем нужен git cat-file если есть git show и git log? git cat-file работает напрямую с объектным хранилищем Git без интерпретации. Это полезно для скриптов, отладки и изучения внутреннего устройства Git.

Как посмотреть все файлы, изменённые в коммите? Через git diff-tree --no-commit-id -r <хеш> или git show --stat <хеш>. git cat-file для этого не предназначен.

Можно ли создать объект через git cat-file? Нет, git cat-file только читает. Для создания объектов используйте git hash-object -w.

Что означает missing в выводе –batch-check? Объект с указанным хешем не существует в репозитории.

Как найти, в каком коммите появился файл с определённым хешем? git log --all --find-object=<хеш> покажет все коммиты, которые касались этого объекта.

Заключение #

git cat-file — инструмент для прямого доступа к объектному хранилищу Git. Три основные опции: -t (тип), -s (размер), -p (содержимое). Пакетный режим --batch эффективен для массовой обработки. Команда полезна для изучения внутреннего устройства Git, отладки и написания скриптов.