Давайте научимся использовать возможности этого продвинутого инструмента для предотвращения сбоев в 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/