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

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

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

git reset --hard HEAD

И Гит возвращает:

HEAD is now at 820f417 micro

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

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

git add .
git commit -m "revert"

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

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


person Brian McDonough    schedule 02.03.2012    source источник
comment
Что вы имеете в виду под возвратом файлов на моем жестком диске к предыдущей фиксации? Если 820f417 является вашим желаемым коммитом, файлы теперь должны иметь точное содержимое в этом коммите.   -  person kennytm    schedule 02.03.2012
comment
Если вы хотите отменить все изменения, после git reset --hard вам следует git checkout <branch>.   -  person jweyrich    schedule 02.03.2012
comment
Я действительно не понимаю идею [дублировать], а затем задавать новый вопрос, когда ответы неудовлетворительны. Это рецепт катастрофы с точки зрения большего количества дубликатов....   -  person    schedule 14.04.2016


Ответы (2)


Во-первых, всегда стоит помнить, что git reset --hard — потенциально опасная команда, поскольку она отбрасывает все ваши незафиксированные изменения. В целях безопасности вы всегда должны проверять, что вывод git status чист (то есть пуст) перед его использованием.

Сначала вы говорите следующее:

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

Это неправильно. Git записывает состояние файлов только при их подготовке (с помощью git add) или при создании коммита. После того, как вы создали фиксацию, в которой файлы вашего проекта находятся в определенном состоянии, они очень безопасны, но до тех пор Git на самом деле не «отслеживает изменения» в ваших файлах. (например, даже если вы сделаете git add для подготовки новой версии файла, это перезапишет предыдущую версию этого файла в области подготовки.)

В своем вопросе вы продолжаете спрашивать следующее:

Когда я хочу вернуться к предыдущей фиксации, я использую: git reset --hard HEAD И git возвращает: HEAD теперь на 820f417 micro

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

Если вы сделаете 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"
    
person Mark Longair    schedule 02.03.2012
comment
git reset --soft HEAD@{1} действительно испортил мой локальный репозиторий. Он думает, что все файлы теперь. Что мне теперь делать? - person Robin Winslow; 26.10.2012
comment
@Mark Longair: ответ, на который вы указываете в конце, не user --hard, а просто git reset. - person MiniQuark; 28.03.2013
comment
@MiniQuark: я использую эквивалентный и немного более короткий вариант, который я предложил в комментариях к связанному ответу. - person Mark Longair; 22.07.2013
comment
Спасибо за совет о git reset --soft HEAD@{1}. Я не думал о таком способе отмены коммитов, хотя у меня есть опыт работы с git. - person Esko Luontola; 20.07.2014
comment
Можно также обратиться к git reflog в случае, если git log сразу не показывает соответствующую фиксацию, к которой вы хотите вернуться. - person Akshat Mahajan; 16.08.2016
comment
Я не понимаю. Когда я хочу отменить свою последнюю фиксацию, я просто делаю git reset --hard HEAD Это отменит мою отмену фиксации моей фиксации, т. е. не удалит ее, а сохранит код, но поместит его в отслеживаемое состояние. Тем не менее, вы сказали, что все, что он сделает, это отбросит любые незафиксированные изменения, которые у вас есть. Вы можете это прояснить? - person Honey; 07.09.2018
comment
Просто для ясности: когда вы говорите, что отбрасывает все ваши незафиксированные изменения, это относится к редактированию или удалению существующих файлов, а также к новым неотслеживаемым файлам? Я не уверен, что добавление нового файла в репозиторий является незафиксированным изменением, я полагаю, что может быть. - person AnnanFay; 26.03.2019
comment
Другой безопасный способ — отменить последнюю фиксацию, но локально сохранить эти изменения. Для этого используйте: git reset HEAD^stackoverflow.com/a/15772171/2510591 - person joseluisq; 03.04.2019
comment
community.atlassian.com/t5/Sourcetree-questions/ $ git push --force - person Salma Gomaa; 18.07.2019
comment
тайная магия этих git-команд каждый раз ускользает от меня. Я прибегнул к git reset --hard, скопировал файлы в другой каталог, получил git pull и прошел, а затем закончил. Это, кажется, работает лучше всего, даже если это может быть не чисто. - person Havnar; 24.02.2020
comment
Могу ли я использовать git status --porcelain для проверки чистоты репо? - person alper; 08.12.2020
comment
Also, the commits you did after f414f31 will no longer be in the history of your master branch. Это разрешило мое замешательство - person KMA Badshah; 01.05.2021

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


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

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

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

  • git clean -df
  • git clean -xdf ВНИМАНИЕ! Это также удалит игнорируемые файлы

