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

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

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

Введение

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

Вы начнете с использования команды git show --name-status для просмотра краткого резюме изменений в коммите, в частности, будете искать статус 'A', который указывает на добавленный файл. Затем вы научитесь использовать команду 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/commit("Create Commit") git/BasicOperationsGroup -.-> git/diff("Compare Changes") git/BranchManagementGroup -.-> git/log("Show Commits") subgraph Lab Skills git/add -.-> lab-560024{{"Как проверить, был ли файл добавлен в коммит Git"}} git/status -.-> lab-560024{{"Как проверить, был ли файл добавлен в коммит Git"}} git/commit -.-> lab-560024{{"Как проверить, был ли файл добавлен в коммит Git"}} git/diff -.-> lab-560024{{"Как проверить, был ли файл добавлен в коммит Git"}} git/log -.-> lab-560024{{"Как проверить, был ли файл добавлен в коммит Git"}} end

Запуск команды git show --name-status

На этом этапе мы узнаем, как просмотреть детали определенного коммита (фиксации изменений в системе контроля версий Git), включая информацию о том, какие файлы были изменены и как. Мы будем использовать команду git show с опцией --name-status.

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

cd ~/project/my-time-machine

Теперь давайте используем команду git show, чтобы посмотреть коммит, который мы сделали в предыдущей лабораторной работе. Мы можем использовать псевдоним HEAD для ссылки на самый свежий коммит:

git show --name-status 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

A       message.txt

Разберем этот вывод:

  • Первая часть показывает детали коммита, похожие на то, что вы видели при использовании команды git log.
  • Строка A message.txt - это важная часть здесь.
    • A означает "Added" (добавлен). Это говорит нам, что файл message.txt был добавлен в этом коммите.
    • message.txt - это имя файла, который был затронут.

Опция --name-status очень полезна, так как она дает краткое резюме изменений, внесенных в коммите, показывая только имена файлов и их статус (добавлен, изменен, удален и т.д.). Это быстрее, чем просматривать полный дифф (разницу между версиями файлов), если вы просто хотите узнать, какие файлы были затронуты.

Понимание того, как проверять коммиты, является важным навыком для навигации по истории проекта и понимания его эволюции.

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

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

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

Мы будем использовать git diff-tree с опциями -r (рекурсивно) и --name-status, за которыми следует хэш коммита. Вы можете получить хэш коммита из вывода команд git log или git show. Для нашего первого коммита мы также можем использовать HEAD.

git diff-tree -r --name-status HEAD

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

a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9 A       message.txt

Рассмотрим вывод:

  • a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9 - это хэш коммита.
  • A указывает на статус изменения файла (добавлен).
  • message.txt - это имя файла.

Этот вывод очень похож на часть --name-status команды git show. Для простого коммита, как наш первый (который только добавил файл), вывод почти идентичен. Однако git diff-tree более гибок и может использоваться для сравнения разных деревьев (снимков) в вашем репозитории, а не только коммитов.

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

Проверка отличий между измененными и добавленными файлами

В предыдущих шагах мы увидели, как команды git show --name-status и git diff-tree --name-status показывают символ A для добавленного файла. Теперь давайте посмотрим, как они работают, когда файл изменен.

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

Давайте добавим еще одну строку в наш файл message.txt:

echo "Hello again, Future Me" >> message.txt

Оператор >> добавляет текст в конец существующего файла.

Теперь проверим статус нашего репозитория:

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 правильно определяет, что файл был изменен.

Теперь подготовим это изменение для коммита (добавим его в индекс):

git add message.txt

И проверим статус еще раз:

git status

Теперь вывод должен показать, что изменение подготовлено для коммита:

On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        modified:   message.txt

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

Наконец, давайте зафиксируем это изменение в коммите:

git commit -m "Add another message to the future"

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

[master a1b2c3d] Add another message to the future
 1 file changed, 1 insertion(+)

Теперь у нас есть новый коммит. Давайте используем команду git show --name-status для последнего коммита (HEAD), чтобы увидеть его статус:

git show --name-status HEAD

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

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

    Add another message to the future

M       message.txt

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

Аналогично, если вы используете команду git diff-tree -r --name-status HEAD, вы также увидите статус M.

Различие между A (Добавлен) и M (Изменен) важно для понимания истории ваших файлов в Git. A означает, что файл был создан в этом коммите, а M означает, что файл существовал ранее, и его содержимое было изменено.

Резюме

В этом практическом занятии (лабораторной работе) мы научились проверять, был ли файл добавлен в коммит Git. Сначала мы изучили команду git show --name-status, которая дает краткое описание изменений в коммите, включая статус (например, 'A' для добавленного файла) и имена затронутых файлов. Это быстрый способ узнать, какие файлы были затронуты в коммите, не просматривая полную разницу между версиями (diff).

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