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

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

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

Введение

В этом практическом занятии (лабораторной работе) вы научитесь проверять, был ли определенный файл изменен в конкретном коммите (коммите Git). Мы рассмотрим различные команды Git для достижения этой цели.

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


Skills Graph

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

Использование команды git show --name-only для коммита

На этом этапе мы научимся использовать команду git show для получения более подробной информации о конкретном коммите. В то время как git log показывает нам сводку по коммитам, git show позволяет нам заглянуть внутрь одного "временного капсула" (коммита).

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

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

cd ~/project/my-time-machine

Теперь запустите команду git show с опцией --name-only. Вы можете использовать HEAD для ссылки на последний коммит:

git show --name-only HEAD

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

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

    Send a message to the future

message.txt

Разберем вывод на части:

  • Первая часть похожа на то, что вы видели при использовании git log и показывает детали коммита (идентификатор коммита, автор, дата и сообщение).
  • Последняя строка, message.txt, является выводом опции --name-only. Она сообщает нам, что файл message.txt был изменен в этом коммите.

Команда git show невероятно полезна для изучения отдельных коммитов. Вы можете использовать ее, чтобы точно увидеть, какие изменения были внесены в конкретном коммите, какие файлы были затронуты и какое сообщение коммита связано с этими изменениями. Это помогает вам детально понять историю вашего проекта.

На следующем этапе мы рассмотрим другой способ просмотра изменений файлов между коммитами с использованием git diff-tree.

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

На этом этапе мы рассмотрим другую команду для просмотра файлов, измененных в коммите: git diff-tree. Эта команда часто используется в скриптах и автоматизации, но также полезна для понимания того, как Git отслеживает изменения.

Убедитесь, что вы по-прежнему находитесь в директории ~/project/my-time-machine.

Нам нужен идентификатор коммита нашего первого коммита. Вы можете получить его, запустив команду git log --oneline:

git log --oneline

Вы должны увидеть вывод, похожий на следующий (ваш идентификатор коммита будет другим):

a1b2c3d (HEAD -> master) Send a message to the future

Скопируйте первые 7 символов идентификатора коммита (например, a1b2c3d).

Теперь запустите команду git diff-tree. Мы будем использовать опцию -r для рекурсивного отображения изменений и опцию --name-only для отображения только имен файлов. Замените YOUR_COMMIT_ID на скопированный идентификатор коммита:

git diff-tree -r --name-only YOUR_COMMIT_ID

Например, если ваш идентификатор коммита был a1b2c3d, вы должны запустить следующую команду:

git diff-tree -r --name-only a1b2c3d

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

message.txt

Эта команда также показывает, что файл message.txt был изменен в этом коммите.

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

Проверка неизмененных файлов

На этом последнем этапе мы убедимся, что Git правильно определяет файлы, которые не были изменены с момента последнего коммита. Это подтверждает концепцию, согласно которой Git отслеживает только изменения.

Убедитесь, что вы находитесь в директории ~/project/my-time-machine.

Запустите команду git status еще раз:

git status

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

On branch master
nothing to commit, working tree clean

Это сообщение говорит нам, что в нашей рабочей директории нет изменений, которые нужно закоммитить. Git видит, что файл message.txt идентичен тому, который был в последнем коммите.

Теперь создадим новый, неотслеживаемый файл, чтобы увидеть, как Git среагирует:

echo "This is a temporary file" > temp.txt

Запустите git status еще раз:

git status

Теперь вы должны увидеть следующее:

On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)
        temp.txt

nothing added to commit but untracked files present (use "git add" to track)

Git правильно определяет temp.txt как неотслеживаемый файл, потому что мы еще не сообщили Git о необходимости отслеживать его с помощью команды git add. Это демонстрирует, что Git знает о файлах в вашей директории, но активно отслеживает только те, которые вы добавили в репозиторий.

Наконец, удалим временный файл:

rm temp.txt

Запустите git status в последний раз:

git status

Вы должны вернуться к состоянию "nothing to commit, working tree clean" (ничего не нужно коммитить, рабочее дерево чистое).

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

Резюме

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

Затем мы рассмотрели команду git diff-tree как другой способ определения изменений файлов в коммите. Хотя эта команда часто используется в скриптах, понимание git diff-tree помогает понять, как Git отслеживает изменения. Эти команды являются ценными инструментами для изучения истории проекта и понимания изменений, внесенных в отдельных коммитах.