Команды Git

git diff

git diff: показать различия (англ. diffразница, сокращение от difference) между коммитами, ветками, файлами или рабочим деревом.

Команда git diff используется для отображения разницы между различными состояниями репозитория Git. Например, между рабочим деревом и областью подготовки или между двумя коммитами. Она помогает увидеть, какие именно изменения были внесены, что бывает полезно перед коммитом или при изучении истории проекта.

По умолчанию git diff показывает разницу между рабочим деревом и областью подготовки. Это позволяет увидеть изменения, которые ещё не были подготовлены для коммита. Также git diff можно использовать для сравнения конкретных файлов, веток или коммитов.

Команда git diff особенно полезна, когда нужно:

  • Проверить свои изменения перед добавлением в область подготовки или коммитом.
  • Сравнить разные версии проекта, чтобы увидеть, как он развивался со временем.
  • Найти конкретные строки кода, изменённые в определённом коммите.
  • Разобраться в различиях между ветками перед их слиянием.

Когда вывод git diff не помещается на одном экране, терминал переходит в режим пейджера (pager), который предназначен для просмотра длинных списков. В этом режиме можно прокручивать вывод с помощью клавиш и на клавиатуре (или PageUp и PageDown для быстрой прокрутки). Чтобы выйти из режима пейджера, нажми q.

Примеры

Показать все неподготовленные изменения в рабочем дереве:

git diff

Показать все подготовленные изменения (то есть изменения, готовые к коммиту):

git diff --staged

Показать разницу между двумя коммитами:

git diff 1234abc 5678def

Показать разницу между двумя ветками:

git diff main feature-branch

Показать изменения в конкретном файле между двумя ветками. Обрати внимание, что специальный флаг -- используется для того, чтобы подсказать Git, что все последующие аргументы — это пути к файлам. Это необходимо, чтобы избежать путаницы, если путь к файлу совпадает с названием ветки или коммита:

git diff main feature-branch -- path/to/file.js

Как читать вывод

Представь: файл index.html был изменён — добавлены новые теги и изменён существующий. Вот как может выглядеть вывод команды git diff в этом случае:

Результат:
diff --git a/index.html b/index.html
index 1c2s3z5..4f5g6h7 100644
--- a/index.html
+++ b/index.html
@@ -8,1 +8,3 @@
-<h1>Old header</h1>
+<h2>New header</h2>
+
+<p>New text.</p>

Такой формат вывода называется патчем (англ. patchзаплатка), и он предназначен для того, чтобы показывать изменения в файле. По иронии судьбы, хотя вывод и создавался для чтения человеком, дизайн разрабатывался в 1970-х годах, поэтому он может показаться не таким интуитивно понятным, как современные интерфейсы. Хотя на первый взгляд всё выглядит немного загадочно, здесь есть своя логика. Вот как это читать:

  • Первая строка говорит о том, что diff сравнивает две версии файла index.html.
  • Вторая строка показывает внутренние метаданные Git. Это не так важно для понимания изменений в файле.
  • Строки --- и +++ вместе с путями к файлам показывают, к чему относятся строки - и + соответственно.
  • Строка @@ показывает номера строк для изменений в старой и новой версиях файла.
  • Строки, начинающиеся с -, были удалены в новой версии.
  • Строки, начинающиеся с +, были добавлены в новой версии.
  • Неизменённые строки показываются для контекста, но у них нет префикса.

Этот вывод говорит нам следующее:

  • Файл index.html изменился, на что указывают пути в первых строках.
  • Строка <h1>Old header</h1> была удалена.
  • Она заменена на новую строку <h2>New header</h2>.
  • В конец добавлен новый блок <p>New text.</p>, на что указывает строка, начинающаяся с +.

В таком патч-файле может быть несколько изменений для одного файла, разделённых строками @@. Он также может включать в себя изменения для нескольких файлов сразу.