git show: посмотреть один коммит целиком
Обновлено 31 июля 2026 г.
git show печатает один объект репозитория целиком: сообщение коммита, автора, дату и полный diff этого коммита. Там, где git log даёт список коммитов, а git status - список файлов, show разворачивает ровно одну точку истории со всеми подробностями.
$ git log --oneline
1c25139 уточнил цифру продаж
039ad20 первая версия отчёта
$ git show 1c25139
commit 1c251395eadebfac2466f3bf6de8a51652fdfc0c
Author: Anna Petrova <anna@example.com>
Date: Tue Mar 17 11:05:19 2026 +0300
уточнил цифру продаж
diff --git a/report.txt b/report.txt
index abf2cad..8aff6d7 100644
--- a/report.txt
+++ b/report.txt
@@ -1,3 +1,3 @@
Отчёт за третий квартал
-Продажи выросли.
+Продажи выросли на 12%.Верхняя часть - та же шапка, что у git log: хеш, автор, дата, сообщение. Ниже - diff этого коммита против его родителя, в формате git diff. За один экран видно и зачем сделан коммит, и что в нём поменялось. Без аргумента команда показывает HEAD: git show и git show HEAD - одно и то же.
Содержимое файла из коммита
После хеша через двоеточие можно назвать путь к файлу. Тогда show печатает не diff, а содержимое этого файла таким, каким оно было в том коммите:
$ git show HEAD:report.txt
Отчёт за третий квартал
Продажи выросли на 12%.Рабочий каталог при этом не трогается - ты просто заглядываешь в архив. Так вытаскивают старую версию файла, не переключая ветку и ничего не откатывая. Путь считается от корня репозитория, а не от текущего каталога.
Запись reflog и метка
show принимает любую ссылку на коммит, не только сырой хеш. Запись из reflog - тоже ссылка: HEAD@{1} значит «где HEAD стоял шагом раньше», HEAD@{2} - двумя шагами. Через неё достаётся коммит, которого в git log уже нет:
$ git reflog
1c25139 HEAD@{0}: reset: moving to HEAD~1
007bd72 HEAD@{1}: commit: добавил раздел про найм
1c25139 HEAD@{2}: commit: уточнил цифру продаж
039ad20 HEAD@{3}: commit (initial): первая версия отчёта
$ git show HEAD@{1}
commit 007bd728cb4dcf7414b7cb613196db10ba389966
Author: Anna Petrova <anna@example.com>
Date: Tue Mar 17 11:52:40 2026 +0300
добавил раздел про найм
diff --git a/report.txt b/report.txt
index 8aff6d7..371c8aa 100644
--- a/report.txt
+++ b/report.txt
@@ -1,3 +1,4 @@
Отчёт за третий квартал
Продажи выросли на 12%.
+В команду взяли двух человек.Так же подставляется имя метки. На аннотированную метку show печатает сначала саму метку - кто её поставил и когда, - а потом коммит, на который она указывает:
$ git show v1.0
tag v1.0
Tagger: Anna Petrova <anna@example.com>
Date: Tue Mar 17 12:10:00 2026 +0300
первый релиз
commit 1c251395eadebfac2466f3bf6de8a51652fdfc0cПро метки - git tag.
show, log и diff
Три команды легко перепутать. git log - это список коммитов, вид на историю сверху. git show берёт из этого списка один объект и разворачивает целиком. git diff сравнивает два произвольных состояния и печатает разницу между ними. Коротко: log - «какие были коммиты», show - «что внутри этого коммита», diff - «чем отличаются эти две точки».
Частые ошибки
git show <хеш> и git show <хеш>:путь - разные запросы. Первый печатает весь коммит с diff, второй - содержимое одного файла в этом коммите. Пропустишь двоеточие с путём - получишь diff всего коммита, а не файл, который хотел прочитать.
Diff у show всегда против родителя, а у коммита слияния родителей двое. По умолчанию show печатает для слияния комбинированный diff, и на чистом слиянии он часто выходит пустым - остаётся только заголовок. Чтобы увидеть, что слияние принесло, бери git show -m: он покажет diff против каждого родителя по очереди.
Где это в учебнике
Просмотр коммитов и разницы между состояниями разобран в четвёртой главе.