У чому різниця між “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вирішив це. Я зміг піти від цього дивного стану. Отже, принаймні в деяких аспектах ці два не однакові.


У мене просто була така сама ситуація. Існує купа модифікованих файлів, які git скидає - hard HEAD не зникає, але git checkout -f це робить, тому вони явно не однакові на якомусь рівні.
Mike Wasson

1
У нашому випадку це сталося через зміну дозволів на файл; це виправлено stackoverflow.com/questions/1257592/…
Mike Wasson

2
Ви також можете отримати цю проблему, якщо ваші налаштування закінчення рядка git трохи заплутані, і вони намагаються конвертувати їх під час оформлення замовлення.
Саймон Іст
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.