Git: Как отменить коммит * и * вернуться к последней ветке - PullRequest
7 голосов
/ 08 июля 2011

Э-э-э ... Я по ошибке совершил довольно сложное изменение (включая подкаталог и переименование файлов), не зная, что я делаю (или что будет делать Git).

Теперь я хочу отменить всетакой, что:

  1. коммит полностью отменен (как если бы он никогда не был сделан, возможно, удалив его и из истории)
  2. Восстановить текущий рабочий каталог (где .git)в определенную ветку (последняя будет делать пока).

Я нашел ссылки на git reset --soft и git reset --hard , ноЯ уже доказал себе, что могу нанести реальный ущерб, преждевременно используя команду, не понимая ее полностью.:)

Я нашел справочную страницу git reset , но все еще не могу понять:

  1. Что такое HEAD?
  2. В чем разница между HEAD и * master?
  3. В моей ситуации (см. Выше) мне нужно использовать --soft, --hard или другие (еще 3 варианта)?
  4. Нужно ли запускать другую команду (после выполнения git reset), чтобы "завершить" обращение?

ОБНОВЛЕНИЕ: После прочтения ответа ниже:

  1. Правильно ли я понимаю, что все, что мне нужно сделать в моей ситуации, - это выполнить одну команду git reset --hard HEAD^?
  2. Как проверить, что обращение было выполнено правильно?

Ответы [ 2 ]

7 голосов
/ 08 июля 2011
  1. HEAD - последняя фиксация извлеченной ветви.
  2. master - это ветвь (основная ветвь, по соглашению), тогда как HEAD - это место в истории для извлеченной ветки. HEAD относительно ветви, в которой вы находитесь.
  3. git reset --soft оставит ваши изменения в рабочем дереве без каких-либо обязательств для вас делать все, что вам нравится. git reset --hard восстановит рабочее дерево до состояния, в котором оно находилось при коммите, в который вы сбросили.
  4. Никаких других команд не требуется.

Во-первых, чтобы сохранить коммит на тот случай, если вы захотите проверить его позже, сделайте ветку:

git checkout -b my_bad_commit

(или, альтернативно, git branch my_bad_commit, как указано в комментарии Ларсмана.)

Затем вернитесь к master или к любой ветке, в которой вы были, и выполните сброс:

git checkout branch_with_bad_commit
git reset --hard HEAD^

HEAD ^ переводится как «родитель HEAD», который вы даже можете сложить для HEAD ^^ = 2 коммитов обратно. Подробнее об этом читайте в главе книги сообщества git по отменить в git

1 голос
/ 08 июля 2011
  1. HEAD является кончиком текущей ветви .
  2. Разница между HEAD и master заключается в том, что HEAD изменяется при извлечении ветви (или фиксации).
  3. --soft оставит изменения, поэтому вы можете повторно добавить / зафиксировать их или отменить их, выполнив git checkout с измененными файлами. --hard вернет рабочую область в состояние коммита, в который вы сбрасываете.
  4. Нет, если вы reset --hard. Возможно, вам придется git push --force для удаленных репозиториев (хотя, если внесенные вами изменения уже находятся на удаленном сервере, переписывание истории настоятельно не рекомендуется).
...