Git сложен: легко всё проебать, и трудно понять как исправить. Документация Git - это финиш: чтобы найти решение, тебе заранее надо знать название фишки, которая вернет всё на место.
Популярно опишу несколько ситуаций, из которых мне пришлось выбираться:
Используйте это, чтобы вернуть случайно удалённые штуки или убрать то, чем вы всё сломали, или восстановиться после неудачного слияния, или просто вернуться туда, когда всё работало. Я ОЧЕНЬ ЧАСТО использую reflog. Снимаю шляпу перед теми, кто предложил добавить это.
Бля, я закоммитил и вспомнил, что кое-что забыл!
Обычно я это использую, когда коммичу, потом запускаю тесты/сканеры... и блин, я не поставил пробел после знака равно. Также можно сделать изменения в новом коммите и использовать rebase -i чтобы склеить оба коммита вместе, но так в миллион раз быстрее.
Предупреждение: никогда не изменяйте коммиты, отправленные в публичную ветку! Изменяйте только коммиты в вашей локальной ветке, иначе вам пиздец.
Бля, мне нужно изменить сообщение моего последнего коммита!
Ебаные требования по наименованию.
Бля, Я случайно закоммитил что-то в мастер, хотя это должно быть в новой ветке!
NB: это не будет работать, если вы уже отправили коммит в удалённую ветку, и если вы пробовали сделать это как-то по-другому, может помочь git reset HEAD@{количество-коммитов-назад} вместо HEAD~. Ёбушки-воробушки. Так же многие люди предлагали сделать то же самое, но короче. Спасибо всем!
Бля, я случайно закоммитил не в ту ветку!
Многие люди предлагали использовать cherry-pick в такой ситуации, так что выбирайте, то что вам больше нравится!
Бля, я пытаюсь открыть diff, но ничего не происходит?!
Если вы уверены, что изменили файлы, но diff пуст, возможно вы индексировали изменения (add) и нужно добавить специальный флаг.
Бля, мне нужно отменить коммит, который был 5 коммитов назад!
Вам не нужно откатываться назад и копипастить старый файл в существующий! Если вы закоммитили хрень, её можно убрать с revert.
Также можно отменить только один файл вместо целого коммита! Но конечно, (как всегда у git`а) это совершенно другой набор чёртовых команд...
Бля, мне нужно отменить изменения в файле!
Когда до меня это дошло, это было ОХУЕННО. Если серьезно, то схуяли checkout -- лучший способ отменять изменения? :угрожает-линусу-торвальдсу:
Нахуй всё, я сдаюсь.
Спасибо Eric V. за эту подсказку. Все жалобы по поводу использованию sudo в этой шутке могут быть направлены сразу ему.
Вообще говоря, если ваша ветка настооолько загажена, что нужно вернуться к удалённому состоянию в "git-корректном стиле" попробуйте это, но это необратимо!