Перш ніж застосовувати складні команди скасування, дайте відповідь на запитання: вам справді потрібно видаляти коміт у Git, чи ви просто забули щось додати?
Якщо ви щойно зробили коміт, але забули внести правку або допустили друкарську помилку в повідомленні, скористайтеся прапорцем --amend:
git commit --amend
Ця команда дозволяє змінити останній коміт, додавши до нього нові деталі або змінивши його назву, без створення зайвих сутностей в історії.
Якщо коміт все ж потрібно видалити — гортайте нижче.
Як скасувати останній локальний комміт у Git
Якщо ви створили коміт локально на своєму комп’ютері й ще не відправляли його у віддалений репозиторій, найкращим вибором буде команда git reset.
Вона повертає стан вашої поточної гілки на один або кілька комітів назад.
1. Зберегти зміни підготовленими до коміту
Якщо ви хочете скасувати сам коміт, але залишити всі внесені зміни у зоні підготовки:
git reset --soft HEAD~1
Git відкочує історію на 1 коміт назад (HEAD~1), але ваші зміни залишаються відміченими. Ви можете відредагувати код і зробити новий коміт.
2. Залишити зміни в робочій папці
Якщо ви хочете скасувати коміт і скинути статус підготовки змін, але залишити сам код у файлах:
git reset HEAD~1
Зміни залишаться у вашому проєкті, але матимуть статус непідготовлених.
3. Повністю видалити зміни
Якщо коміт був повністю помилковим і ви хочете безповоротно видалити і сам коміт, і всі внесені зміни в коді:
git reset --hard HEAD~1
Важливо: Режим --hard видаляє всі зміни без можливості відновлення! Переконайтеся, що цей код вам точно більше не потрібен.
Повернення до будь-якого давнього коміту
За допомогою git reset можна відкотитися не лише на один крок, а й до будь-якого конкретного коміту в минулому. Для цього замість HEAD~1 вкажіть хеш потрібного коміту:
git reset --hard 0ad5a7a6
Це скасує всі коміти, які були створені після вказаного хешу (0ad5a7a6).
Безпечне скасування публічних комітів
Що робити, якщо коміт уже відправлено у віддалений репозиторій і з цією гілкою працюють інші розробники?
Використовувати git reset у такому разі небезпечно, оскільки це перепише спільну історію та створить конфлікти у вашої команди.
Для вже опублікованих комітів використовують команду git revert.
Замість видалення старого коміту, git revert створює новий коміт, який вносить протилежні зміни (фактично дзеркально скасовує дію потрібного коміту).
git revert 0ad5a7a6
Корисні прапорці для git revert
--no-commit— підготовлює скасування змін, але не створює новий коміт одразу. Це зручно, якщо ви хочете перевірити результат перед фіксацією:
git revert a72ef02 --no-commit
--no-edit— пропускає крок відкриття текстового редактора для введення коментаря й використовує стандартний текст Git про скасування:
git revert a72ef02 --no-edit
Видалення точкового коміту з середини історії
Якщо потрібно вирізати один конкретний коміт із середини історії, не зачіпаючи ті, що були створені після нього, використовують інтерактивний ребейз — git rebase -i.
- Запустіть інтерактивний ребейз для потрібної кількості останніх комітів (наприклад, N останніх комітів):
git rebase -i HEAD~N
- У текстовому редакторі, що відкриється, ви побачите список комітів.
- Знайдіть рядок із комітом, який потрібно видалити, і замініть слово
pickнаdrop. - Збережіть і закрийте редактор.
Підсумок: що і коли обрати?
- Потрібно швидко підправити останній локальний коміт? →
git commit—amend - Хочете скасувати останні локальні коміти (ще не відправлені на сервер)? →
git reset(--soft,--mixedабо--hard) - Потрібно скасувати коміт, який уже завантажено у спільну гілку? →
git revert - Треба вирізати конкретний коміт із середини історії локальної гілки? →
git rebase -i

