Как откатить файл к прошлой версии
Файл изменён, но коммита ещё нет — вернуть его к последнему коммиту:
git restore README.mdВернуть файл к версии из определённого коммита:
git log --oneline -- README.md
git restore --source=5e634b3 README.mdПервая команда показывает коммиты, которые меняли этот файл, — выберите нужный хеш. Вторая записывает версию файла из этого коммита в рабочую папку. Чтобы она осталась в истории, сделайте коммит: git commit -am "README.md возвращён к прежней версии".
В Git старше 2.23 команды restore нет. То же самое: git checkout -- README.md и git checkout 5e634b3 -- README.md. Вторая запись работает и сейчас, но сразу кладёт файл и в индекс.
git restore файл выбрасывает незакоммиченные правки в этом файле без возврата: в корзину они не попадают. Если правки могут пригодиться, сначала отложите их через git stash.
Восстановить удалённый файл
Файл удалён, но коммита с удалением ещё нет — git restore README.md, как выше.
Если удаление уже закоммичено, найдите коммит, в котором файл удалили, и возьмите версию из коммита перед ним (^ или ~1 после хеша — «родитель этого коммита»):
git log --oneline -- README.md
git restore --source=9fe2e20~1 README.mdПервая строка вывода git log — коммит удаления, у вас это будет свой хеш вместо 9fe2e20.
Убрать файл из индекса
Файл добавлен через git add по ошибке — уберите его из индекса, правки в файле останутся:
git restore --staged README.mdОтменить все изменения в проекте
Вернуть все отслеживаемые файлы к последнему коммиту:
git restore .Новые, ещё не добавленные файлы restore не трогает. Посмотреть, что будет удалено, и удалить их:
git clean -n
git clean -fd-n только показывает список, -f удаляет файлы, -d — ещё и папки.
git clean -fd удаляет неотслеживаемые файлы с диска насовсем, а git reset --hard ещё и выбрасывает все незакоммиченные правки. Это не отменить. Перед ними — всегда git status и git clean -n. Файлы из .gitignore clean -fd не трогает, а с ключом -x удаляет и их — например, .env с настройками.
Вернуть весь проект к прошлому коммиту
Посмотреть, как было, ничего не меняя: git switch --detach 5e634b3 (выход — git switch main, подробнее — detached HEAD). Отменить коммиты, оставив их в истории, — git revert, убрать их из истории — git reset; что выбрать, — в справке Как отменить последний коммит.