Введение
В этом лабораторном занятии (LabEx) мы рассмотрим, как определить, является ли коммит (commit) в Git пустым, то есть не вносящим никаких изменений в файлы проекта. Мы научимся использовать команду git show для проверки деталей и изменений в рамках конкретного коммита, которая предоставляет визуальное представление его содержимого.
Кроме того, мы углубимся в использование команды git diff-tree, более прямого метода для программной проверки наличия каких-либо связанных изменений в коммите. Наконец, мы протестируем эти методы как на обычных коммитах, содержащих изменения, так и на специально созданных пустых коммитах, чтобы закрепить наше понимание.
Запустите команду git show для проверки изменений
На этом этапе мы научимся проверять детали конкретного коммита (commit) с помощью команды git show. Эта команда похожа на открытие капсулы времени, которая позволяет увидеть, что было внутри в тот момент.
Сначала убедимся, что мы находимся в директории нашего проекта:
cd ~/project/my-time-machine
Теперь используем команду git show для просмотра нашего первого коммита. Мы можем использовать хэш коммита (длинную строку букв и цифр) из вывода команды git log, или просто использовать HEAD, которое ссылается на последний коммит в текущей ветке.
git show HEAD
Вы должны увидеть вывод, похожий на следующий:
commit a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9 (HEAD -> master)
Author: Jane Doe <jane.doe@example.com>
Date: Mon Aug 7 10:00:00 2023 +0000
Send a message to the future
diff --git a/message.txt b/message.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/message.txt
@@ -0,0 +1 @@
+Hello, Future Me
Разберём этот вывод:
- Первая часть похожа на вывод команды
git logи показывает информацию о коммите (хэш, автор, дата, сообщение). - Раздел
diffпоказывает изменения, внесённые этим коммитом.diff --git a/message.txt b/message.txt: Указывает на разницу между состоянием файлаmessage.txtдо и после коммита.new file mode 100644: Показывает, чтоmessage.txt- это новый файл.index 0000000..e69de29: Внутренняя информация Git о содержимом файла.--- /dev/null: Представляет состояние файла до коммита (файл не существовал).+++ b/message.txt: Представляет состояние файла после коммита.@@ -0,0 +1 @@: Это "заголовок фрагмента" (hunk header), указывающий на изменения.-0,0означает, что ни одной строки не было удалено, начиная с строки 0 в исходном файле, а+1означает, что одна строка была добавлена, начиная с строки 1 в новом файле.+Hello, Future Me: Строка, которая была добавлена в этом коммите. Знак+указывает на добавление.
Команда git show невероятно полезна для понимания истории вашего проекта. Вы можете использовать её, чтобы точно увидеть, какие изменения были внесены в любом конкретном коммите, что является важным для отладки или понимания, как реализована определённая функция.
Нажмите q для выхода из режима просмотра git show.
Используйте git diff-tree для проверки на пустоту
На этом этапе мы рассмотрим другую команду, git diff-tree, которая может быть полезна для анализа изменений в коммите (commit), особенно для проверки, является ли коммит "пустым" (то есть не вносящим никаких изменений в содержимое файлов, а только в метаданные, такие как сообщение коммита).
Сначала убедитесь, что вы находитесь в директории своего проекта:
cd ~/project/my-time-machine
Теперь используем команду git diff-tree с опциями --no-commit-id и --name-only для нашего первого коммита (HEAD).
git diff-tree --no-commit-id --name-only HEAD
Вы должны увидеть следующий вывод:
message.txt
Понять, что означает эта команда и ее вывод:
git diff-tree: Эта команда сравнивает содержимое и режим объектов в дереве Git.--no-commit-id: Эта опция исключает идентификатор коммита из вывода, делая его более чистым.--name-only: Эта опция показывает только имена файлов, которые были изменены в коммите.HEAD: Указывает на коммит, который мы хотим проверить (наш последний коммит).
Вывод message.txt говорит нам, что коммит, на который указывает HEAD, внес изменения в файл message.txt.
Теперь посмотрим, что произойдет, если мы запустим ту же команду для коммита, который не изменяет никаких файлов. Поскольку наш первый коммит - единственный, давайте рассмотрим гипотетический сценарий. Если бы у нас был коммит, который только обновлял сообщение коммита, не изменяя при этом никаких файлов, то команда git diff-tree --no-commit-id --name-only <commit-hash> не вывела бы ничего. Именно так можно использовать git diff-tree для проверки, является ли коммит "пустым" с точки зрения изменений в файлах.
В то время как команда git show дает вам детальное представление о изменениях, команда git diff-tree с опциями, такими как --name-only, полезна для написания скриптов или быстрой проверки, какие файлы были затронуты коммитом, без просмотра полного дифференциала (diff).
Тестирование с обычными коммитами
На этом этапе мы потренируемся создавать больше коммитов (commit) для формирования истории в нашем репозитории и посмотрим, как команды git log и git status отображают эти изменения. Это имитирует более типичный рабочий процесс, когда вы вносите несколько изменений и сохраняете их пошагово.
Сначала убедитесь, что вы находитесь в директории своего проекта:
cd ~/project/my-time-machine
Теперь добавим еще одну строку в наш файл message.txt. Мы будем использовать команду echo с оператором >> для добавления текста в существующий файл.
echo "Adding another line for testing." >> message.txt
Проверим содержимое файла, чтобы убедиться в изменении:
cat message.txt
Вы должны увидеть:
Hello, Future Me
Adding another line for testing.
Теперь проверим статус нашего репозитория:
git status
Вы должны увидеть вывод, указывающий на то, что файл message.txt был изменен:
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: message.txt
no changes added to commit (use "git add" and/or "git commit -a")
Git правильно определяет, что файл был изменен с момента последнего коммита. Теперь подготовим (stage) и зафиксируем (commit) эти изменения.
git add message.txt
git commit -m "Add a second line to message.txt"
Вы должны увидеть вывод, подтверждающий коммит:
[master a1b2c3d] Add a second line to message.txt
1 file changed, 1 insertion(+)
Теперь мы создали второй коммит. Посмотрим историю коммитов с помощью команды git log:
git log
Теперь вы должны увидеть две записи о коммитах, причем самый новый коммит будет сверху:
commit a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9 (HEAD -> master)
Author: Jane Doe <jane.doe@example.com>
Date: Mon Aug 7 10:00:00 2023 +0000
Add a second line to message.txt
commit f0e1d2c3b4a5968776543210fedcba9876543210
Author: Jane Doe <jane.doe@example.com>
Date: Mon Aug 7 09:55:00 2023 +0000
Send a message to the future
(Примечание: Хэши коммитов и даты будут отличаться в вашем выводе).
Это демонстрирует базовый цикл внесения изменений, подготовки их с помощью git add и сохранения в виде нового коммита с помощью git commit. Каждый коммит представляет собой отдельную точку в истории вашего проекта, позволяя отслеживать прогресс и возвращаться к предыдущим состояниям при необходимости.
Нажмите q для выхода из режима просмотра лога.
Резюме
В этом практическом занятии (lab) мы научились проверять детали коммита (commit) в Git с помощью команды git show. Эта команда предоставляет полное представление о конкретном коммите, включая его метаданные (автор, дата, сообщение) и точные изменения, внесенные этим коммитом, в формате дифференциала (diff). Мы увидели, как вывод дифференциала четко показывает добавленные, удаленные или измененные строки, что позволяет нам понять изменения в содержимом файлов в рамках коммита.
Мы продолжим исследовать методы проверки, является ли коммит пустым, и протестируем эти техники на разных типах коммитов.



