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


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

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

но некоторые статьи, пункты git checkout -f для отмены изменений.

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

2 59

2 ответа:

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

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


ресурсы:

по теме:

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

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

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