«Ё-моё что ж я сделал» или распространённые ошибки при работе с Git и как их исправить
Твою мать, я накосячил. Пожалуйста, можно вернуть всё обратно!?!
Спасение:
git reflog# эта команда покажет вам всё, что вы делали во всех бранчах!# у каждой записи есть идентификатор HEAD@{index}# укажем тот, что находится перед тем, как вы всё поломалиgit reset HEAD@{index}# волшебство
Таким образом можно вернуть случайно удалённые файлы, или убрать неверный код, или восстановиться после некорректного слияния, или просто вернуться назад во времени к тому моменту, когда всё работало.
Твою мать, я сделал комит и вдруг понял, что забыл внести изменение!
Спасение:
# сделаем необходимые измененияgit add .git commit --amend# следуем указаниям для изменения сообщения комита или оставьте как есть# теперь в вашем комите все изменения!
Такое случается очень часто. Вы сделали комит и вдруг поняли, что забыли что-то, или обнаружили ошибку в коде. Можно решить эту проблему иначе: сделать новый комит, а затем сделать rebase -i (чтобы объединить комиты в один), но способ, указанный выше, работает в миллион раз быстрее.
Твою мать, надо поменять сообщение последнего комита!
Спасение:
git commit --amend
Да, вот так просто. И будьте внимательней.
Твою мать, я сделал комит в бранч master, а надо было сделать новый бранч!
Спасение:
# создадим новый бранчgit branch some-new-branch-name# удалим ваш комит из бранча mastergit reset HEAD~ --hardgit checkout some-new-branch-name# теперь ваш комит только в нужном бранче :)
Помните: это актуально только для локальных комитов, для которых не выполнялся push, и только если вы не пытались как-то иначе решить проблему.
Твою мать, я сделал комит не в тот бранч!
Спасение:
# отменим последний комит, но сохраним измененияgit reset HEAD~ --softgit stash# переходим в нужный бранчgit checkout name-of-the-correct-branchgit stash popgit add .git commit -m "your message here"# теперь всё в нужном бранче
Многие в такой ситуации предпрочитают использовать cherry-pick. Выберите сами, какой метод вам по душе.
git checkout name-of-the-correct-branch# возьмём последний комит из mastergit cherry-pick master# а затем удалим последний комит из mastergit checkout mastergit reset HEAD~ --hard