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-команды, такие как git log, могут перевести терминал в постраничный режим просмотра, с которым удобнее смотреть на длинные списки. В этом режиме можно прокручивать вывод с помощью стрелок и на клавиатуре. Для выхода нажми q.

Важная часть должна выглядеть примерно так. Git покажет реальные хеши сравниваемых версий файла в строке index; в этом примере используются <old> и <new>:

Результат:
diff --git a/hello.html b/hello.html
index <old>..<new> 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
Хочешь попробовать Сюжетный режим?

Пройди курс так, как задумано: порционное обучение, чёткий порядок и постепенное открытие статей в Gitопедии. В любой момент можно продолжить работу с настоящим Git прямо в VS Code, Cursor, Antigravity или Windsurf.

Сюжетный режим
БЕСПЛАТНО
(требуется войти в аккаунт)