Тут є ряд відповідей з помилковим уявленням про 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це ти , і так будеш рухатись, коли робиш.