Давайте научимся использовать возможности этого продвинутого инструмента для предотвращения сбоев в Git.

Добро пожаловать в выпуск № 23 журнала O ne M, чтобы стать B etter D разработчиком, где вы становитесь более успешный разработчик программного обеспечения, читая короткие отрывки знаний, по одной минуте за раз.

⏮️ 🔛

ЭТА ПРОБЛЕМА

Локальная ветвь, удаленная случайно, раздавленная, фиксирует, что мы хотели бы, чтобы ее не раздавили ... когда происходит катастрофа, разве не было бы замечательно, если бы мы могли путешествовать во времени в Git?

РЕШЕНИЕ

Давайте узнаем, как использовать git reflog. Во-первых, немного контекста.

Журналы ссылок, или «журналы рефлогов», записывают, когда кончики веток и другие ссылки были обновлены в локальном репозитории.

git reflog по умолчанию нацелен на HEAD - символическую ссылку на текущую активную ветвь, но другие ветки, теги, пульты дистанционного управления и тайник Git также могут быть нацелены.

git reflog показывает «движения» с синтаксисом name@{qualifier}. Например. HEAD@{2} означает «там, где HEAD раньше был два хода назад».

Давайте применим это на практике.

Восстановление локально удаленной ветки

Мы удалили локальный филиал, как его восстановить?

git branch -D navbar-feature

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

3b7a6fdb (HEAD -> master) HEAD@{0}: checkout: moving from navbar-feature to master
9a07e99f HEAD@{1}: commit: feat: add Navbar
3b7a6fdb (HEAD -> master) HEAD@{2}: checkout: moving from master to navbar-feature

Итак, мы можем просто создать новую ветку с содержимым этого момента в истории:

git checkout -b navbar-feature HEAD@{1}

Потрясающе, мы восстановили нашу ветку и ее коммиты!

Восстановление сжатых коммитов

У нас есть 3 коммита:

747ef1e feat: add Button
19d9327 feat: add Navbar
effb3b4 initial commit

Мы понимаем, что забыли добавить что-то в фиксацию Navbar, поэтому мы добавляем эти изменения и фиксируем с исправлением git commit --fixup 19d9327. Наша история сейчас:

c2149d1 fixup! feat: add Navbar
747ef1e feat: add Button
19d9327 feat: add Navbar
effb3b4 initial commit

А теперь, чтобы очистить нашу историю, скомпилировав этот последний коммит с его ссылкой, мы используемgit rebase --autosquash --interactive HEAD~4. Наша история теперь чиста:

de1e9de feat: add Button
b3b4932 feat: add Navbar
effb3b4 initial commit

Однако как мы можем вернуться к нашей истории до перезагрузки? git reflog показывает, что когда мы зафиксировали это исправление, это было 4 хода назад HEAD@{4}, тогда как самые последние ходы являются частью перебазирования.

4610b383 HEAD@{0}: rebase -i (finish): returning to refs/heads/master
4610b383 HEAD@{1}: rebase -i (pick): feat: add Navbar
52d0c48c HEAD@{2}: rebase -i (fixup): feat: add Navbar
07097c96 HEAD@{3}: rebase -i (start): checkout HEAD~4
c2149d1 HEAD@{4}: commit: fixup! feat: add Navbar

Так что мы можем просто git reset HEAD@{4}, и мы восстановили нашу историю до сквоша! Вот что сейчас показывает git log:

c2149d1 fixup! feat: add Navbar
747ef1e feat: add Button
19d9327 feat: add Navbar
effb3b4 initial commit

Спасибо за прочтение! Продолжайте учиться и не прекращайте кодировать 😊

Ресурсы
https://git-scm.com/docs/git-reflog
https://www.atlassian.com/git/tutorials/rewriting- history / git-reflog
https://www.edureka.co/blog/git-reflog/

Если вам понравилась эта история, вам также могут понравиться:





⏮️ 🔛