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