В управлении версиями различия между двумя версиями представлены в том, что называется «diff» (или, как синоним, «патч»). Давайте подробно рассмотрим такую разность и научимся ее читать.
Посмотрите на вывод diff. На основе этого вывода мы будем понимать вывод git diff.

Сравненные файлы a / b
Наш diff сравнивает два элемента друг с другом: элемент A и элемент B. В большинстве случаев A и B будут одним и тем же файлом, но в разных версиях. Хотя не очень часто, diff может также сравнить два совершенно не связанных между собой файла, чтобы показать, как они отличаются.
Чтобы понять, что на самом деле сравнивается, вывод diff всегда начинается с объявления, какие файлы представлены буквами «A» и «B».
Метаданные файла
Метаданные файла, показанные здесь, являются очень технической информацией, которая вам, вероятно, никогда не понадобится на практике. Первые два числа представляют хэши (или, проще говоря: «идентификаторы») наших двух файлов: Git сохраняет каждую версию не только проекта, но и каждого файла как объект. Такой хеш идентифицирует объект файла в определенной ревизии. Последнее число является внутренним идентификатором режима файла (100644 - это просто «обычный файл», в то время как 100755 указывает на исполняемый файл, а 120000 - на символическую ссылку).
Маркеры для а / б
Далее в выходных данных фактические изменения будут отмечены как поступающие от A или B. Чтобы отделить их друг от друга, каждому A и B назначается символ: для версии A это минус ("-" ), а для версии B используется знак плюс ("+").
Кусок
Дифференциал не показывает полный файл от начала до конца: вы не хотели бы видеть все в файле с 10 000 строк, когда изменились только 2 строки. Вместо этого он показывает только те части, которые были фактически изменены. Такая часть называется «кусок» (или «кусок»). В дополнение к фактически измененным строкам в чанке также есть немного «контекста»: некоторые (неизменные) строки до и после модификации, чтобы вы могли лучше понять, в каком контексте произошло это изменение.
Заголовок блока
Каждому из этих кусков предшествует заголовок, заключенный между двумя @@
маркерами. Git использует заголовок, чтобы сказать вам, какие строки были затронуты. В нашем случае следующие строки представлены в первом фрагменте:
Из файла A (обозначенного «-») извлекается 6 строк, начиная с строки №. 34
Из файла B (обозначенного «+») отображаются 8 строк, также начиная со строки №. 34
Текст после закрывающей пары «@@» направлен на пояснение контекста, опять же: Git пытается отобразить имя метода или другую контекстную информацию о том, откуда этот фрагмент был взят в файле. Однако это сильно зависит от языка программирования и работает не во всех сценариях.
Изменения
К каждой измененной строке добавляется символ «+» или «-». Как уже было объяснено, эти символы помогают понять, как именно выглядят версии A и B: строка, начинающаяся со знака «-», идет от A, а строка со знаком «+» - от B.
В большинстве случаев Git выбирает A и B таким образом, что вы можете рассматривать A / - как "старый" контент, а B / + как "новый" контент.
Давайте посмотрим на наш пример:
Изменение # 1 содержит две строки с добавлением «+». Поскольку для этих строк не было аналога в A (нет строк с "-"), это означает, что эти строки были добавлены.
Изменение № 2 как раз наоборот: в A у нас есть две строки, отмеченные знаком "-". Однако B не имеет эквивалента (без «+» строк), что означает, что они были удалены.
В изменении # 3, наконец, некоторые строки были фактически изменены: две строки "-" были изменены, чтобы выглядеть как две строки "+" ниже.
Источник