Git спасает: 8 команд на случай, когда всё уже сломалось

AnnaMiller

New member
Привет, форумчане. Пишу этот текст с чувством человека, который в пятницу вечером отправил изменения не в ту ветку и минуту смотрел в терминал, как в пропасть. Если вы хотя бы раз ощущали этот холод в животе, когда история коммитов исчезает на глазах, статья для вас. За годы работы я собрал небольшой набор команд, которые раз за разом вытаскивали меня и коллег из ямы. Делюсь не как учебник, а как личный опыт с пометками на полях.

Начну с короля спасателей, это git reflog. Git почти ничего не удаляет сразу, он просто перестаёт показывать это в обычной истории. Reflog хранит журнал всех перемещений указателя HEAD: коммиты, переключения веток, сбросы, даже те, которые вы уже мысленно похоронили. Я нахожу там нужный хеш, копирую его и создаю новую ветку либо просто возвращаю состояние на этот момент. Именно reflog вернул мне ту самую ветку в тот пятничный вечер.

Дальше идёт связка git reset и git revert. Reset отвечает за переписывание локальной истории: мягкий режим оставит изменения готовыми к коммиту, смешанный вернёт их в рабочую директорию, а жёсткий безжалостно всё затрёт, но иногда именно он нужен, когда состояние репозитория безнадёжно перемешано. Revert делает противоположное и, на мой взгляд, гораздо безопаснее: он создаёт новый коммит, отменяющий старый. Если ветка уже улетела в общий репозиторий, я почти всегда выбираю revert, и коллеги говорят спасибо.

git stash — это карман на чёрный день. Ситуация классическая: вы в середине правок, а нужно срочно переключиться на другую ветку или подтянуть чужие изменения. Stash сохранит и рабочую директорию, и подготовленные изменения, а возврат вернёт всё обратно. Отдельно советую запомнить флаг для неотслеживаемых файлов: без него новые файлы останутся валяться в проекте и будут мешать. Хитрость, которую я узнал слишком поздно: сохранённое можно применить к другой ветке, и это спасло мне не один вечер.

git cherry-pick выручает, когда нужный коммит застрял в мёртвой ветке. Допустим, фича сломала половину проекта и её решили выбросить, но один коммит с исправлением критичного бага в ней был идеальным. Переключаетесь на живую ветку и переносите только его, аккуратно, без всего мусора вокруг. Ещё один сценарий: перенос горячей правки из релизной ветки в основную. Главное помнить, что при конфликтах Git остановится и попросит вас разобраться, а не бросит дело на полпути.

Самый недооценённый инструмент в моём списке — git bisect. Когда непонятно, какой из сотни коммитов сломал поведение, начинается археология. Bisect превращает её в быстрый бинарный поиск: вы помечаете плохой коммит, потом хороший, и Git сам предлагает следующий для проверки. Пара минут вместо дня чтения различий между версиями. Я использую его вместе с маленьким скриптом, который автоматически проверяет условие, но и вручную он работает отлично.

Замыкают список git clean и git fsck. Clean наводит порядок в рабочей директории, убирая неотслеживаемые файлы и папки. Перед запуском обязательно сделайте сухой прогон, я однажды так удалил локальные конфиги, о которых забыл. Fsck проверяет целостность базы объектов и находит висячие коммиты и блобы, которые уже ни на что не указывают, оттуда тоже иногда выуживаются вещи, потерянные после жёстких сбросов.

Мой главный совет не в командах, а в привычке: прежде чем делать что-то разрушительное, загляните в reflog и создайте копию ветки. Тогда даже самая смелая операция перестаёт быть страшной. И ещё: почти ничего в Git не теряется навсегда, паниковать обычно не стоит. А теперь вопрос к вам: какая команда или случай однажды спасли ваш проект, и чему вы после этого научились? Буду рад почитать ваши истории в комментариях.
 
Назад
Вверх