Как отменить последнее коммит в git, но сохраните мои изменения как неустановленные?

Я совершил коммит, но теперь довольно сложно понять, что я все изменил. Я могу, конечно, выполнить git diff, но я бы скорее отменил последнее коммит и сохранил все мои изменения тактично, чтобы моя IDE (PyCharm) просто показывала мне, какие файлы были изменены.

Итак, есть способ отменить последнюю фиксацию (действительно удалить ее), но все равно сохранить мои изменения в такте? Все советы приветствуются!

Ответ 1

Это звучит как задание для git reset --soft, чья помощь (git help reset) говорит следующее:

--soft
    Does not touch the index file nor the working tree at all
    (but resets the head to <commit>, just like all modes do).
    This leaves all your changed files "Changes to be
    committed", as git status would put it.

Итак, фиксация отменена, но файлы все еще выглядят так, как они делали раньше. В индекс ничего не помещается.

Ответ 2

Я оставил бы --soft в двух других ответах и ​​перешел бы с простым git reset @^ (или git reset HEAD^ в более старых версиях git), который по умолчанию будет git reset --mixed @^. Разница в том, что мягкий reset оставляет файлы, поставленные для фиксации, что не так, как кажется. Если вы действительно хотите отменить фиксацию, вы также должны, вероятно, отключить изменения, что и делает по умолчанию. Я нахожу это гораздо более полезным в общем случае, чем мягкий reset, что, вероятно, является причиной того, что смешанным является значение по умолчанию.

Ответ 3

Как говорит Питер, я бы пошел с git reset --soft, который должен оставить так, как ваш индекс, так и рабочий каталог.

В вашем случае, если вы хотите вернуться 1 commit, вы можете использовать git reset --soft HEAD~, чтобы указать ветку в родительском коммите текущего HEAD; ваш индекс и рабочий каталог по-прежнему будут содержать ваши измененные файлы.

Полезная статья о reset: http://git-scm.com/blog/2011/07/11/reset.html