git reset
: Перемещает указатель ветки (HEAD) на указанный коммит. Может изменять индекс (staging area) и рабочий каталог в зависимости от типа (--soft
, --mixed
, --hard
). Используется для отмены коммитов (локально!).
git checkout
: Основная задача - переключение между ветками. Также может использоваться для восстановления файлов из индекса или коммитов. Обновляет рабочий каталог в соответствии с выбранной веткой или коммитом.
git restore
: Более специализированная команда, добавленная в Git 2.23, предназначенная для отмены изменений в рабочем каталоге и/или индексе. В отличие от git checkout
, она фокусируется на восстановлении файлов, а не на переключении веток.
Отличия между git reset
, git checkout
и git restore
заключаются в их влиянии на рабочую директорию, индекс (staging area) и историю коммитов. Они используются для отмены изменений, но каждый в разной степени и разными способами.
git reset
:
--soft
, --mixed
(по умолчанию) и --hard
.--soft
: Перемещает HEAD на указанный коммит, оставляя индекс и рабочую директорию без изменений. Изменения, сделанные после этого коммита, останутся в вашей рабочей области как зафиксированные изменения.--mixed
: Перемещает HEAD на указанный коммит и сбрасывает индекс, но оставляет рабочую директорию без изменений. Изменения, сделанные после этого коммита, останутся в вашей рабочей области, но не будут добавлены для коммита (unstaged). Это наиболее часто используемый вариант.--hard
: Перемещает HEAD на указанный коммит, сбрасывает индекс и рабочую директорию. ОСТОРОЖНО! Все изменения, сделанные после указанного коммита, будут ПОТЕРЯНЫ. Используйте этот режим с большой осторожностью.git push
после git reset
может потребоваться git push --force
, что не рекомендуется делать в общих ветках.
git checkout
:
git restore
).git checkout
обновляет рабочую директорию и индекс в соответствии с коммитом, на который указывает HEAD выбранной ветки.git checkout <commit> <file>
: восстанавливает файл из указанного коммита, помещая его в индекс и рабочую директорию. (устаревший синтаксис, лучше использовать git restore
)
git restore
:
git checkout
для отдельных файлов.git restore <file>
: Отменяет изменения в рабочей директории, возвращая файл к состоянию из индекса.git restore --staged <file>
: Удаляет файл из индекса, перемещая изменения в рабочую директорию (unstaged).git restore --source=<commit> <file>
: Восстанавливает файл из указанного коммита в рабочей директории.Краткое сравнение:
git reset
: Изменяет HEAD, индекс и рабочую директорию. Может изменять историю коммитов.git checkout
: Переключается между ветками, либо восстанавливает файлы из конкретного коммита (но это устаревший синтаксис, сейчас лучше использовать git restore
). Не изменяет историю коммитов.git restore
: Предназначен для отмены изменений в рабочей директории и индексе. Не изменяет историю коммитов. Заменяет часть функциональности git checkout
.Когда что использовать:
git reset
: Когда нужно откатить локальные коммиты.git checkout
: Когда нужно переключиться между ветками или посмотреть старую версию проекта в режиме detached HEAD.git restore
: Когда нужно отменить изменения в рабочей директории или убрать файлы из индекса.