Назад

September 16, 2024

🔀 Відновлення видаленої локальної гілки в git

Якщо ви випадково видалили гілку, яку ще не відправляли на віддалений репозиторій, не хвилюйтеся – у 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
...

У цьому прикладі у нас був лише один коміт у гілці, тому ми вказали на нього. Якщо у вас було більше комітів, просто вкажіть на останній коміт у втраченій гілці, і все буде відновлено! 🚀