Осмысление git diff - PullRequest
       13

Осмысление git diff

0 голосов
/ 05 сентября 2018

В моем репозитории есть файл "file.txt", который содержит три строки:

1
2
3

Этот файл был зафиксирован. Однако, если я сейчас добавлю четвертую строку в файл, это будет выглядеть так:

1
2
3
4

Когда я вхожу в «git diff file.txt», он выдает следующий вывод:

diff --git a/file.txt b/file.txt
index 5f5fbe7..b178657 100644
--- a/file.txt
+++ b/file.txt
@@ -1,3 +1,4 @@
 1
 2
-3
\ No newline at end of file
+3
+4
\ No newline at end of file

Другими словами, в строке 1 три строки были удалены, а 4 добавлены в соответствии с git diff (@@ -1,3 +1,4 @@). Это не имеет смысла для меня, так как все, что я сделал, это добавил четвертую строку - так что я бы ожидал вывод (-0,0 +4,1)

Что здесь происходит?


Я запускаю git на Windows 7.

Ответы [ 3 ]

0 голосов
/ 05 сентября 2018

в строке 1 три строки были удалены

Нет, строки 1 и 2 не были изменены. Diff показывает некоторый контекст, несколько строк до и после изменения, чтобы его было легче понять.

Разница показывает, что строка 3 удалена, а строки 3 и 4 добавлены. Строка 3 изменилась, потому что у нее не было конца строки до, но есть после (следовательно, diff показывает "в строке 1 три строки были удалены").

0 голосов
/ 05 сентября 2018

UNIX определяет строку как «строку символов, оканчивающихся на конец строки». Таким образом, почти все редакторы на основе UNIX будут иметь такие строки:

1\n
2\n
3\n

где \n представляет символ НЧ, обозначающий конец строки. Если бы вы добавили четвертую строку здесь, это была бы действительно одна новая строка.

Windows не разделяет это определение, и многие редакторы на базе Windows рассматривают комбинацию CR + LF (отмеченную ниже как \r\n) как строку разделитель , а не строку терминатор . * * * * * * * * * * * * * * * * * * * * * Как отмечается с "\ Нет новой строки в конце файла", ваш файл

1\r\n
2\r\n
3

Когда вы добавили еще одну строку, вы получили

1\r\n
2\r\n
3\r\n
4

Таким образом, с точки зрения git, ориентированной на UNIX, вы изменили строку # 3, добавив к ней \r\n.

Теперь к недоразумению о diff формате вывода: по умолчанию diff дает вам «унифицированный» формат, с некоторым контекстом вокруг изменений. Изменения - это только строки, к которым добавлен префикс + или -: исходная строка 3 была удалена, а новые строки 3 и 4 вставлены. Запись @@ -1,3 +1,4 @@ говорит о том, что приведенный ниже фрагмент описывает строки 1-3 старого файла и строки 1-4 нового файла. Обычно унифицированный вывод diff по умолчанию также дает вам две строки контекста до и после каждого изменения, чтобы помочь людям понять, что именно изменилось (-U2). Если вам не нужен контекст, вы можете отключить его с помощью -U0.

0 голосов
/ 05 сентября 2018

Вы изменили строку 3 и добавили строку 4.

Изменением в строке 3 стала новая строка.

git diff --unified=0 может иметь больше смысла (это показывает только измененные строки).

diff --git a/a.txt b/a.txt index 5f5fbe7..b178657 100644 --- a/a.txt +++ b/a.txt @@ -3 +3,2 @@ -3 \ No newline at end of file +3 +4 \ No newline at end of file

Лучше всего видеть в цвете:

enter image description here

...