Странный глюк Git, чуть не стоивший 10 часов работы

Я провел весь вчерашний день, напряженно работая, чтобы закрыть долгую и порядком надоевшую задачу. Было достаточно поздно, когда я закомитил изменения и отправил на пуш. Гит привычно ругнулся что не может, потому что есть свежие правки. Окей, pull, push. Теперь вроде нормально, можно идти спать.Проверю на тестовом сервере и потом пошлю ссылку коллегами, решил я напоследок. Тестовый показывал версию по состоянию на вчера. Странно, еще раз проверил, что правки ушли, в репозитории свежих изменений нет. По-быстрому проконсультировался с коллегой на предмет глюков тестового и решили отложить поиск проблемы на завтра.

На следующий день я еще раз сделал деплой на тестовый сервер, но он упорно показывал старую версию. Решил свериться с логом Гита… мой коммит… ЕГО ПРОСТО НЕ БЫЛО! Его не было нигде, ни в локальной копии, ни в удаленной. Его не было даже в исходниках на диске. Файлы, оставленные открытыми в редакторе, были пусты. Единственный фактом, связывающим меня в тот момент с реальностью, был скомпилированный js-файл проекта, оставшийся после сборки исходников. Он работал именно так, как я оставил его вчера.Скопировав самое ценное на данный момент в отдельную папку, я полез разбираться в чем дело, попутно прикидывая в уме сколько времени у меня займет восстановить исходники из скомпилированного js и source map.

Что же произошло и как это исправить? Через некоторые время Google вывел меня пост Recovering From a Disasterous Git-rebase mistake, в котором у парня проблемы были точь-в-точь как мои. Дело было в следующем. По невыясненной причине git rebase «потерял» свежие коммиты и продолжил цепочку изменений от старого коммита.К счастью, в случае с Git не все потеряно. В папке .git находятся логи всех коммитов, которые вы делаете в различные ветки. Они лежат по пути .git/logs/refs/heads/. Я просмотрел файл, соответствующий рабочей ветке, и нашел потерянный коммит и его хеш. Вытащить из забытия было уже делом техники.

git checkout -b itsavedmyass b6d7cf192c46 После чего надо переключиться в рабочую ветку и смержить потерянные правки.До сих пор не понятно, что привело к таким катастрофическим последствиям. То ли баг в Гите, то ли мои неправильные действия, которые я в запарке не заметил.

© Habrahabr.ru