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

git reset полезно, когда вы сделали что-то не так. Вы можете повернуть время вспять и отменить коммиты.

git reset --soft HEAD~1 отменяет один коммит и оставляет работу из этого коммита в рабочем каталоге.

git reset --hard HEAD~1 удаляет коммит и всю работу.

Разница между флагами --soft и --hard — это один из способов выстрелить себе в ногу. Я знаю, что перепутал их и потерял работу. Или я так думал.

Войдите в рефлог

Оказывается, git наблюдает за нами ближе, чем мы думаем. Когда мы вносим изменения в любую ветку, git сохраняет эти изменения в журнале ссылок. Даже если бы мы удалили целую кучу работы, сбросив флаг --hard, git все равно знает о сделанных нами коммитах, и мы можем их восстановить. Суть в том, что коммиты все еще существуют, просто нет веток, указывающих на них. Здесь в игру вступает reflog. В нем есть журнал всех коммитов, сделанных в репо, а также других действий, и мы можем использовать его для восстановления этих потерянных коммитов.

Предупреждение!

Прежде чем я покажу вам, как это работает, обратите внимание на следующее. Если у вас есть незафиксированные изменения в рабочем каталоге, и вы используете git reset --hard, никакие причудливые знания git о журнале ссылок не вернут их обратно. Следующее сохранит только ту работу, которую вы совершили. Имейте в виду!

Как использовать reflog для восстановления потерянных коммитов

Вот пример, у меня есть репо с одним коммитом. Запуск git log --oneline и git reflog показывает, что фиксация имеет хэш 2daf3ba.

Теперь мы делаем коммит, что-то важное, конечно.

Что произойдет, если мы git reset --hard HEAD~1?

git log показывает только один коммит, а git reflog показывает три действия; два коммита и один сброс. Обратите внимание, что сброс указывает на тот же хэш, что и исходный коммит. Итак, как нам вернуться к последнему состоянию перед сбросом? Мы можем перезагрузить снова.

На этот раз мы сбрасываем, используя хэш нашего потерянного коммита. Вы всегда можете сбросить, используя хэши, на самом деле HEAD~1 — это просто ссылка на хэш. Как сейчас выглядит рефлог?

Журнал ссылок теперь показывает четыре действия, которые мы предприняли; два коммита, а затем два сброса. Сейчас мы сбросили ветку в то состояние, в котором были до этого, ни одна работа не пропала, вздохните с облегчением.

Чтобы ты больше никогда не терял свою работу

git reflog отслеживает все, что мы делаем с git. Как и в большинстве случаев в git, как только вы узнаете об этой функции, вы сможете использовать ее в своих интересах. Знание того, что у меня есть этот трюк в рукаве, сделало меня более уверенным в использовании git.

Я хотел бы поблагодарить Стива Смита за выступление на Codemotion Berlin, где я научился этому трюку. Существует доступная аудиозапись его выступления и гораздо более подробная статья о git refs и reflog на учебном сайте Atlassian.

Если вам нужно больше советов, как избежать кошмарных мерзавцев, прочтите Вот дерьмо, мерзавец! сборник git-советов от Кэти Силор-Миллер. Она называет reflog волшебной машиной времени, я, конечно, согласен, и, надеюсь, теперь вы тоже.

Логотип Git от Jason Long.

Вернитесь в будущее впервые было опубликовано на сайте philna.sh 4 января 2017 года.