Тут є ряд відповідей з помилковим уявленням про git reset --soft
. Хоча існує специфічна умова, в якій git reset --soft
буде змінюватися HEAD
(починаючи з відокремленого стану голови), як правило (і за призначенням), воно переміщує посилання гілки, яке ви перевірили на даний момент. Звичайно, це не може зробити, якщо у вас немає філії, яку ви перевірили (отже, конкретна умова, де git reset --soft
лише зміниться HEAD
).
Я вважав, що це найкращий спосіб задуматися git reset
. Ви не просто рухатися HEAD
( все це робить ), ви також переміщення гілки реф , наприклад master
. Це схоже на те, що відбувається під час запуску git commit
(поточна гілка рухається разом із HEAD
), за винятком того, що замість створення (та переходу до) нової фіксації, ви переходите до попередньої фіксації.
Це сенс reset
змінити гілку на щось інше, ніж нове зобов’язання, а не змінити HEAD
. Це можна побачити в прикладі документації:
Скасуйте комісію, зробивши її темою
$ git branch topic/wip (1)
$ git reset --hard HEAD~3 (2)
$ git checkout topic/wip (3)
- Ви домовились про деякі зобов’язання, але розумієте, що вони були передчасними перебувати у галузі "майстра". Ви хочете продовжувати шліфування їх у темі, тому створіть гілку "тема / витирання" з поточної HEAD.
- Перемотайте головну гілку, щоб позбутися цих трьох коміттів.
- Перейдіть на гілку "тема / витримка" та продовжуйте працювати.
У чому сенс цієї серії команд? Ви хочете перенести гілку тут master
, тож поки ви master
зареєструвались, ви біжите git reset
.
Тут найкраще проголосовано відповідь, але я подумав, що я додам це, щоб виправити кілька відповідей з оманами.
Змініть свою філію
git reset --soft <ref>
: Скидає покажчик філії в даний час витягнутої гілки до вчиняє в вказаним посиланням, <ref>
. Файли у вашому робочому каталозі та індексі не змінюються. Здійснення цього етапу поверне вас туди, де ви були перед git reset
командою.
Змініть також свій індекс
git reset --mixed <ref>
або рівнозначно
git reset <ref>
:
Здійснює те, що --soft
робить AND, також скидає індекс на відповідність фіксуванню за вказаною посиланням. Хоча git reset --soft HEAD
нічого не робить (тому що він говорить про переміщення перевіреної гілки до перевіреної гілки), git reset --mixed HEAD
або, що рівно git reset HEAD
, є загальною і корисною командою, оскільки вона скидає індекс до стану останньої комісії.
Змініть також свій робочий каталог
git reset --hard <ref>
: робить те, що --mixed
робить AND, також перезаписує ваш робочий каталог. Ця команда аналогічна git checkout <ref>
, за винятком того, що (і це вирішальний момент щодо reset
) всіх форм git reset
переміщення HEAD
вказівки на гілку .
Примітка про "таку та таку команду рухає ГОЛОВУ":
Не корисно сказати, що команда рухає HEAD
. Будь-яка команда, яка змінюється там, де ви знаходитесь у вашій історії фіксації, переміщує HEAD
. Ось що HEAD
є , вказівник туди, де ви знаходитесь. HEAD
це ти , і так будеш рухатись, коли робиш.