Я знаю, что 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 HEAD@{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
ВНИМАНИЕ! Это также удалит игнорируемые файлы