4. Скасування небажаних змін

Порівнюємо робоче дерево з репозиторієм

Уяви: робота над hello.html у розпалі, аж раптом по клавіатурі пробігає бешкетний кіт і додає у файл купу нісенітниць. Замість охайного Hello, World! — сторінка, заповнена котячою абракадаброю.

Гаразд, ще раз: уяви себе котом, який намагається заснути на клавіатурі. Відкрий hello.html і понатискай випадкові клавіші, щоб зробити кілька змін (як розгребти цей безлад — побачимо за мить).

Після котячого втручання перевірмо, чи щось змінилося. git status — головна команда для таких перевірок: вона показує поточний стан робочого дерева й репозиторію.

Завдання
Виконано

Запусти команду git status, щоб перевірити стан репозиторію.

З виводу команди git status видно, що файл hello.html змінено:

Результат:

On branch main Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git restore <file>..." to discard changes in working directory) modified: hello.html

no changes added to commit (use "git add" and/or "git commit -a")

З'ясуймо, що саме змінилося. Можна, звісно, відкрити файл і шукати котячий «внесок» очима, але це не дуже ефективно. А якщо файл великий або кіт був особливо продуктивним?

І що робити?

На допомогу приходить команда

: вона показує, які рядки в робочому дереві відрізняються від версії в репозиторії. За замовчуванням порівняння йде з вмістом області підготовки (а туди після останнього коміту нічого нового не потрапляло, тож фактично ми порівнюємо з останнім комітом).

Виконай у терміналі:
git diff
Завдання
Виконано

Перевір різницю між робочим деревом і репозиторієм.

Порада: Коли вивід git diff не вміщується на одному екрані, Git може відкрити його в pager — режимі прокручування для довгого виводу. Гортати можна стрілками і . Щоб вийти, натисни q.

Має з'явитися щось таке:

Результат:
diff --git a/hello.html b/hello.html
index 8ab686e..95f1408 100644
--- a/hello.html
+++ b/hello.html
@@ -1 +1 @@
-Hello, World!
\ No newline at end of file
+Hello, Meow! World! Meow! Meow! Meow!
\ No newline at end of file
Ого! Що це таке?

Такий формат виводу зазвичай називають патчем (patch), і його завдання — розповісти, що змінилося у файлі. За іронією, цей формат задумувався як зручний для людини. Щоправда, задумувався ще в 1970-х, тож до інтуїтивності сучасних інтерфейсів йому далеко. Хай там як, за трохи загадковим виглядом ховається чітка логіка. Ось як читати цей вивід:

  • Перший рядок повідомляє, що diff порівнює дві версії файла hello.html.
  • Другий рядок показує внутрішні метадані Git. Для розуміння змін у файлі вони не важливі.
  • Рядки --- і +++ зі шляхами до файлів показують, до яких файлів належать рядки з - та +.
  • Рядок із @@ показує номери рядків зі змінами у старій і новій версіях файла.
  • Рядки з префіксом - видалено в новій версії.
  • Рядки з префіксом + додано в новій версії.
  • Незмінені рядки показано для контексту — вони без префікса.

Цей вивід повідомляє:

  • Файл hello.html змінився — про це кажуть перші кілька рядків.
  • Рядок Hello, World! видалено.
  • Замість нього з'явився Hello, Meow! World! Meow! Meow! Meow!
Гаразд, і що нам із цього?

Це явний слід котячого «внеску». З git diff можна переглядати зміни рядок за рядком — так набагато легше помітити випадкові правки. А коли є чітка картина того, що змінилося, можна вирішувати: залишити зміни, викинути їх чи доопрацювати.

Команда git diff приймає різні аргументи для порівняння різних речей. Наприклад, git diff HEAD порівнює робоче дерево з останнім комітом поточної гілки, а git diff 4620193 example.html порівняє файл example.html у робочому дереві з версією з коміту 4620193.

На наступному кроці ми позбудемося котячої абракадабри й повернемо оригінальний Hello, World! за допомогою ще однієї корисної команди Git.

Next step
Хочеш спробувати Сюжетний режим?

Проходь курс так, як він і задуманий: маленькими порціями, у сфокусованому лінійному порядку, поступово відкриваючи статті Gitopedia. Будь-коли можна продовжити зі справжнім Git у VS Code/Cursor/Antigravity/Windsurf.

Сюжетний режим
БЕЗКОШТОВНО
але потрібен вхід