Tony ganch

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:

Шукаємо Комміт перед чекаутом і відкатуємося: