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 против каждого родителя по очереди.

Где это в учебнике

Просмотр коммитов и разницы между состояниями разобран в четвёртой главе.

Глава 4. Посмотреть, отменить, спрятать лишнее