Как проверить, был ли коммит в Git изменен (amended)

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

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

Введение

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

Вы также узнаете, как использовать команду git log для сравнения коммитов и понять различия между измененными и неизмененными коммитами, приобретая практические навыки анализа истории вашего репозитория.


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/BranchManagementGroup -.-> git/log("Show Commits") git/BranchManagementGroup -.-> git/reflog("Log Ref Changes") subgraph Lab Skills git/add -.-> lab-560069{{"Как проверить, был ли коммит в Git изменен (amended)"}} git/status -.-> lab-560069{{"Как проверить, был ли коммит в Git изменен (amended)"}} git/commit -.-> lab-560069{{"Как проверить, был ли коммит в Git изменен (amended)"}} git/log -.-> lab-560069{{"Как проверить, был ли коммит в Git изменен (amended)"}} git/reflog -.-> lab-560069{{"Как проверить, был ли коммит в Git изменен (amended)"}} end

Проверка git reflog на записи об изменении коммитов

На этом этапе мы рассмотрим команду git reflog и узнаем, как она помогает нам просматривать историю нашего репозитория, включая такие действия, как изменение (amend) коммитов.

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

cd ~/project/my-time-machine

Теперь используем команду git reflog для просмотра истории нашего репозитория. reflog (журнал ссылок) записывает обновления вершин веток и других ссылок в репозитории. Это отличается от git log, которая показывает историю коммитов.

Введите следующую команду:

git reflog

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

a1b2c3d (HEAD -> master) HEAD@{0}: commit: Send a message to the future
a1b2c3d (HEAD -> master) HEAD@{1}: initial commit (amend): Send a message to the future
e4f5g6h HEAD@{2}: commit (initial): Send a message to the future

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

  • Каждая строка представляет действие, которое обновило ссылку (например, HEAD).
  • HEAD@{0} - это самое последнее действие, HEAD@{1} - действие перед ним и так далее.
  • Первая часть каждой строки (a1b2c3d, e4f5g6h) - это хэш коммита. Обратите внимание, как хэш коммита меняется после операции "amend".
  • Текст после хэша коммита описывает действие, например commit, initial commit (amend) или commit (initial).

git reflog - это мощный инструмент для восстановления потерянных коммитов или понимания последовательности операций, приведших к текущему состоянию вашего репозитория. Он показывает, куда был перемещен HEAD, даже если эти коммиты больше не являются частью истории ветки (например, после операции amend или rebase).

В примере вывода вы можете увидеть запись вида initial commit (amend). Это означает, что начальный коммит был изменен. Изменение коммита заменяет последний коммит новым коммитом, который включает изменения, которые вы добавили в индекс. В то время как git log покажет только окончательный, измененный коммит, git reflog показывает как исходный начальный коммит, так и измененный.

Понимание git reflog является важным для навигации по истории вашего проекта, особенно когда вы используете команды, которые перезаписывают историю, например git commit --amend.

Использование git log для сравнения коммитов

На этом этапе мы будем использовать команду git log для просмотра истории коммитов и понять, в чем она отличается от git reflog, особенно после использования команды git commit --amend.

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

Теперь давайте посмотрим историю коммитов с помощью команды git log:

git log --oneline

Опция --oneline предоставляет краткий обзор истории коммитов, показывая каждый коммит в одной строке.

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

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

Сравните этот вывод с выводом команды git reflog на предыдущем этапе. Обратите внимание, что git log показывает только один коммит, который является окончательным, измененным коммитом. Он не показывает исходный начальный коммит, который был заменен операцией изменения (amend).

Это ключевое различие между git log и git reflog. git log показывает историю коммитов, достижимых из текущего конца ветки, в то время как git reflog показывает историю того, куда указывали HEAD и другие ссылки.

Представьте git log как официальную опубликованную историю вашего проекта, а git reflog - как ваш личный дневник всех действий, которые вы совершили в репозитории.

Вы также можете использовать git log для сравнения разных коммитов. Хотя в нашей истории сейчас есть только один коммит, в реальном проекте с множеством коммитов вы могли бы использовать команды, такие как git log commit1..commit2, чтобы увидеть коммиты между двумя определенными точками в истории, или git diff commit1 commit2, чтобы увидеть точные изменения, внесенные между двумя коммитами.

Пока что важно просто понять, что git log показывает историю коммитов, а git reflog - историю обновлений ссылок.

Тестирование не измененных коммитов

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

Сначала добавим еще немного содержимого в файл 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 add message.txt

И теперь создадим новый коммит без изменения предыдущего:

git commit -m "Add another message"

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

[master 1a2b3c4] Add another message
 1 file changed, 1 insertion(+)

Теперь проверим git log еще раз:

git log --oneline

На этот раз вы должны увидеть два коммита:

1a2b3c4 (HEAD -> master) Add another message
a1b2c3d Send a message to the future

Оба коммита видны в git log, потому что второй коммит был добавлен поверх первого, продолжая историю ветки.

Наконец, проверим git reflog:

git reflog

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

1a2b3c4 (HEAD -> master) HEAD@{0}: commit: Add another message
1a2b3c4 (HEAD -> master) HEAD@{1}: commit (amend): Send a message to the future
e4f5g6h HEAD@{2}: commit (initial): Send a message to the future

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

Этот этап показывает, что когда вы создаете новый коммит без --amend, и git log, и git reflog покажут новый коммит, но git reflog по-прежнему сохранит историю измененного коммита, который git log не показывает.

Резюме

В этом LabEx мы научились проверять, был ли коммит в Git изменен (amended). Мы изучили команду git reflog, которая предоставляет историю обновлений ссылок, таких как HEAD, и позволяет нам видеть действия, например, изменение коммитов. Анализируя вывод reflog, мы можем определить записи, указывающие на операцию изменения (amend), и наблюдать, как хэш коммита меняется после такой операции.

Мы также узнали, что git reflog - ценный инструмент для понимания последовательности операций в репозитории, даже для коммитов, которые больше не доступны напрямую через git log. Это помогает восстановить потерянную работу или диагностировать проблемы с историей репозитория.