Как считать вывод из разности мерзавца?

Страница справочника для git-diff довольно длинно, и объясняет много случаев, которые, кажется, не необходимы для новичка. Например:

git diff origin/master
252
задан user3207158 31 August 2016 в 19:06
поделиться

4 ответа

Давайте посмотрим на пример расширенных различий из истории 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% (что было использовано для обнаружения этого переименования).

    Последняя строка в расширенном заголовке diff, которая является
     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 сказал , лучше всего практиковаться в чтении различий на реальных примерах, где вы знаете, что вы изменили.

] Ссылки:

464
ответ дан 23 November 2019 в 02:52
поделиться

Из вашего вопроса неясно, какая часть различий вас сбивает с толку: собственно различие или дополнительная информация заголовка, которую печатает 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 ). Он разделен на фрагменты - фрагмент - это раздел файла, содержащий изменения и их контекст. Каждому фрагменту предшествует пара строк --- и +++ , обозначающих рассматриваемый файл, тогда фактическое отличие (по умолчанию) составляет три строки контекста с каждой стороны. строк - и + , показывающих удаленные / добавленные строки.

3
ответ дан 23 November 2019 в 02:52
поделиться

Формат вывода по умолчанию (который изначально взят из программы, известной как diff , если вы хотите найти дополнительную информацию) известен как «унифицированный дифференциал». Он содержит по существу 4 различных типа строк:

  • контекстные строки, которые начинаются с одного пробела,
  • строки вставки, которые показывают вставленную строку, которые начинаются с + ,
  • , которые начинаются со строк метаданных - и
  • , которые описывают вещи более высокого уровня, например, о каком файле идет речь, какие параметры использовались для генерации различий, изменил ли файл свои разрешения и т.д.

Я советую вам попрактиковаться в чтении различий между двумя версиями файла, где вы точно знаете, что вы изменили. Таким образом, вы узнаете, что происходит, когда вы это увидите.

14
ответ дан 23 November 2019 в 02:52
поделиться

На моем 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}} Здесь к первому файлу была добавлена ​​строка.

`- ' Здесь была удалена строка из первого файла.

6
ответ дан 23 November 2019 в 02:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: