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

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

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

Введение

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

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


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-560030{{"Как проверить, было ли переименовано файл в истории Git"}} git/status -.-> lab-560030{{"Как проверить, было ли переименовано файл в истории Git"}} git/commit -.-> lab-560030{{"Как проверить, было ли переименовано файл в истории Git"}} git/diff -.-> lab-560030{{"Как проверить, было ли переименовано файл в истории Git"}} git/log -.-> lab-560030{{"Как проверить, было ли переименовано файл в истории Git"}} end

Использование команды git log --follow для файла

На этом этапе мы узнаем, как отслеживать историю конкретного файла, даже если он был переименован. Именно здесь пригодится команда git log --follow.

Сначала убедимся, что мы находимся в директории нашего проекта.

cd ~/project/my-time-machine

Теперь создадим новый файл и добавим в него некоторое содержимое.

echo "This is the original content." > original_file.txt

Добавим этот файл в индекс и закоммитим его.

git add original_file.txt
git commit -m "Add original file"

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

[master 1a2b3c4] Add original file
 1 file changed, 1 insertion(+)
 create mode 100644 original_file.txt

Теперь переименуем файл.

git mv original_file.txt renamed_file.txt

Проверим статус, чтобы увидеть изменения.

git status

Вы должны увидеть что - то вроде этого:

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

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

Зафиксируем переименование в коммите.

git commit -m "Rename original file"

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

[master 5d6e7f8] Rename original file
 1 file changed, 0 insertions(+), 0 deletions(-)
 rename original_file.txt -> renamed_file.txt (100%)

Теперь используем команду git log для просмотра истории переименованного файла.

git log renamed_file.txt

Эта команда покажет только коммит, в котором файл был переименован. Чтобы увидеть историю до переименования, нам нужно использовать опцию --follow.

git log --follow renamed_file.txt

Эта команда покажет вам историю файла, учитывая изменения его имени. Вы должны увидеть как коммит "Rename original file", так и коммит "Add original file".

Команда git log --follow является важной, когда вам нужно понять полную историю файла, который был перемещен или переименован в вашем репозитории. Она помогает отслеживать эволюцию файла в разных коммитах, независимо от его текущего имени.

Использование команды git diff --name-status

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

Сначала убедитесь, что вы находитесь в правильной директории:

cd ~/project/my-time-machine

Давайте внесем еще одно изменение в файл renamed_file.txt.

echo "Adding a new line." >> renamed_file.txt

Теперь посмотрим на статус.

git status

Вы должны увидеть, что файл renamed_file.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:   renamed_file.txt

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

no changes added to commit (use "git add" and/or "git commit -a")

Добавим изменения в индекс (staging area).

git add renamed_file.txt

Теперь используем команду git diff --name-status для просмотра изменений между последним коммитом и изменениями в индексе.

git diff --name-status --cached

Опция --cached сообщает команде git diff сравнить изменения в индексе с последним коммитом (HEAD).

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

M       renamed_file.txt

Вывод M renamed_file.txt означает, что файл renamed_file.txt был Modified (изменен).

Теперь зафиксируем эти изменения в коммите.

git commit -m "Add new line to renamed file"

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

[master 9h0i1j2] Add new line to renamed file
 1 file changed, 1 insertion(+)

Команда git diff --name-status очень полезна для быстрого обзора того, какие изменения (добавление, изменение, удаление, переименование, копирование) произошли между разными точками в истории Git, без отображения полного содержимого изменений. Это особенно полезно при просмотре изменений перед коммитом или при сравнении веток.

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

На этом этапе мы посмотрим, как работает команда git log --follow с файлами, которые не были переименованы. Это поможет вам лучше понять, когда опция --follow необходима.

Сначала убедитесь, что вы находитесь в правильной директории:

cd ~/project/my-time-machine

В нашем репозитории уже есть файлы renamed_file.txt и message.txt. Добавим некоторое содержимое в файл message.txt.

echo "This is a message." >> message.txt

Проверим статус.

git status

Вы должны увидеть, что файл message.txt был изменен, а файл renamed_file.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")

Добавим изменения в индекс и закоммитим их для файла message.txt.

git add message.txt
git commit -m "Add content to message file"

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

[master 3k4l5m6] Add content to message file
 1 file changed, 1 insertion(+)

Теперь используем команду git log для файла message.txt.

git log message.txt

Это покажет вам историю файла message.txt. Вы должны увидеть коммит "Add content to message file" и начальный коммит, в котором был создан файл message.txt (из первой лабораторной работы).

Теперь попробуем использовать команду git log --follow для файла message.txt.

git log --follow message.txt

Вы заметите, что вывод такой же, как при использовании команды git log message.txt. Это потому, что файл message.txt не был переименован или перемещен. Опция --follow специально разработана для отслеживания истории файла при изменении его имени. Для файлов, которые не были переименованы, команда git log является достаточной.

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

Резюме

В этой лабораторной работе мы научились отслеживать историю файла в Git, даже после его переименования. Мы начали с создания, добавления и коммита файла, затем переименовали его с помощью команды git mv и закоммитили переименование. Затем мы показали, что простая команда git log для нового имени файла показывает историю только начиная с момента переименования.

Основной вывод - использование команды git log --follow <filename>. Эта мощная опция позволяет Git отслеживать историю файла при изменении его имени, предоставляя полное представление о его эволюции от создания до текущего состояния. Это очень важно для понимания полного контекста изменений файла в истории проекта.