Как использовать 'git reset --hard HEAD' для возврата к предыдущему коммиту? [дубликат]



На этот вопрос уже есть ответ здесь:



Я знаю, что Git отслеживает изменения, которые я делаю в своем приложении, и он удерживает их, пока я не зафиксирую изменения, но вот где я зависаю:



Когда я хочу вернуться к предыдущему коммиту, я использую:



git reset --hard HEAD


И Git возвращает:



HEAD is now at 820f417 micro


Как мне затем вернуть файлы на моем жестком диске обратно к этому предыдущему коммиту?



Мои следующие шаги были:



git add .
git commit -m "revert"


Но ни один из файлов не изменился на моем жестком диске...

Что я делаю правильно / неправильно?

702   2  

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 не будет удалять неотслеживаемые файлы, где as git-clean удалит любые файлы из отслеживаемого корневого каталога, которые не находятся под отслеживанием Git.

В качестве альтернативы ,как сказал @ Paul Betts, вы должны сделать git clean -xdf (хотя будьте осторожны-это удаляет все игнорируемые файлы тоже).

Comments

    Ничего не найдено.