Как использовать 'git reset --hard HEAD' для возврата к предыдущему коммиту? [дубликат]
На этот вопрос уже есть ответ здесь:
Я знаю, что Git отслеживает изменения, которые я делаю в своем приложении, и он удерживает их, пока я не зафиксирую изменения, но вот где я зависаю:
Когда я хочу вернуться к предыдущему коммиту, я использую:
git reset --hard HEADИ Git возвращает:
HEAD is now at 820f417 micro
Как мне затем вернуть файлы на моем жестком диске обратно к этому предыдущему коммиту?
Мои следующие шаги были:
git add .
git commit -m "revert"
Но ни один из файлов не изменился на моем жестком диске...
Что я делаю правильно / неправильно?
2 ответов:
Во-первых, всегда стоит отметить, что
git reset --hardявляется потенциально опасной командой, так как она отбрасывает все ваши незафиксированные изменения. Для безопасности вы всегда должны проверять, что выводgit statusчист (то есть пуст) перед его использованием.Вначале вы говорите следующее:
Итак, я знаю, что Git отслеживает изменения, которые я делаю в своем приложении, и он удерживает их, пока я не зафиксирую изменения, но вот где я зависаю:
Это неверно. Только мерзавец записывает состояние файлов при их создании (с помощью
git add) или при создании фиксации. После того, как вы создали коммит, в котором ваши файлы проекта находятся в определенном состоянии, они очень безопасны, но до тех пор Git на самом деле не "отслеживает изменения" в ваших файлах. (например, даже если вы выполняетеgit addдля создания новой версии файла, она перезаписывает ранее созданную версию этого файла в промежуточной области.)В своем вопросе вы затем задаете следующее:
Когда я хочу вернуться к предыдущему коммиту, я использую: git reset --hard HEAD и Git returns: HEAD теперь находится на 820f417 micro
Как мне тогда вернуть файлы на моем жестком диске обратно к этому предыдущему коммиту?
Если вы это сделаете
git reset --hard <SOME-COMMIT>, то Git будет:
- верните текущую ветвь (обычно
master) в точку<SOME-COMMIT>.- затем сделайте файлы в вашем рабочем дереве и индекс ("промежуточная область") такими же, как версии, зафиксированные в
<SOME-COMMIT>.Итак, предположим, что хорошим коммитом, к которому вы хотите вернуться, является
HEADуказывает на вашу текущую ветвь (или текущий коммит), поэтому все, чтоgit reset --hard HEADбудет делать, это отбрасывать любые незафиксированные изменения, которые у вас есть.f414f31. (Вы можете найти это черезgit logили любой браузер истории.) Затем у вас есть несколько различных вариантов в зависимости от того, что именно вы хотите сделать:
- измените текущую ветвь, чтобы она указывала на более старый коммит. Вы можете сделать это с помощью
git reset --hard f414f31. Однако это переписывание истории вашей ветви, поэтому вам следует избегать этого, если вы поделились этой ветвью с кем-либо. Кроме того, коммитов, которые вы сделали послеf414f31, больше не будет в истории вашей ветвиmaster.Создайте новый коммит, который представляет точно такое же состояние проекта, как и
f414f31, но просто добавляет его в историю, чтобы вы не потеряли историю. Вы можете сделать это, используя шаги, предложенные в этот ответ - что-то например:git reset --hard f414f31 git reset --soft HEAD@{1} git commit -m "Reverting to the state of the project at f414f31"
Предупреждение:
git clean -fудалит неотслеженные файлы, что означает, что они ушли навсегда, так как они не хранятся в репозитории. Убедитесь, что вы действительно хотите удалить все неотслеживаемые файлы, прежде чем делать это.
Попробуйте это и посмотрите
git clean -f.
git reset --hardне будет удалять неотслеживаемые файлы, где asgit-cleanудалит любые файлы из отслеживаемого корневого каталога, которые не находятся под отслеживанием Git.В качестве альтернативы ,как сказал @ Paul Betts, вы должны сделать
git clean -xdf(хотя будьте осторожны-это удаляет все игнорируемые файлы тоже).
Comments