CODEGURU

«Ё-моё что ж я сделал» или распространённые ошибки при работе с 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