Как проверить, был ли конкретный файл изменен в коммите Git

GitGitBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом практическом занятии (лабораторной работе) вы узнаете, как проверить, изменил ли определенный коммит Git конкретный файл. Мы рассмотрим два различных метода для достижения этого: использование команды git show --name-only для быстрого обзора измененных файлов и применение более фундаментальной команды git diff-tree с соответствующими параметрами для определения изменений файлов в рамках коммита.

С помощью практических примеров вы увидите, как эти команды предоставляют ценную информацию о внесенных коммитом изменениях, что поможет вам понять масштаб и влияние исторических коммитов в вашем репозитории Git. Мы также протестируем эти методы на неизмененных файлах, чтобы закрепить ваше понимание.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL git(("Git")) -.-> git/BasicOperationsGroup(["Basic Operations"]) git(("Git")) -.-> git/BranchManagementGroup(["Branch Management"]) git/BasicOperationsGroup -.-> git/diff("Compare Changes") git/BranchManagementGroup -.-> git/log("Show Commits") subgraph Lab Skills git/diff -.-> lab-560068{{"Как проверить, был ли конкретный файл изменен в коммите Git"}} git/log -.-> lab-560068{{"Как проверить, был ли конкретный файл изменен в коммите Git"}} end

Выполнение команды git show --name-only

На этом этапе мы рассмотрим, как просматривать информацию о конкретном коммите с помощью команды git show. Эта команда очень полезна для изучения деталей коммита, в том числе внесенных им изменений.

Мы будем использовать опцию --name-only с командой git show. Эта опция сообщает Git показывать только имена файлов, которые были изменены в коммите, что является быстрым способом определить, какие файлы были затронуты.

Сначала убедимся, что мы находимся в директории нашего проекта. Откройте терминал и перейдите в директорию my-time-machine:

cd ~/project/my-time-machine

Теперь используем команду git show с опцией --name-only, чтобы увидеть файлы, измененные в нашем последнем коммите. Помните, что в последнем коммите мы добавили файл message.txt.

git show --name-only HEAD

Здесь HEAD - это специальный указатель в Git, который ссылается на самый последний коммит в текущей ветке.

Вы должны увидеть вывод, похожий на следующий:

commit a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9
Author: Jane Doe <[email protected]>
Date:   Mon Aug 7 10:00:00 2023 +0000

    Send a message to the future

message.txt

Вывод показывает детали коммита (хэш коммита, автора, дату и сообщение), за которыми следует имя файла, который был изменен в этом коммите, а именно message.txt.

Использование команды git show --name-only - это быстрый способ получить сводку о том, какие файлы были изменены в конкретном коммите, не просматривая полный дифф (реальные изменения внутри файлов). Это полезно, когда вам нужно просто узнать масштаб коммита.

Использование git diff-tree для определения изменений файлов

На этом этапе мы рассмотрим другой способ просмотра файлов, измененных в коммите, с использованием команды git diff-tree. В то время как git show --name-only является распространенным способом, git diff-tree - это более фундаментальная команда, которая показывает различия между двумя деревьями объектов (которые представляют состояние вашего проекта в определенном коммите).

Мы будем использовать команду git diff-tree с опциями -r и --name-only. Опция -r делает команду рекурсивной, то есть она будет проверять подкаталоги. Опция --name-only, как и в случае с git show, будет выводить только имена отличающихся файлов.

Сначала убедитесь, что вы находитесь в директории my-time-machine:

cd ~/project/my-time-machine

Теперь используем git diff-tree для просмотра файлов, измененных в нашем последнем коммите. Нам нужен хэш коммита (уникальный идентификатор). Вы можете получить его из вывода команд git log или git show. Для первого коммита вы также можете использовать HEAD.

git diff-tree -r --name-only HEAD

Вы должны увидеть вывод, похожий на следующий:

message.txt

Этот вывод проще, чем вывод git show --name-only, потому что git diff-tree в первую очередь предназначен для показа различий между деревьями, а не полных деталей коммита. При использовании с опцией --name-only она просто перечисляет файлы, которые были добавлены, удалены или изменены между родительским коммитом и самим коммитом. Поскольку наш первый коммит не имел родителя, он показывает файлы, добавленные в этом коммите.

Понимание команды git diff-tree полезно, так как это низкоуровневая команда, которую другие команды Git часто используют внутри себя. Она помогает понять, как Git отслеживает изменения между разными версиями вашего проекта.

Тестирование с неизмененными файлами

В предыдущих шагах мы рассмотрели, как команды git show --name-only и git diff-tree -r --name-only показывают файлы, измененные в определенном коммите. Теперь давайте посмотрим, что произойдет, если мы запустим эти команды для коммита, в котором не было изменено ни одного файла (это не относится к нашему единственному коммиту, но мы можем смоделировать такую ситуацию).

Поскольку в нашем текущем репозитории есть только один коммит, в котором был добавлен файл, запуск этих команд для этого коммита всегда будет показывать message.txt. Чтобы проиллюстрировать концепцию показа только измененных файлов, представим, что у нас есть коммит, в котором не было изменено ни одного файла (это обычно происходит при слиянии коммитов или коммитах, которые изменяют только метаданные, но в этом упражнении мы сосредоточимся на выводе, когда не перечислены никакие файлы).

Если вы запустите git show --name-only или git diff-tree -r --name-only для коммита, в котором не было изменено ни одного файла, то часть вывода, относящаяся к именам файлов, будет пустой.

Давайте заново запустим команды, которые мы изучили, чтобы укрепить концепцию. Убедитесь, что вы находитесь в директории my-time-machine:

cd ~/project/my-time-machine

Запустите снова git show --name-only:

git show --name-only HEAD

Вывод будет похож на следующий:

commit a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9
Author: Jane Doe <[email protected]>
Date:   Mon Aug 7 10:00:00 2023 +0000

    Send a message to the future

message.txt

Теперь запустите снова git diff-tree -r --name-only:

git diff-tree -r --name-only HEAD

Вывод будет:

message.txt

Обе команды корректно показывают message.txt, потому что этот файл был добавлен в этом коммите. Основная идея здесь заключается в том, что эти команды предназначены для перечисления только файлов, которые были изменены (добавлены, удалены или модифицированы) в указанном коммите. Если коммит не изменяет никаких файлов, эти команды (а именно, часть, которая перечисляет файлы) не покажут ничего.

Это поведение важно для понимания масштаба изменений, внесенных коммитом. Оно помогает быстро определить, какие части вашего проекта были затронуты определенным изменением.

Резюме

В этом практическом занятии мы научились проверять, какие файлы были изменены в определенном коммите Git. Мы рассмотрели два основных метода: использование git show --name-only и git diff-tree с опциями -r и --name-only.

Сначала мы использовали git show --name-only HEAD, чтобы быстро увидеть имена файлов, измененных в последнем коммите, тем самым продемонстрировав его полезность для получения краткого обзора. Затем мы познакомились с git diff-tree - более фундаментальной командой, и использовали ее с опциями -r и --name-only, чтобы получить аналогичный результат, подчеркнув ее механизм сравнения деревьев объектов. Наконец, мы проверили эти команды на коммитах, в которых не было изменено определенный файл, чтобы подтвердить их поведение и наше понимание.