Страница справочника для git-diff
довольно длинно, и объясняет много случаев, которые, кажется, не необходимы для новичка. Например:
git diff origin/master
Давайте посмотрим на пример расширенных различий из истории git (в commit 1088261f в репозитории git.git ):
diff --git a/builtin-http-fetch.c b/http-fetch.c
similarity index 95%
rename from builtin-http-fetch.c
rename to http-fetch.c
index f3e63d7..e8f44ba 100644
--- a/builtin-http-fetch.c
+++ b/http-fetch.c
@@ -1,8 +1,9 @@
#include "cache.h"
#include "walker.h"
-int cmd_http_fetch(int argc, const char **argv, const char *prefix)
+int main(int argc, const char **argv)
{
+ const char *prefix;
struct walker *walker;
int commits_on_stdin = 0;
int commits;
@@ -18,6 +19,8 @@ int cmd_http_fetch(int argc, const char **argv, const char *prefix)
int get_verbosely = 0;
int get_recover = 0;
+ prefix = setup_git_directory();
+
git_config(git_default_config, NULL);
while (arg < argc && argv[arg][0] == '-') {
Lets анализируйте этот патч построчно.
Первая строка
diff --git a / builtin-http-fetch.cb / http-fetch.cпредставляет собой заголовок "git diff" в форме
diff --git a / файл1 б / файл2
. Имена файлов a /
и b /
одинаковы, если не используется переименование / копирование (как в нашем случае). - git
означает, что diff находится в формате diff "git". Далее идут одна или несколько расширенных строк заголовка. Первые три
индекса сходства 95% переименовать из builtin-http-fetch.c переименовать в http-fetch.cговорят нам, что файл был переименован из
builtin-http-fetch.c
- http-fetch.c
и что эти два файла идентичны на 95% (что было использовано для обнаружения этого переименования). index f3e63d7..e8f44ba 100644, сообщает нам о режиме данного файла (
100644
означает, что это обычный файл, а не, например, символическая ссылка , и что у него нет бита разрешения исполняемого файла), а также об укороченном хэше прообраза (версия файла до данного изменения) и postimage (версия файла после изменения). Эта строка используется git am --3way
, чтобы попытаться выполнить трехстороннее слияние, если патч не может быть применен сам. Далее идет двухстрочный унифицированный заголовок diff
--- a / builtin-http-fetch.c +++ b / http-fetch.cПо сравнению с
diff -U
приводит к тому, что у него нет ни времени-модификации-файла, ни времени-модификации-файла после имен исходного (прообраза) и назначения (постимейдж) файлов. Если файл был создан, его источник - / dev / null
; если файл был удален, целью является / dev / null
. diff.Для переменной конфигурации mnemonicPrefix
значение true вместо префиксов a /
и b /
в этом двухстрочном заголовке можно использовать вместо c /
, i /
, w /
и o /
в качестве префиксов, соответственно к тому, что вы сравниваете; см. git-config (1) Затем следуют одна или несколько частей различий; каждый кусок показывает одну область, в которой файлы различаются. Блоки унифицированного формата начинаются со строки вида
@@ -1,8 +1,9 @@или
@@ -18,6 +19,8 @@ int cmd_http_fetch (int argc, const char ** argv, ...Он имеет формат
@@ from-file-range to-file-range @@ [ заголовок]
. Диапазон-от-файла имеет вид - <начальная строка>, <количество строк>
, а диапазон-до-файла равен + <начальная строка>, <количество строк>
. И start-line, и number-of-lines относятся к положению и длине фрагмента в прообразе и posttimage, соответственно. Если количество строк не показано, это означает, что оно равно 0. {{ 1}}
Необязательный заголовок показывает функцию C, в которой происходит каждое изменение, если это файл C (например, параметр -p
в GNU diff) или эквивалент, если любой, для других типов файлов.
Далее следует описание того, где файлы различаются. Строки, общие для обоих файлов, начинаются с символа пробела. Строки, которые фактически различаются между двумя файлами, имеют один из следующих символов индикатора в левый столбец печати:
Так, например, первый фрагмент
#include "cache.h"
#include "walker.h"
- int cmd_http_fetch (int argc, const char ** argv, const char * prefix)
+ int main (int argc, const char ** argv)
{
+ const char * prefix;
) struct walker * walker;
int commits_on_stdin = 0;
int commits;
означает, что cmd_http_fetch
был заменен на main
, и что была добавлена строка const char *;
.
Другими словами, до изменения соответствующий фрагмент файла 'builtin-http-fetch.c' выглядел так:
#include "cache.h"
# include "walker.h "
int cmd_http_fetch (int argc, const char ** argv, const char * prefix)
{
struct walker * walker;
int commits_on_stdin = 0;
int commits;
После изменения этот фрагмент файла http-fetch.c теперь выглядит следующим образом:
#include "cache.h "
# include" walker.h "
int main (int argc, const char ** argv)
{
const char * prefix ;
struct walker * walker;
int commits_on_stdin = 0;
int commits;
Может быть
\ Нет новой строки в конце файлаприсутствует строка (ее нет в примере diff).
Как Donal Fellows сказал , лучше всего практиковаться в чтении различий на реальных примерах, где вы знаете, что вы изменили.
] Ссылки:
Из вашего вопроса неясно, какая часть различий вас сбивает с толку: собственно различие или дополнительная информация заголовка, которую печатает git. На всякий случай вот краткий обзор шапки.
Первая строка выглядит примерно так: diff --git a / path / to / file b / path / to / file
- очевидно, она просто сообщает вам, для какого файла предназначен этот раздел diff. Если вы установите логическую переменную конфигурации diff.mnemonic prefix
, a
и b
будут заменены на более описательные буквы, такие как c
и w
(дерево фиксации и работы).
Далее идут «строки режима» - строки с описанием любых изменений, не связанных с изменением содержимого файла. Сюда входят новые / удаленные файлы, переименованные / скопированные файлы и изменения разрешений.
Наконец, есть строка типа index 789bd4..0afb621 100644
. Вы, вероятно, никогда об этом не позаботитесь, но эти шестизначные шестнадцатеричные числа представляют собой сокращенные хэши SHA1 старых и новых блобов для этого файла (большой двоичный объект - это объект git, хранящий необработанные данные, такие как содержимое файла).И, конечно же, 100644
- это режим файла - последние три цифры, очевидно, являются разрешениями; первые три предоставляют дополнительную информацию о метаданных файла ( сообщение SO, описывающее это ).
После этого вы перейдете к стандартному унифицированному выводу diff (точно так же, как классический diff -U
). Он разделен на фрагменты - фрагмент - это раздел файла, содержащий изменения и их контекст. Каждому фрагменту предшествует пара строк ---
и +++
, обозначающих рассматриваемый файл, тогда фактическое отличие (по умолчанию) составляет три строки контекста с каждой стороны. строк -
и +
, показывающих удаленные / добавленные строки.
Формат вывода по умолчанию (который изначально взят из программы, известной как diff
, если вы хотите найти дополнительную информацию) известен как «унифицированный дифференциал». Он содержит по существу 4 различных типа строк:
+
, -
и Я советую вам попрактиковаться в чтении различий между двумя версиями файла, где вы точно знаете, что вы изменили. Таким образом, вы узнаете, что происходит, когда вы это увидите.
На моем Mac:
info diff
затем выберите: Форматы вывода
-> Контекст
-> Единый формат
-> Подробная унифицированная
:
или онлайн-man diff на gnu по тому же пути к тому же разделу:
Файл: diff.info, Узел: Подробно Унифицированный, Далее : Пример унифицированного, вверх: Единый формат
Подробное описание единого формата ........................ ..............
Унифицированный выходной формат начинается с двухстрочного заголовка, который выглядит следующим образом:
--- FROM-FILE FROM-FILE-MODIFICATION-TIME +++ TO-FILE TO-FILE-MODIFICATION-TIME
Отметка времени выглядит как `2002-02-21 {{1 }} 23: 30: 39.942229878 -0800 ', чтобы указать дату, время с дробными секундами и часовой пояс.
Вы можете изменить содержимое заголовка с помощью параметра --label = LABEL; см. * Примечание. Альтернативные имена ::.
Затем идет один или несколько фрагментов различий; каждый кусок показывает одну область , где файлы различаются. Блоки единого формата выглядят так:
@@ FROM-FILE-RANGE TO-FILE-RANGE @@ LINE-FROM-EITHER-FILE LINE-FROM- ЛИБО-ФАЙЛ ...
Строки, общие для обоих файлов , начинаются с символа пробела. Строки , которые на самом деле различаются в двух файлах, имеют один из следующих символов индикатора в левом столбце печати :
`+ '{{ 1}} Здесь к первому файлу была добавлена строка.
`- ' Здесь была удалена строка из первого файла.