Здесь есть несколько ответов с неправильным представлением о 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
это вы , и поэтому будете двигаться, когда вы делаете.