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


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

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

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

git reset --hard HEAD

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

HEAD is now at 820f417 micro

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

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

git add .
git commit -m "revert"

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

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

2 678

2 ответа:

во-первых, всегда стоит отметить, что git reset --hard - это потенциально опасная команда, так как он выбросит все ваши незафиксированные изменения. Для безопасности, вы всегда должны проверить, что выход git status является чистым (то есть пустым) перед его использованием.

сначала вы говорите следующее:

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

это неверно. Git записывает только состояние файлов, когда вы их размещаете (с git add) или при создании фиксации. После того, как вы создали фиксацию, в которой ваши файлы проекта находятся в определенном состоянии, они очень безопасны, но до тех пор Git на самом деле не "отслеживает изменения" в ваших файлах. (например, даже если вы делаете git add для размещения новой версии файла, которая перезаписывает ранее размещенную версию этого файла в промежуточной области.)

In затем вы задаете следующий вопрос:

когда я хочу, чтобы вернуться к предыдущей фиксации я использую: ГИТ сброс --жесткий руководитель и Git возвращает: руководитель сейчас находится на 820f417 микро

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

если у вас git reset --hard <SOME-COMMIT> тогда ГИТ будет:

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

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