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

в 11:01, , рубрики: Git, байки, Веб-разработка

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

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

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

Скопировав самое ценное на данный момент в отдельную папку, я полез разбираться в чем дело, попутно прикидывая в уме сколько времени у меня займет восстановить исходники из скомпилированного js и source map.

Что же произошло и как это исправить?

Через некоторые время Google вывел меня на пост Recovering From a Disasterous Git-rebase mistake, в котором у парня проблемы были точь-в-точь как мои. Дело было в следующем. По невыясненной причине git rebase «потерял» свежие коммиты и продолжил цепочку изменений от старого коммита.

К счастью, в случае с Git не все потеряно. В папке .git находятся логи всех коммитов, которые вы делаете в различные ветки. Они лежат по пути .git/logs/refs/heads/<branchname>. Я просмотрел файл, соответствующий рабочей ветке, и нашел потерянный коммит и его хеш. Вытащить из забытия было уже делом техники.

git checkout -b itsavedmyass b6d7cf192c46

После чего надо переключиться в рабочую ветку и смержить потерянные правки.

До сих пор не понятно, что привело к таким катастрофическим последствиям. То ли баг в Гите, то ли мои неправильные действия, которые я в запарке не заметил.

Автор: fetis26

Источник

Поделиться

* - обязательные к заполнению поля