01.10.2024 старт набору нової групи на курс Enterprise Patterns! Реєструйтеся зараз зі знижкою 30%!
Дізнатися більше
24.02.2024
10 хвилин читання

Для чого в Git використовують reset hard

Що таке 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 може бути ідеальним інструментом. Оскільки на відміну від інших, які змінюють історію комітів, вона створює новий, який і скасовує зміни, внесені в зазначений коміт. Це дозволяє зберегти цілісність історії комітів і уникнути втрати даних.

Наприклад:

  1. Припустимо, у нас є три коміти в історії:

Commit A -> Commit B -> Commit C

Курси рівня Junior призначені для розробників-початківців з базовими навичками.
Тут тільки 100% практики під керівництвом досвідчених менторів.
Обрати курс
  1. Якщо нам потрібно скасувати зміни, внесені в коміт B, ми можемо виконати:

git revert <ідентифікатор коміту B>

  1. Це створить новий коміт, який скасовує зміни, внесені в коміт 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 і поради щодо його використання в різних сценаріях розробки:

Крок 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 хеш) того, на який ви хочете виконати скидання.

Git reset

Крок 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 reset –hard може призвести до втрати змін, які не були закоммічені (тобто не були зафіксовані в історії комітів). Однак існує спосіб знайти та відновити втрачені коміти за допомогою команди git reflog, яка відстежує історію переміщення покажчиків у репозиторії.

  1. Відновлення змінених файлів:
  • Якщо ви ще не закрили редактор тексту, в якому ви працювали, зміни можуть бути збережені в буфері обміну.
  • Якщо ви вже закрили редактор тексту, ви можете спробувати відновити файли з резервної копії.
  1. Відновлення втрачених комітів:
  • git reflog: показує список усіх комітів, включно з тими, які були видалені.
  • git checkout : відновлює вказаний коміт.git checkout <commit-hash>: відновлює вказаний коміт.

Приклад:

git reflog

git checkout HEAD@{1}

Оптимізація роботи 

Як оптимізувати роботу з Git для управління змінами?

  1. Вибір між git revert та git reset

git revert:

  • Переважно для скасування змін у публічній історії проєкту.
  • Безпечне скасування змін.
  • Зберігає історію чистою і читабельною.
Підпишіться на наш Ютуб-канал! Корисні відео для програмістів чекають на вас! YouTube
Оберіть свій курс програмування! Шлях до кар’єри програміста починається тут! Подивитись

git reset:

  • Переважно для скасування змін у локальній історії проєкту.
  • Швидке скасування змін.
  • Може бути небезпечно, якщо використовувати –hard.
  1. Стратегії управління історією комітів
  • Використовуйте описові повідомлення про коміти.
  • Робіть невеликі атомарні коміти.
  • Використовуйте git rebase для очищення історії комітів.
  • Використовуйте git merge –no-ff для створення злиття комітів.
  • Використовуйте гілки для ізоляції нових функцій, виправлень помилок та експериментальних змін. Це дасть вам змогу проводити роботи над різними фрагментами коду паралельно та безпечно.
  • Позначайте стабільні версії вашого проєкту за допомогою релізних тегів. Це дає змогу легко повернутися до певної версії проєкту в майбутньому та відстежувати зміни між релізами.
  1. Рекомендації
  • Вивчіть основи Git і рекомендовані практики.
  • Практикуйтеся у використанні Git у тестовому репозиторії.
  • Використовуйте графічний інтерфейс Git для спрощення роботи.

Висновок

У цій статті ми розглянули дві важливі команди – git revert і git reset, які відіграють ключову роль в управлінні змінами та версіями коду. Розуміння та вміння правильно застосовувати ці команди допомагає розробникам ефективно керувати проєктами та підтримувати цілісність історії змін.

Рекомендуємо активно вивчати просунуті можливості Git, щоб стати ефективнішим розробником і краще керувати версіями коду.

FAQ
Що робить команда git reset --hard?

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

Як скасувати дію git reset --hard?

Скасувати дію можна, використовуючи git reflog для знаходження загубленого коміта і git reset --hard із зазначенням потрібного ідентифікатора коміта.

У чому ризик використання git reset --hard?

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

Чи може git reset --hard впливати на віддалене сховище?

Безпосередньо на віддалений репозиторій git reset --hard не впливає, але зміни можна примусово надіслати у віддалений репозиторій із використанням git push --force, що змінить історію у віддаленому репозиторії.

Коли доцільно використовувати git reset --hard?

Використовувати git reset --hard доцільно для відкату до останнього коміту, якщо внесені зміни не повинні зберігатися або були зроблені помилково.

Як відновити видалені за допомогою git reset --hard файли, якщо коміт не був зроблений?

Відновити можна через git reflog, знайшовши стан до виконання reset --hard, і виконавши git reset --hard до потрібного стану з журналу.

Ви розібралися, що робить команда git reset --hard? Поділіться досвідом у коментарях нижче! 👇

Додати коментар

Ваш імейл не буде опубліковано. Обов'язкові поля відзначені *

Зберегти моє ім'я, імейл та адресу сайту у цьому браузері для майбутніх коментарів