Подтвердить что ты не робот

В чем разница между "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 на возврат изменений.

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

4b9b3361

Ответ 1

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

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


Ресурсы

В той же теме:

Ответ 2

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

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

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