Объяснение флагов:

-d рекурсивно удаляет все файлы в каталогах

-f

Если для переменной конфигурации Git clean.requireForce не установлено значение false, git clean откажется удалять файлы или каталоги, если не указано -f или -i. Git откажется изменять неотслеживаемые вложенные репозитории git (каталоги с подкаталогом .git), если не указан второй -f.

-x Используйте не стандартные правила игнорирования, а те, которые указаны в -e. Это можно использовать для запуска чистой сборки.

Источник: справочные страницы

person uday    schedule 02.03.2012
comment
Вот что я получаю от терминала: Не удалять приложение/представления/отношения/ Не удалять tmp/sessions/ Не удалять tmp/sockets/ Без изменений. Хм... все, что я делаю, кажется, не работает. Не твоя вина. - person Brian McDonough; 02.03.2012
comment
После долгих проб и, в основном, ошибок, я создал новое приложение и загрузил все файлы вручную из резервной копии. Я делаю много резервных копий, но мне действительно нужно научиться полагаться на git, то есть мне нужно научиться лучше использовать git. - person Brian McDonough; 04.03.2012
comment
@BrianMcDonough - слишком распространенное утверждение. Я делаю так много ошибок с git только потому, что не понимаю его, и время, необходимое для его наращивания, выходит за рамки того, что я могу себе позволить. В основном я использую его как можно ближе к SVN с большим количеством личных резервных копий. Не дай Бог, эксперт по git заберется на мой компьютер, чтобы «исправить этот беспорядок». - person Yimin Rong; 10.12.2013
comment
Это первая команда git, с которой я столкнулся, которая необратима... добавлено предупреждение, чтобы другие не слишком радовались триггерам... - person jmort253; 02.04.2014
comment
Сначала используйте n вместо f, чтобы увидеть список того, что будет удалено, например: git clean -xdn - person Zantier; 19.06.2014
comment
не забудьте быть осторожным с очисткой, потому что git clean -f удалит все папки проекта среды/графического интерфейса (например, .idea (phpstorm) или .vagrant (vagrant)) - person timhc22; 21.11.2014
comment
Черт возьми, git clean -xdf даже удаляет все игнорируемые файлы!!! - person leymannx; 30.05.2017
comment
Не забудьте после этого выполнить установку npm, так как git clean -xdf удаляет игнорируемые файлы, т.е. любые node_modules. Вот почему после запуска команды все выглядит сломанным :) - person Moulde; 09.01.2018
comment
git clean -df достаточно. Флаг -x игнорирует файл .gitignore. - person xji; 08.07.2018
comment
В вопросе упоминается git-clean, но означает git clean. Из-за плохих дизайнерских решений SO я не могу это исправить, но, возможно, ответчик может. - person ; 12.07.2018
comment
@ user1406043 справочные страницы (и некоторые оболочки) поддерживают обе. Вы можете сказать man git-clean, и оболочка отобразит документацию для команды git clean. - person Edward Minnix; 25.07.2018
comment
Следует подумать о том, чтобы переместить этот ответ, поскольку он совершенно не по теме. - person b00n12; 29.05.2019
comment
предупреждение... прочитайте перед выполнением вышеуказанной команды, Мои файлы исчезли после выполнения этой команды. - person Latief Anwar; 01.07.2019