Якщо ви випадково видалили гілку, яку ще не відправляли на віддалений репозиторій, не хвилюйтеся – у Git є інструмент, який вам допоможе, це reflog
. Ось як це зробити:
Припустимо, у мене була локальна гілка branch_1
, і я зробив коміт в цій гілці:
$ git log --oneline
* f6cc57d (branch_1) Add some changes for branch_1
* 99f7004 (HEAD -> main) Some old commit
* d8dc31c Some old old commit
...
Тепер я випадково видаляю гілку branch_1
:
$ git branch -D branch_1
Deleted branch branch_1 (was f6cc57d).
О ні, вся моя робота в цій гілці зникла 😱:
$ git log --oneline
* 99f7004 (HEAD -> main) Some old commit
* d8dc31c Some old old commit
...
Оскільки я не відправляв цю гілку на віддалений сервер, її копії там немає, тому я звертаюся до reflog
. Git завжди веде журнал ваших дій у репозиторії. До цих дій відноситься будь-яка взаємодія з Git: коміти, створення гілок, використання stash і т.д. Ось як Git описує reflog
:
Журнали посилань, або “reflogs”, фіксують моменти, коли вершини гілок або інші посилання оновлюються у локальному репозиторії. Вони корисні для відновлення попередніх станів у різних командах Git.
Тож скористаємось reflog
у нашому випадку:
$ git reflog
99f7004 (HEAD -> main) HEAD@{0}: checkout: moving from branch_1 to main
f6cc57d HEAD@{1}: commit: Add some changes for branch_1
99f7004 (HEAD -> main) HEAD@{2}: checkout: moving from main to branch_1
...
Ось наш останній коміт у гілці branch_1:
f6cc57d HEAD@{1}: commit: Add some changes for branch_1
Це точка в історії, до якої ми хочемо повернутися. Варто зазначити, що гілки – це лише мітки, які вказують на коміти в дереві. Якщо ми змусимо мітку вказувати на потрібний коміт, ми відновимо нашу гілку такою, якою вона була до видалення.
Щоб це зробити, спочатку відтворюємо видалену гілку:
$ git checkout -b branch_1
Switched to a new branch 'branch_1'
Ми створили нову гілку, але вона вказує на неправильний коміт (той самий, що й main). Тепер використовуємо команду reset
з прапорцем --hard
, щоб встановити вершину гілки на коміт f6cc57d
:
(branch_1) $ git reset --hard f6cc57d
HEAD is now at f6cc57d Add some changes for branch_1
Якщо тепер переглянути журнал комітів, ми побачимо, що гілка відновлена:
$ git log --oneline
* f6cc57d (HEAD -> branch_1) Add some changes for branch_1
* 99f7004 (main) Some old commit
* d8dc31c Some old old commit
...
У цьому прикладі у нас був лише один коміт у гілці, тому ми вказали на нього. Якщо у вас було більше комітів, просто вкажіть на останній коміт у втраченій гілці, і все буде відновлено! 🚀