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

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

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

git reset --hard HEAD

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

HEAD is now at 820f417 micro

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

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

git add .
git commit -m "revert"

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

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

Ответ 1

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

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

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

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

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

Когда я хочу вернуться к предыдущему коммиту, я использую: git reset --hard HEAD И git возвращает: HEAD теперь на 820f417 микро

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

Если вы выполните 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 [email protected]{1}
    git commit -m "Reverting to the state of the project at f414f31"
    

Ответ 2

ВНИМАНИЕ: git clean -f удалит неотслеживаемые файлы, что означает, что они исчезли навсегда, так как они не хранятся в хранилище. Убедитесь, что вы действительно хотите удалить все неотслеживаемые файлы, прежде чем делать это.


Попробуйте это и посмотрите git clean -f.

git reset --hard не удалит неотслеживаемые файлы, тогда как git-clean удалит любые файлы из отслеживаемого корневого каталога, которые не находятся под отслеживанием Git.

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

  • git clean -df
  • git clean -xdf ВНИМАНИЕ! Это также удалит игнорируемые файлы