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

Другие вопросы по тегам