Що таке reset hard і як правильно з цим працювати?
Система управління версіями (СУВ) відіграє ключову роль у розробці ПЗ, даючи змогу розробникам відслідковувати зміни в коді, вносити виправлення та керувати версіями проєкту. Серед безлічі інструментів для керування версіями одним із найпопулярніших і найпотужніших є Git.
Її головна перевага полягає в можливості ефективно працювати з проектами будь-якого розміру та складності. Git дає змогу розробникам працювати з віддаленими сховищами, розгалуженнями коду, керувати змінами та об’єднувати їх.
Деякі з найбільш часто використовуваних команд включають:
- git init: створює новий репозиторій Git у поточному каталозі.
- git clone: клонує наявний репозиторій Git на локальну машину.
- git add: додає змінені або нові файли в індекс (stage area) для подальшого коміту.
- git commit: створює новий коміт, що фіксує поточний стан індексу.
- git push: надсилає коміти з локального сховища у віддалений репозиторій.
- git pull: витягує зміни з віддаленого репозиторію та об’єднує їх із поточною гілкою.
- git branch: дає змогу створювати, перемикатися і видаляти гілки в репозиторії.
Сьогодні з компанією FoxmindED ми розглянемо, що за команда така git reset, і конкретно – вплив її опції –hard…
Розуміння Git Revert
Коли в розробці ПЗ виникає необхідність скасувати зміни, внесені в певний коміт, команда git revert може бути ідеальним інструментом. Оскільки на відміну від інших, які змінюють історію комітів, вона створює новий, який і скасовує зміни, внесені в зазначений коміт. Це дозволяє зберегти цілісність історії комітів і уникнути втрати даних.
Наприклад:
- Припустимо, у нас є три коміти в історії:
Commit A -> Commit B -> Commit C
Тут тільки 100% практики під керівництвом досвідчених менторів.
- Якщо нам потрібно скасувати зміни, внесені в коміт B, ми можемо виконати:
git revert <ідентифікатор коміту B>
- Це створить новий коміт, який скасовує зміни, внесені в коміт B:
Commit A -> Commit B -> Commit C -> Commit D (скасування змін із коміту B)
Таким чином, історія комітів залишається чистою, і зміни повертаються без видалення або зміни історії.
Принципи роботи Git Reset
Команда git reset в Git дає змогу змінювати стан індексу (stage area) і робочого каталогу. Цей інструмент використовується для скасування змін, переміщення покажчика HEAD і управління історією комітів. Різні опції команди дають різні рівні контролю над змінами:
- git reset –soft: опція скидає HEAD на вказаний коміт, але залишає індекс і робочий каталог без змін. Це означає, що всі зміни, зроблені після обраного коміту, залишаються в індексі, готові до коміту. Це корисно, якщо ви хочете переписати повідомлення коміту або додати додаткові зміни до попереднього.
- git reset –mixed: скидає HEAD на вказаний коміт і оновлює індекс, але не чіпає робочий каталог. Це означає, що зміни, зроблені після обраного коміту, залишаються в робочому каталозі, але не відстежуються для наступного. Це корисно, якщо ви хочете переглянути свої зміни перед наступним комітом.
- git reset –hard: опція скидає HEAD на вказаний коміт і повністю видаляє зміни з індексу та робочого каталогу, повертаючи їх до стану вказаного коміту. Усі непроіндексовані зміни будуть втрачені без можливості відновлення. Це вкрай руйнівна операція, яку слід використовувати з обережністю.
Застосування Git Revert на практиці
Розглянемо покроково, як використовувати git revert і поради щодо його використання в різних сценаріях розробки:
курси Junior саме для вас.
Крок 1: Визначення коміта для скасування змін
- Використовуйте команду git log, щоб переглянути історію комітів і знайти той, зміни якого потрібно скасувати.
- Запам’ятайте його ідентифікатор (SHA-1 хеш).
Крок 2: Застосування git revert
Запустіть команду із зазначенням ідентифікатора цільового коміту.
git revert <ідентифікатор коміту>
Git створить новий коміт, що скасовує зміни, внесені в зазначений коміт, і автоматично відкриє текстовий редактор для введення коментаря. Введіть його і збережіть файл.
Шаг 3: Вирішення конфліктів
Якщо в процесі застосування команди виникли конфлікти, розв’яжіть їх вручну, редагуючи конфліктні файли.
Після вирішення конфліктів додайте зміни до індексу за допомогою git add і завершіть операцію за допомогою git revert –continue.
Поради та найкращі практики:
- Після застосування команди переконайтеся, що ваш проєкт працює коректно. Проведіть тестування, щоб бути впевненим у тому, що скасування змін не призвело до появи нових помилок.
- Завжди додавайте інформативні коментарі до коммітів під час використання команди, так інші члени команди зможуть зрозуміти, які зміни було скасовано і чому.
- Якщо ви скасовуєте коміт, який уже було скасовано за допомогою гіт реверт, може виникнути рекурсивний ланцюжок відкату. Це може призвести до несподіваних результатів і складнощів в управлінні змінами. У таких випадках рекомендується використовувати гіт резет або інші відповідні інструменти.
Глибоке занурення в Git Reset
Розглянемо докладні інструкції з використання git reset для скасування комітів і змін у локальній копії сховища, а також приклади, що демонструють вплив різних рівнів скидання на історію комітів і робочий каталог:
Крок 1: Визначення коміту для скидання
Відкрийте термінал і перейдіть у локальну копію вашого сховища.
Використовуйте команду git log, щоб переглянути історію комітів і знайти ідентифікатор (SHA-1 хеш) того, на який ви хочете виконати скидання.
Крок 2: Застосування git reset
- git reset –soft: опція скине HEAD на вказаний коміт, але збереже зміни в індексі та робочому каталозі. Для використання виконайте:
git reset –soft <ідентифікатор коміта>
- git reset –mixed: за замовчуванням, якщо опція не вказана явно, використовується –mixed. Вона скидає HEAD на вказаний коміт і оновлює індекс, але не чіпає робочий каталог:
git reset –mixed <ідентифікатор коміта>
- git reset –hard: опція повністю скине HEAD, індекс і робочий каталог на вказаний коміт, видаляючи всі зміни, зроблені після нього:
git reset –hard <ідентифікатор коміта>
Приклади:
Припустимо, що в нас є три коміти в історії: Commit A, Commit B і Commit C. Якщо ми хочемо скинутися на Commit B і зберегти зміни в робочому каталозі, виконаємо:
git reset –soft <ідентифікатор Commit B>
Якщо ж ми хочемо повністю скасувати всі зміни, включно зі змінами в робочому каталозі, після Commit B, то виконаємо:
git reset –hard <ідентифікатор Commit B>
З використанням команди ви можете точно керувати станом вашого сховища, скасовуючи коміти та зміни на ваш розсуд. Однак, будьте обережні, оскільки git reset –hard може призвести до втрати даних, які не були зафіксовані в коміт.
Скасування змін
Скасування змін у Git може бути виконано двома основними способами: за допомогою команди git revert і git reset. Обидві команди надають різні підходи і мають свої сценарії використання:
git revert | git reset | |
Підхід | Створює новий коміт для скасування змін, зберігаючи історію | Скидає стан до певного коміту |
Переваги | – Підходить для скасування змін у загальнодоступній історії – Зберігає цілісність історії комітів | – Дає змогу виконати глибші зміни – Корисний для зміни стану репозиторію – Корисний для початку роботи заново |
Недоліки | – Може створити додаткові коміти | – Може призвести до втрати даних – Особливо git reset –hard |
Сценарії використання | – Скасування змін у загальнодоступній історії | – Більш радикальні зміни – Видалення комітів – Зміна стану репозиторію до певної точки |
Відновлення після скидання змін
Ми вже зрозуміли, що використання git reset –hard може призвести до втрати змін, які не були закоммічені (тобто не були зафіксовані в історії комітів). Однак існує спосіб знайти та відновити втрачені коміти за допомогою команди git reflog, яка відстежує історію переміщення покажчиків у репозиторії.
- Відновлення змінених файлів:
- Якщо ви ще не закрили редактор тексту, в якому ви працювали, зміни можуть бути збережені в буфері обміну.
- Якщо ви вже закрили редактор тексту, ви можете спробувати відновити файли з резервної копії.
- Відновлення втрачених комітів:
- git reflog: показує список усіх комітів, включно з тими, які були видалені.
- git checkout : відновлює вказаний коміт.git checkout <commit-hash>: відновлює вказаний коміт.
Приклад:
git reflog
git checkout HEAD@{1}
Оптимізація роботи
Як оптимізувати роботу з Git для управління змінами?
- Вибір між git revert та git reset
git revert:
- Переважно для скасування змін у публічній історії проєкту.
- Безпечне скасування змін.
- Зберігає історію чистою і читабельною.
git reset:
- Переважно для скасування змін у локальній історії проєкту.
- Швидке скасування змін.
- Може бути небезпечно, якщо використовувати –hard.
- Стратегії управління історією комітів
- Використовуйте описові повідомлення про коміти.
- Робіть невеликі атомарні коміти.
- Використовуйте git rebase для очищення історії комітів.
- Використовуйте git merge –no-ff для створення злиття комітів.
- Використовуйте гілки для ізоляції нових функцій, виправлень помилок та експериментальних змін. Це дасть вам змогу проводити роботи над різними фрагментами коду паралельно та безпечно.
- Позначайте стабільні версії вашого проєкту за допомогою релізних тегів. Це дає змогу легко повернутися до певної версії проєкту в майбутньому та відстежувати зміни між релізами.
- Рекомендації
- Вивчіть основи Git і рекомендовані практики.
- Практикуйтеся у використанні Git у тестовому репозиторії.
- Використовуйте графічний інтерфейс Git для спрощення роботи.
Висновок
У цій статті ми розглянули дві важливі команди – git revert і git reset, які відіграють ключову роль в управлінні змінами та версіями коду. Розуміння та вміння правильно застосовувати ці команди допомагає розробникам ефективно керувати проєктами та підтримувати цілісність історії змін.
Рекомендуємо активно вивчати просунуті можливості Git, щоб стати ефективнішим розробником і краще керувати версіями коду.
Ви розібралися, що робить команда git reset --hard? Поділіться досвідом у коментарях нижче! 👇