Здесь есть несколько ответов с неправильным представлением о 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)
- Вы сделали некоторые коммиты, но понимаете, что они были преждевременны, чтобы быть в "основной" ветке. Вы хотите продолжить полировать их в ветке темы, поэтому создайте ветку "topic / wip" вне текущей HEAD.
- Перемотайте ветку master, чтобы избавиться от этих трех коммитов.
- Переключитесь на ветку "topic / wip" и продолжайте работать.
Какой смысл в этой серии команд? Вы хотите переместить ветку здесь 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делает И также перезаписывает ваш рабочий каталог. Эта команда аналогична git checkout <ref>, за исключением того, что (и это ключевой момент reset) все формы git resetперемещения, на которые HEADуказывает ссылка ref .
Примечание о "такая-то команда перемещает ГОЛОВУ":
Бесполезно говорить, что команда перемещает HEAD. Любая команда, которая меняет ваше местоположение в истории коммитов, перемещает HEAD. Это то, что HEAD есть , указатель на то, где вы находитесь. HEADэто вы , и поэтому будете двигаться, когда вы делаете.