Просмотр коммитов и возврат изменений

Просмотр коммитов

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

git log   # Запрос на просмотр журнала коммитов

Пример журнала коммитов

git log
# Информация о третьем сделанном коммите
commit 3f6f9e1f58e30e0d3a0d0ab764c0b30a5b621d4a   # Хеш первого коммита
Author: John Doe johndoe@example.com   # Автор первого коммита
Date:   Thu Apr 21 10:26:52 2024 +0300   # Дата первого коммита
    Update README.md   # Сообщение первого коммита

# Информация о втором сделанном коммите
commit acd1e81729dc2ee2dc107ba345fa1ab7e6cfbff9
Author: Jane Smith janesmith@example.com
Date:   Wed Apr 20 16:45:39 2024 +0300
    Add new feature

# Информация о первом сделанном коммите
commit 7df1e8c33b0a617b3a72c785a67e45d0d932a180
Author: John Doe johndoe@example.com
Date:   Mon Apr 18 09:12:21 2024 +0300
    Initial commit

Сокращённый просмотр журнала коммитов

Информацию о каждом коммите можно отобразить сокращённо, в одну строку:

git log --oneline   # Запрос на вывод истории коммитов в одну строку
3f6f9e1 Update README.md
acd1e81 Add new feature
7df1e8c Initial commit

Просмотр отдельного коммита

git show abc12345  # Запрос на просмотр коммита с хешем abc12345

# Метаданные
commit abc12345  # Хеш коммита
Author: John Doe johndoe@example.com  # Автор коммита
Date:   Thu Apr 21 10:26:52 2024 +0300  # Дата и время коммита
    Update README.md  # Сообщение коммита

# Список изменений в файле README.md
    diff --git a/README.md b/README.md
    index abcdef1..1234567 100644
    --- a/README.md
    +++ b/README.md
    @@ -1,3 +1,3 @@
    -# My Project  # Старое содержимое строки
    +# My Awesome Project  # Новое содержимое строки

Если ввести git show без хеша, то выведется содержимое последнего коммита.

Просмотр изменений до коммита

Команда git diff показывает разницу между последним коммитом и текущим состоянием репозитория:

# Смотрим разницу между последним коммитом и текущим состоянием репозитория
git diff

# Разница между последним коммитом и текущим состоянием файла 
git diff file_name

# Разница между последним коммитом и коммитом с указанным хешем 
git diff commit_hash

# Разница между последним коммитом и отслеживаемым состоянием репозитория 
git diff --staged

Удаление файлов из индекса

Команда git rm позволяет удалить файл, который по ошибке попал в индекс.

После выполнения команды файл пропадёт из индекса и из папки проекта.

Если нужно удалить файл только из индекса, то команду git rm нужно использовать вместе с опцией --cached.

Примеры удаления файлов из индекса

# Удалить файл из индекса и рабочей директории
git rm file_name

# Удалить файл из индекса и оставить в папке на компьютере 
git rm --cached file_name

Отмена изменений

Команда git restore возвращает файл к состоянию последнего коммита.

Она отменяет все изменения, если файл не перенесён в индекс.

Если файл попал в индекс, то вместе с названием команды нужно использовать опцию --staged.

Примеры отмены изменений

# Вернуть неотслеживаемый файл к состоянию последнего коммита 
git restore file_name

# Вернуть все файлы из индекса к состоянию последнего коммита
git restore --staged 

# Вернуть указанный файл из индекса к состоянию последнего коммита
git restore --staged file_name

Откат коммита

Команда git reset позволяет отменить любое количество сделанных коммитов и вернуть проект к какому-то состоянию в прошлом.

На выбор можно использовать три режима: --soft, --mixed и --hard.

Режим soft

В режиме --soft проект откатывается к указанному коммиту и переводит все последующие коммиты в индекс.

Вы можете сразу сделать новый коммит и перезаписать историю проекта, оставив исходные файлы без изменений.

Режим mixed

В режиме --mixed откаченные файлы попадают в неотслеживаемую зону.

Вы можете эти файлы изменить, удалить или вернуть обратно в индекс.

Режим hard

В режиме --hard проект откатывается к указанному коммиту и удаляет все последующие коммиты без возможности их восстановления.

Примеры откатов

# Откатываемся и переводим последующие коммиты в индекс
git reset --soft commit_hash

# Откатываемся и переводим последующие коммиты в неотслеживаемую зону
git reset --mixed commit_hash

# Откатываемся и удаляем все последующие коммиты
git reset --hard commit_hash

СПАСИБО ЗА ВНИМАНИЕ!