Resetting, checking out & reverting
git reset, git checkout, і git revert commands є деякі з найбільш useful tools в вашому Git toolbox. Вони всі роки ви не можете бачити, як змінити свою репозиторію, і перші дві команди можуть бути використані для керування її комісіями або окремими файлами.
Оскільки команди дуже схожі, легко заплутатися, яку їх використовувати у конкретному сценарії розробки. У цій статті ми порівняємо найпоширеніші конфігурації команд git reset, git checkout та git revert. Сподіваємося, що ви навчитеся впевнено переміщатися репозиторієм за допомогою будь-якої з них.
Це допомагає думати про будь-який command в термінах їхнього ефекту на трьох державних менеджменту механізмів гітарної реpository: робочої літератури, проміжок snapshot, і комісія історії. Ці компоненти є деякимивідомими як "Три stromи" з Git. We explore the three trees in depth on the git reset page. Keep these mechanisms in mind as you read this article.
Перемикання версій (команда checkout) переміщує покажчик HEAD на вказаний коміт. Покажемо це на прикладі.
Пов'язані матеріали
Переміщення повного репозиторію Git
СМ. РІШЕННЯ
Вивчіть Git за допомогою Bitbucket Cloud
У цьому прикладі показано послідовність коммітів у гілці main. Тепер і вказівник HEAD, і вказівник на головну гілку main вказують на коміт d. Тепер давайте виконаємо команду git checkout b
Це оновлення дерева "історії коммітів". Команду git checkout можна використовувати лише на рівні комміта чи файла. При перемиканні на рівні файлу його вміст відображатиме стан за конкретного коміту.
Операція скасування (команда revert) приймає як аргумент комміт і створює новий коміт, зміни у якому протилежні зазначеному. git revert діє лише на рівні комміту та не працює на рівні файлів.
Операція скидання (команда reset) приймає як аргумент коміт і скидає «три дерева» до стану репозиторію при зазначеному коміті. Її можна виконати у трьох різних режимах, що відповідають трьом деревам.
Команди checkout і reset зазвичай використовуються для локальних або приватних скасування. Ці команди змінюють історію репозиторію, що може викликати конфлікти під час відправлення у віддалені загальні репозиторії. Команда revert вважається безпечною операцією для публічних скасування, оскільки додає до історії нові дані, якими можна ділитися віддалено, а не перезаписує старі, від яких можуть залежати учасники команди.
Git reset vs revert vs checkout reference
У таблиці нижче наведено найпоширеніші сценарії використання всіх цих команд. Обов'язково тримайте її під рукою для довідки, оскільки вам, поза сумнівом, доведеться використовувати хоча б деякі з цих сценаріїв під час роботи з 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 створює новий коміт, який автоматично скасовує зміни, внесені до обраного коміту. Цей новий коміт, який називають зворотним коммітом, містить зміни, спрямовані на скасування ефектів обраного комміту. Таким чином, ви можете виправити помилки, внесені в минулі комміти, не торкаючись історії репозиторію.
Наприклад, якщо відомо, що останній коміт вніс у програму збій і його потрібно прибрати, достатньо виконати таку команду:
У процесі виконання команди відкриється редактор, у якому можна буде редагувати опис нового коміту.
Відкотити певний комміт чи серію коммітів
Якщо коміт, який потребує відкату, не останній, досить просто вказати в команді його хеш, наприклад:
Якщо потрібно навернути (зробити 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 - Це безпечний і простий спосіб повернення репозиторію до попереднього стану. оскільки історія не змінюється, а доповнюється, що дозволяє робити виправлення раніше опублікованих комітів.