git reset: повернути час назад
Найстрашніші команди в гіті: git reset --hard і git push --force.
Особливо якщо виконані випадково, один за одним і в репозиторії, з яким працює ще пара десятків людей.
Як швидко виправити ситуацію?
Зробити git reset.
Чарівна формула
Команда на всі випадки, коли потрібно щось скасувати:
Скасувати git push --force
Якщо ви зробили форс-пуш і швидко зрозуміли, що зробили його не туди, ситуацію легко поправити.
Головне - не панікувати.
Останній рядок говорить, що до пуша останній Комміт в віддаленому майстра був a1a1a1. а після пуша останнім коммітов став b2b2b2.
Збройні цим знанням, робимо reset і ще один форс-пуш, на цей раз повертаючи попереднє стан гілки:
git push -f origin master і git push origin + master - одне і те ж.
Якщо провернути все швидко, ніхто нічого не помітить.
Скасувати git reset --hard
Цей трюк спрацює тільки для закомміченних змін.
Буває, що пара останніх коммітов в гілці - зайві.
Ви робите git reset --hard HEAD
3. але випадково видаляєте 1 зайвий Ком.
На сервер ще нічого не запушено, зробити git pull нізвідки.
Що робити?
Відкриваємо reflog:
Ваше завдання - знайти в цьому балці той пункт, до якого ви хочете повернутися.
У нашому випадку ми хочемо скасувати останню дію, тобто повернутися до другої рядку.
Робимо хитрий reset:
Вуаля, невдалого reset --hard наче й не було.
Що ж ми зробили?
git reset --hard HEAD @ буквально означає: «Хей, гіт, покажи мені файли в тому вигляді, в якому вони були 1 дію назад».
Зверніть увагу, що під дією мається на увазі запис в рефлоге. Наприклад, якщо ви зробите git reset -i HEAD
6. в залежності від того, що ви накоїте під час рібейза, в балці може з'явитися хоч 20 нових записів.
І кожну з них можна використовувати для reset.
Замість HEAD @ можна використовувати більш хитромудрі вказівки, наприклад:
Скасувати git rebase -i
За тим же принципом можна скасувати і недавній rebase:
Шукаємо Комміт перед чекаутом і відкатуємося: