В чем разница между «git checkout -f» и «git reset --hard HEAD»?

81

Мне нужно отменить локальные изменения для развертываний. (Я использовал svn revertдля этого в старые школьные дни SVN.)

И я использую git reset --hard HEADдля этого. (Также git fetchи git merge origin/$branch --no-ffдля синхронизации с восходящей веткой.)

Но некоторые статьи указывают git checkout -fна отмену изменений.

В чем основные различия между этими командами. Какой способ рекомендуется?

осм
источник

Ответы:

64

Оба они имеют одинаковый эффект. Я рекомендую вам выбрать наиболее удобное решение.

Но если в данном конкретном случае эффект будет таким же, то с разными значениями он будет совсем другим. В основном (их больше, см. Связанные темы) при сбросе вы перемещаете текущую ветку и HEAD в конкретную фиксацию, но с проверкой вы перемещаете только HEAD. Подробнее см. Ниже.


Ресурсы:

По той же теме:

Колин Хеберт
источник
13

У меня пока нет представителя, чтобы прокомментировать другие ответы, я просто хотел добавить, что столкнулся со случаем, когда две команды НЕ имеют одинакового эффекта. Я попал в странное состояние, так что это определенно крайний случай. Вот что произошло:

Был в ветке, все чисто. Я проверил master git checkout masterи обнаружил, git statusчто были изменения в существующих файлах, не предназначенных для фиксации (да, в коде, который я только что проверил). Я попытался вернуться в чистое состояние, тайник утверждал, что завершен, но git statusвсе еще не изменился. Тоже пробовал git reset --hard HEAD. Он тоже сообщил об успешном завершении, но статус не изменился. Я не мог отменить эти странные изменения.

Однако git checkout -fрешил это. Я смог выйти из этого странного состояния. Так что, по крайней мере, в некотором смысле это не одно и то же.

user1807768
источник
У меня была точно такая же ситуация. Была куча модифицированных файлов, которые git reset --hard HEAD не удаляла, но git checkout -f исчезла, так что на каком-то уровне они явно не то же самое.
Mike Wasson
1
В нашем случае это произошло из-за изменения прав доступа к файлам; это исправило stackoverflow.com/questions/1257592/…
Майк Уоссон,
2
У вас также может возникнуть эта проблема, если ваши настройки окончания строки git немного запутаны, и он пытается преобразовать их при оформлении заказа.
Саймон Ист