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