Команда git reset
git reset
универсальная команда для отмены изменений и переписывание истории коммитов.
Команда git revert будет предпочтительнее если нужно отменить один коммит
Работает с тремя деревьями:
- Рабочий каталог - файлы синхронизированные с файловой системой, отображают непосредственно изменения внесенные в файлы (modified)
- Раздел проиндексированных файлов - то, что подготовлено к коммиту
- История коммитов - это и есть история коммитов, слепки состояния. Включает раздел проиндексированных файлов на момент его создания.
Вывод git status
отображает различия между историей коммитов и разделом проиндексированных файлов.
Параметры команды --soft
, --mixed
и --hard
определяют каким образом нужно изменить деревья выше
Пример использования опции --hard
полное уничтожения рабочего каталоги и раздела проиндексированных файлов.
Имеем следующие изменения в репозитории:
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: file
Changes not staged for commit:
(use "git add/rm <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
deleted: file2
Untracked files:
(use "git add <file>..." to include in what will be committed)
file3
- file был изменен и добавлен в раздел индексированных файлов
- file2 был удален
- file3 был добавлен, но не проиндексирован
В данном случае только file2 находятся в рабочем каталоге
# Полный сброс рабочего каталога и раздела проиндексированных файлов до состояния репозитория
git reset --hard # Важно понимать: восстановить эти потерянные данные невозможно.
Нетронутым остался только file3, так как он не добавлен в отслеживание.
Следующая опция --mixed
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: file2
Untracked files:
(use "git add <file>..." to include in what will be committed)
file3
file2 добавлен в раздел проиндексированных файлов
# Изменения будут перемещены из раздела проиндексированных файлов в рабочий каталог
git reset # или git reset --mixed HEAD
Раздел проиндексированных файлов был сброшен, при этом мы изменения не теряем.
Флаг --soft
используется не часто, на моей практике я его не использовал.
- !!!
git reset
является опасной командой для отмены изменений, есть риск потерять наработки - !!! Важно помнить, что если коммит был отправлен в публичный репозиторий, нельзя использовать команду
git reset
, можно поломать историю. В локальном репозитории можно делать что угодно.
Несколько примеров
# Перемещение файла из раздела проиндексированных файлов в рабочий каталог, при этом не меняя файлы
git reset file2
# Самое жесткое уничтожение, уничтожит все наработки + все коммиты до этого
git reset --hard 339db6b04afdab65ad79e8e2b28600cbaf0088eb