Ладно, это не спасло мне жизнь. Но это сэкономило мне часы времени и избавило меня от невероятных разочарований.
Я работал над большой новой функцией, над сложной проблемой. После нескольких часов упорной работы я был готов. Я побежал 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 вы даже можете восстановить работу, которую вы никогда не совершали!
Но это сообщение в блоге в другой раз.