В чем смысл git reset --hard origin / master?

224

Я сделал git pullи получил ошибку:

Следующие файлы рабочего дерева будут перезаписаны слиянием ... Пожалуйста, переместите или удалите их, прежде чем вы сможете слить.

Чтобы решить эту проблему, я сделал следующее:

git fetch
git reset --hard origin/master

Теперь, когда я это делаю git pull, он говорит, что все в курсе. Я хочу знать, что именно происходит, когда я запускаю эти команды. Я знаю, что git fetchполучает изменения из удаленного репо без слияния их с моим локальным репо.

В чем смысл git reset --hard origin/master? Как это работает?

Раза
источник

Ответы:

415
git reset --hard origin/master

говорит: выбросить все мои поэтапные и неустановленные изменения, забыть все в моей текущей локальной ветке и сделать это точно так же, как origin/master.

Вы, вероятно, хотели спросить это, прежде чем запустить команду. На разрушительную природу намекают те же слова, что и в «hard reset».

CB Bailey
источник
9
Вы можете отменить этот шаг, используя git reset --hard HEAD@{1}. HEAD@{1}варьируется от ситуации к ситуации, поэтому рекомендуется поискать ее в git reflog.
Нильс Вернер
2
Обратите внимание, что метод @ NilsWerner для отмены перемещения не восстанавливает поэтапные и неустановленные изменения. Те ушли навсегда.
Майкл Андерсон
3
Промежуточные файлы по-прежнему можно найти с помощью git fsck --lost-found, но они не будут привязаны к исходному пути к файлу, и их будет сложно отсортировать.
CB Bailey
1
Часто полезно сбросить локальную основную ветку на origin / master, когда вы (возможно, случайно) зафиксировали изменения в локальном master вместо локальной ветви. Просто создайте локальную ветку для ваших последних коммитов, а затем сбросьте ваш локальный мастер на origin / master. Затем вы можете слить или перебазировать вашу ветку от мастера по мере необходимости.
Майк Хоппер
2
LOL "намекнул" - отличный способ описать это, поскольку это далеко не очевидно или явно
Бен Сандин