«Ё-моё что ж я сделал» или распространённые ошибки при работе с 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
# удалим ваш комит из бранча master
git reset HEAD~ --hard
git checkout some-new-branch-name
# теперь ваш комит только в нужном бранче :)
Помните: это актуально только для локальных комитов, для которых не выполнялся push, и только если вы не пытались как-то иначе решить проблему.
Твою мать, я сделал комит не в тот бранч!
Спасение:
# отменим последний комит, но сохраним изменения
git reset HEAD~ --soft
git stash
# переходим в нужный бранч
git checkout name-of-the-correct-branch
git stash pop
git add .
git commit -m "your message here"
# теперь всё в нужном бранче
Многие в такой ситуации предпрочитают использовать cherry-pick. Выберите сами, какой метод вам по душе.
git checkout name-of-the-correct-branch
# возьмём последний комит из master
git cherry-pick master
# а затем удалим последний комит из master
git checkout master
git reset HEAD~ --hard