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