Скасування комітів у Git: розбори reset, revert і rebase

Скасування комітів у Git: розбори reset, revert і rebase – ITEDU Blog

Перш ніж застосовувати складні команди скасування, дайте відповідь на запитання: вам справді потрібно видаляти коміт у 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.

  1. Запустіть інтерактивний ребейз для потрібної кількості останніх комітів (наприклад, N останніх комітів):
git rebase -i HEAD~N
  1. У текстовому редакторі, що відкриється, ви побачите список комітів.
  2. Знайдіть рядок із комітом, який потрібно видалити, і замініть слово pick на drop.
  3. Збережіть і закрийте редактор.

Підсумок: що і коли обрати?

  • Потрібно швидко підправити останній локальний коміт? → git commitamend
  • Хочете скасувати останні локальні коміти (ще не відправлені на сервер)? → git reset (--soft, --mixed або --hard)
  • Потрібно скасувати коміт, який уже завантажено у спільну гілку? → git revert
  • Треба вирізати конкретний коміт із середини історії локальної гілки? → git rebase -i

Залишити відповідь

Дякуємо, що поділились