В чем разница между "git checkout -f" и "git reset --hard HEAD"?
Мне нужно отменить локальные изменения для развертываний. (Я использовал svn revert
для этого в старых SVN-днях skool.)
И im используя git reset --hard HEAD
для этого. (Также git fetch
и git merge origin/$branch --no-ff
для синхронизации с ветвью вверх по течению.)
Но некоторые статьи указывают git checkout -f
на возврат изменений.
Какие ключевые отличия между этими командами. Какой способ рекомендуется?
Ответы
Ответ 1
Два из них имеют одинаковый эффект. Я рекомендую вам выбрать решение, с которым вы более комфортно.
Но если в этом конкретном случае эффект будет одинаковым, то с разными значениями он будет совершенно другим. В основном (есть больше, см. Связанные темы) с помощью reset вы перемещаете текущую ветку и HEAD на конкретную фиксацию, но с помощью checkout вы перемещаете HEAD только. Подробнее см. Ниже.
Ресурсы
В той же теме:
Ответ 2
У меня еще нет комментариев, чтобы прокомментировать другие ответы, я просто хотел добавить, что столкнулся с ситуацией, когда две команды НЕ имеют такого же эффекта. Я попал в странное состояние, так что это определенно крайний случай. Вот что произошло:
Я был в ветке, все чисто. Я проверил master git checkout master
и нашел из git status
, что произошли изменения в существующих файлах, не поставленных для фиксации (да, в коде, который я только что проверил). Я попробовал затихнуть, чтобы вернуться в чистое состояние, заявив, что кошелек закончил, но git status
все еще не изменился. Также попробовал git reset --hard HEAD
. Он также сообщил об успешном завершении, но статус не изменился. Я не мог отменить эти странные изменения.
Однако, git checkout -f
решил это. Мне удалось уйти от этого странного состояния. Таким образом, по крайней мере, некоторые способы, они не совпадают.