Страницы

Поиск по вопросам

вторник, 2 октября 2018 г.

Убрать последний git-коммит, не меняя файлов проекта

У меня есть локальный репозиторий моего проекта. Там есть несколько коммитов. Последний коммит был сделан необдуманно (вспомнилось, что там есть пара проблем, которые не хотелось бы увековечивать). Я умею возвращаться к предыдущему коммиту (команда Revert). Но это не то, что мне нужно. Так я потеряю много полезного, сделанного между предыдущим коммитом и последним(необдуманным).
В общем, хочу сделать так, чтобы последнего коммита не было, но все мои файлы были такими, какие они есть сейчас.


Ответ

Убрать последний коммит
console
Просто удаляем последний коммит из ветки, в которой находимся. Указатель ветки перейдет на предыдущий. Все изменения, внесённые в этом коммите, останутся в рабочей области проекта (т.е. в файлах на диске).
git reset HEAD^
То же самое, плюс все изменения последнего коммита будут добавлены в индекс. Можно сразу сделать из них новый коммит.
git reset --soft HEAD^
GUI
То же самое можно сделать в Android Studio: View → Tool Windows → Version Control, вкладка Log, там ПКМ по предыдущему коммиту и Reset Current Branch to Here (выбрать Soft)

Отредактировать (пересоздать) последний коммит
Последний коммит был сделан необдуманно (вспомнилось, что там есть пара проблем, которые не хотелось бы увековечивать)
Этот коммит также можно отредактировать заменить новым. Просто добавьте в индекс все нужные файлы в том состоянии, которое достойно отлития в бронзе и высечения в мраморе.
git add file1 file2 folder git commit --amend --no-edit
Ключ --amend сообщает git о том, что нужно не создавать новый коммит, а пересобрать последний. Это нельзя назвать редактированием, т.к. коммиты - неизменяемые (immutable) объекты, как строки в Java.
Ключ --no-edit сообщает git о том, что мы не хотим менять комментарий последнего коммита. Вместо него можно задать новый комментарий: git commit --amend -m'bla bla bla'
Для этого тоже есть графический способ: специальная галочка в окне создания коммита:

Комментариев нет:

Отправить комментарий