Головна сторінка / Блог / Git / Як можна відкотити зміни до останнього коміту

Як можна відкотити зміни до останнього коміту

Необхідність відкотити зміни до певного комміту виникає досить часто. Git надає широкий набір інструментів для усунення помилок, що виникають у процесі роботи. Все залежить від того, до якої точки історії ви хочете повернутися. Залежно від ваших цілей вам може стати в нагоді команда git reset або git-revert, Про них поговоримо нижче.

Відкотити додані зміни аж до останнього комміту

У ході роботи з Git нерідко виникають ситуації, коли необхідно скасувати всі зміни та повернути робочий каталог до стану останнього комміту. Для цього завдання використовується команда git reset --hard HEAD. Розгляньмо, як ця команда працює і в яких випадках її застосування виправдане.

git reset --hard HEAD

Після виконання цієї команди, Git скидає стан робочого каталогу та індексу, наводячи їх у точний стан останнього комміта в поточній гілці. Це означає, що всі невідсліджені чи незакоммічені зміни будуть безповоротно видалені, а робочий каталог точно відповідатиме останньому комміту.

Коли застосовувати?

У разі скасування експериментів. Якщо ви внесли серію змін, але вирішили, що хочете почати з чистого аркуша і повернутись до первісного стану, команда git reset --hard HEAD допоможе швидко та безпечно повернутися до останнього коміту.

У разі виправлення помилок. У випадку, якщо ви зробили помилкові зміни та хочете скасувати їх, ця команда дозволить повернути робочий каталог до стану останнього комміту та почати заново.

Важливо!

Слід пам'ятати, що застосування цієї команди бездумно може призвести до втрати важливих змін. Тому, перш ніж використовувати git reset --hard HEAD, переконайтеся, що ви готові втратити всі незбережені зміни.

Відкотити останній коміт

Якщо ж проблемний коміт був опублікований у віддаленому репозиторії, просто видаляти його небезпечно, адже ваші колеги могли додати свої зміни поверх нього у своїх локальних репозиторіях. У цьому випадку безпечнішим варіантом буде створення нового комміту зі зворотними змінами. Тобто якщо ми в проблемному коміті надали змінній test значення два, яке раніше дорівнювало одиниці, то в новому коміті ми присвоюємо змінній старе значення — одиницю. Так, за фактом, код залишився незмінним, насправді за цим кодом стоїть серія змін, яку можна переглянути в історії комітів. Сама історія в цьому випадку нас не цікавить, головне, що проблемні зміни були “відкочені”.

Для реалізації описаного вище задуму застосовується команда git-revert. Ще раз, при використанні git-revert, Git створює новий коміт, який автоматично скасовує зміни, внесені до обраного коміту. Цей новий коміт, який називають зворотним коммітом, містить зміни, спрямовані на скасування ефектів обраного комміту. Таким чином, ви можете виправити помилки, внесені в минулі коміти, не зачіпаючи історії репозиторію.

Наприклад, якщо відомо, що останній коміт вніс у програму збій і його треба прибрати, достатньо виконати таку команду:

git revert HEAD

У процесі виконання команди відкриється редактор, у якому можна буде редагувати опис нового коміту. 

Відкотити певний комміт чи серію коммітів

Якщо коміт, який потребує відкату, не останній, достатньо вказати в команді його хеш, наприклад:

git revert 0dd263

Якщо потрібно обернути (зробити revert) кілька коммітів, можна вказати GIT проміжок історії, наприклад:

git revert 0dd263..HEAD

У процесі виконання цієї команди будуть зроблені зворотні комміти, починаючи з комміту 0dd263, не включаючи його до крайнього (на який вказує) HEAD). Наприклад, якщо в цей проміжок потрапило два коміти, буде зроблено два зворотні коміти, які по черзі скасовують зміни кожного з вихідних. Як і в попередніх випадках, для кожного з комітів буде відкрито редактор, в якому можна буде змінити текст комміту (commit message).

Команда git revert має набір опцій, що розширюють її можливості, наприклад -no-commit або якщо коротко, то -n. Ця опція зупиняє GIT на етапі додавання зміни до індексу, після чого автор може зробити коміт самостійно. Це може бути корисним у разі, якщо робиться revert кількох коммітів і хочемо помістити весь фікс в один зворотний комміт, а не в кілька. Тобто переписавши попередній приклад в такий спосіб, буде створено один зворотний коміт, а не 2:

git revert --no-commit 0dd263..HEAD
git commit -m "revert last 2 features"

З іншими опціями цієї команди ви можете ознайомитись на цій сторінці документації. Команда git revert - Це безпечний і простий спосіб повернення репозиторію до попереднього стану. оскільки історія не змінюється, а доповнюється, що дозволяє робити виправлення раніше опублікованих комітів.

Ukrainian
Перейдіть до верхньої частини