По мотивам Oh shit, git!.

На самом деле Git не сложен:

git add .
git commit -m "new commit"
git push origin dev

Но иногда возникают случаи, когда этот цикл прерывается, и вот тогда, в силу незнания возникают проблемы.

Машина времени

“Господи, как все вернуть как было??” Да легко:

git reflog # выводим список коммитов...
git reset HEAD@{index} # ... и возвращаемся к нужному коммиту

Должно быть, крутая штука, и она обязательно должна быть в топе №1 must-have команд Git.

“Не тот комментарий к коммиту”

Пффф, не так сложно:

git commit --amend # меняем или оставляем комментарий к коммиту

Еще чуть-чуть дополнений к коммиту

Сделали коммит, но сразу вспомнили, что забыли что-то добавить? Не беда:

# делаем изменения
git add . # или git add some_file
git commit --amend # меняем или оставляем комментарий к коммиту
# теперь ваш последний коммит содержит эти изменения!

Такое часто бывает - из-за пропущенных пробелов, опечаток, лишних знаков.

“Я хотел закоммитить в новую ветку”

# создаем новую ветку
git branch new-branch
# жестко удаляем коммит из master ветки
git reset HEAD~ --hard
git checkout new-branch
# вуаля, теперь ваш коммит будет жить на новой ветке

Однако этот способ не работает если вы уже:

git push origin master

В таком случае вам придется воспользоваться машиной времени. Попробуйте не плакать. Плачьте как можно больше! (В переводе: “Бесконечная тоска”.)

“Я все-таки закоммитил не туда”

# удаляем последний коммит, но сохраняем изменения
git reset HEAD~ --soft
git stash
# переключаемся на нужную ветку
git checkout correct-branch
git stash pop
git add . # добавляем файлы в коммит
git commit -m "your message here"
# теперь ваши изменения на правильной ветке

На этом все.

Дополнительные ссылки

  1. Git diff HEAD vs –staged