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 года.