Ладно, это не спасло мне жизнь. Но это сэкономило мне часы времени и избавило меня от невероятных разочарований.

Я работал над большой новой функцией, над сложной проблемой. После нескольких часов упорной работы я был готов. Я побежал git status, сел и гордо посмотрел на красный список, в котором подробно описаны десять или около того файлов, которые я либо модифицировал, либо создал.

Я тщательно просмотрел и добавил все свои изменения. Затем я подтвердил свои изменения простым описательным сообщением. Я был готов git push:

А потом я понял, что совершил ошибку. Я работал над master.

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

Теперь самый безопасный способ - и поверьте мне, у меня возникла эта идея, поэтому мне непонятно, почему я решил этого не делать - было бы выбрать вишенку коммита в новую ветку, а затем сбросить master в исходное состояние. . Однако по какой-то странной причине я поддержал свое мастерство Git и решил из памяти сделать что-то другое, чтобы вернуть кодовую базу на стадию до фиксации.

Давайте вместе пережить катастрофу

Вот инсценировка. Мы начнем с того момента, как я понял, что совершил ошибку:

Коммит вверху - это тот, который мне нужно было переместить.

Первое, что я сделал, это набрал git reset — soft HEAD^, чтобы последняя фиксация исчезла, но вся моя работа по-прежнему была поставлена. git status показал это:

И git log показал мне это:

Здорово! У меня была работа, но фиксация «Новая, большая функция…» исчезла с master.

Затем я проверил новую ветку под названием new-big-feature и запустил git status:

В этот момент я подумал: «Ветка new-big-feature выглядит хорошо. Прежде чем вносить эти изменения, позвольте мне привести в порядок ветку master ».

(Почему, Надя, почему ?!)

Итак, я снова проверил ветку master и запустил git reset --hard origin/master.

git status показал мне:

Вернемся в ветку new-big-feature.

Я ожидал увидеть это, когда запустил git status:

Вместо этого я увидел это:

Что за хрень ?!

Нет, этого не может быть!

Меня трясло. Мое сердце колотилось. У меня не было времени снова проделать всю эту работу. Как я мог быть таким беспечным?

Я набирал git status еще миллион раз, каждый раз говоря, что это, должно быть, какая-то ошибка, git status только ошибка, и вся моя работа будет там, и все будет в порядке.

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

Git настолько мощный, что большинство людей просматривают только поверхность

Внезапно я вспомнил, как кто-то сказал мне это. Еще я смутно помнил, как кто-то сказал:

«Он ведет журнал каждой команды Git, которую вы вводите, и вы можете проверять ее на разных этапах своего локального репозитория».

«Что ж, Гит, - подумал я про себя, - давай посмотрим, насколько ты могущественен».

Я пошел в Google и набрал: «восстановить непрошедшую потерянную фиксацию», и тогда я узнал о замечательном git reflog:

Журналы ссылок, или «журналы рефлогов», записывают, когда кончики веток и другие ссылки были обновлены в локальном репозитории. Рефлоги полезны в различных командах Git, чтобы указать старое значение ссылки. Например, HEAD @ {2} означает «где HEAD раньше был два шага назад», master@{one.week.ago} означает «где мастер указывал на неделю назад в этом локальном репозитории» и т. Д.

Надеюсь, я вернулся к своему терминалу и набрал git reflog:

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

Я сделал глубокий вдох, скрестил пальцы и набрал git reset --hard HEAD@{6}.

Аллилуйя!

git status показал это:

И git log дал мне это:

Коммит снова появился. Моя работа была восстановлена. Я вернулся в бизнес.

Я снова переключился на свою new-big-feature ветку, выбрал 2d6e22b фиксацию, а затем сбросил master.

Уф.

У Git твоя спина

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

Я также надеюсь, что эта история побудила вас узнать больше о поверхности Git. Этот опыт в сочетании с моим открытием опции - -_ 28_ на прошлой неделе заставил меня задуматься над тем, что еще Git может для меня сделать.

Вот кое-что, что я уже узнал - с Git вы даже можете восстановить работу, которую вы никогда не совершали!

Но это сообщение в блоге в другой раз.