Заметки из жизни DevOps-консультанта
Допустим, вы сделали commit в git, но поняли, что он недостаточно хорош. В таком случае можно продолжить правки, а при следующем коммите набрать
Ключ —amend (улучшить, в переводе с английского) позволяет добавить к последнему коммиту новые изменения.
Если вы сделали commit в git, но поняли, что он достаточно плох, то можно сделать и так:
Эта команда отменит последний коммит (но не изменения, которые вы внесли, они сохранятся).
Если последний коммит отвратителен, то можно вообще его удалить:
Все это работает, если вы не опубликовали свои изменения. В случае, если вы их опубликовали, то не остается ничего другого, как сделать коммит, который отменяет какой-то коммит:
Ну, а потом опубликовать поскорее его командой git push .
Кстати, моя компания сделала отличный однодневный мастер-класс по git, обязательно приходите, расскажем вам обо всех тонкостях работы с гитом и не только.
Хорошие материалы по git можно посмотреть здесь:
Отмена последнего коммита
Чтобы отменить последний коммит в локальном Git репозитории, используется команда:
Данная команда отменяет последний коммит. Файлы из данного последнего коммита переходят в статус unstaged, то есть в то состояние, в котором они были до коммита. Если запустить команду git status , то эти файлы будут находиться в списке «Changes not staged for commit». Содержимое файлов не изменяется.
Полное удаление последнего коммита
Если вы хотите полностью удалить последний коммит, включая все изменения файлов данного коммита, то используется команда:
Например: у вас есть следующие коммиты A←B←C←HEAD . Коммит C самый последний и на него указывает HEAD (указатель на текущее состояние). После выполнения команды git reset —hard HEAD
1 вы получите состояние A←B←HEAD (коммит C будет удален). HEAD теперь указывает на коммит B .
Есть вот такой перечень коммитов.
- коммит 5
- коммит 4
- коммит 3
- коммит 2
- коммит 1
Хочу удалить коммиты 5, 3 и 2. Т.е не просто убрать их видимость в ветке, а удалить насовсем. Можно ли это сделать с сохранением коммита 4?
2 ответа 2
Для подобного действия Вам нужен интерактивный rebase. Если кратко, тогда так
вначале нужно его запустить
6 (шесть коммитов назад), можете взять хеш любого коммита перед коммитом 1. Откроется вим или другой редактор. Там будет список коммитов. Теперь удаляем ненужные коммиты (просто удаляем строки). Если это вим, тогда просто нажимаем дважды d на нужных строках (то есть тех, которых нужно удалить).
Потом выходим с редактора (если это вим — Esc : w q ).
После этого git откатит эти коммиты и накатит их по новому. Вполне возможно, что нужно будет по ходу дела решать конфликты.
Помните, что на самом деле старые коммиты никуда не уйдут, просто будут созданы новые коммиты.
Если эти коммиты уже были запушены на удаленный сервер, то лучше не делать подобного. Но если над проектом работаете только Вы, то нет ничего страшного. Но пуш придется делать форсированным ( -f ).