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

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

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

git reset --hard HEAD

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

HEAD is now at 820f417 micro

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

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

git add .
git commit -m "revert"

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

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

523
задан Brian McDonough 02 марта '12 в 9:36
источник поделиться
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"
    
600
ответ дан Mark Longair 02 марта '12 в 11:32
источник поделиться

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


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

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

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

126
ответ дан uday 02 марта '12 в 9:48
источник поделиться

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