Красное пятно в конце строки указывает на ненужное — то есть в глазах Git — пустое пространство. Будут ли определенные биты пробела ненужными, зависит от пользователя данных. Рассмотрим, например, [язык программирования Whitespace](https://en.wikipedia.org/wiki/Esoteric_programming_language#Whitespace: конечные пробелы здесь, безусловно, имеют значение. Но поскольку текст на вашем изображении представляет собой простой SQL, конечные пробелы здесь не имеют значения.
Это не обязательно CRLF. Предположим, например, что у нас есть следующие строки:
This is
some text.
Теперь добавим букву Z
в конец каждой строки. Удивление или нет, в зависимости от того, насколько внимательно вы посмотрели текст выше, заключается в том, что мы получаем это:
This is Z
some text.Z
Если мы удалим ненужные пробелы после слова is
, то получим:
This isZ
some text.Z
Если мы выполним удаление этих пробелов, Git покорно покажет разницу, потому что есть разница. Это может быть различие без различия, как в операторе SQL, или нет, как в языке пробелов. Git на самом деле не знает, поэтому он покажет изменение.
Выделение красным (или другим цветом) зависит как от выбранных вами diff
— внешних различий, т. е. тех, которые не встроены в Git, которые, конечно же, просто будут выполнять свои функции — так и от многочисленных настроек Git. Вы также можете выбрать, будут ли отображаться CR в строках или нет, и будет ли Git взламывать ваши данные, чтобы удалить CR, также что-то, что вы можете настроить, но независимо от того, настроите ли вы Git таким образом, точка, в которой Git вносит эти изменения, будет не там, где вы ожидаете.1
Мне интереснее вот это:
\ No newline at end of file
Строки в текстовом файле могут быть разделены разделителями строк или заканчиваться разделителями/разделителями строк. Что это значит? Давайте посмотрим на содержимое этого файла с двумя строками (после того, как мы удалим ненужные лишние пробелы). Он читает This isend-of-linesome text.end-of-line
? Или это This isend-of-linesome text.
? В первом случае у нас есть разделители строк: каждая строка заканчивается концом строки. В последнем случае у нас есть разделители строк: строки разделяются концом строки, но в файле нет последнего конца строки .
Если мы открыли файл в нашем редакторе, возможно, мы не сможем сказать. Можем ли сказать, зависит ли это от нашего редактора, и если да, то как. Однако очень часто, независимо от того, какой макет у файла — разделители или разделители, — он будет выглядеть абсолютно одинаково. Но это не так.
Команда git diff
должна иметь возможность сообщать вам или, что более важно, сообщить Git, когда файл выглядит так. Таким образом, он использует этот \ No newline at end of file
, чтобы сказать, что в файле отсутствует последний разделитель строки. Git, по сути, считает, что в файлах обычно используются разделители строк, а в этом один отсутствует.
Если у вас есть файл, который заканчивается без разделителя строки, и вы хотите добавить в него строку, вы должны необходимо добавить или изменить две строки в процессе: вы сначала добавьте терминатор к тому, что в конце файла отсутствует, затем вы добавляете еще одну строку с терминатором или без него. Если все строки заканчиваются терминатором, и вы хотите добавить одну строку, вам нужно добавить только одну строку. Так что, вероятно, вам следует избегать этой ситуации. В вашем редакторе может быть параметр, обеспечивающий, чтобы последняя строка текстового файла заканчивалась правильным разделителем строк.
После того, как вы позаботились об этом и проверили, добавили ли вы пустой текстовый пробел в конце строки, которая раньше была последней строкой файла, затем em> вы можете выяснить, есть ли у вас проблемы с CRLF. См. Почему мой файл .gitattributes не препятствует добавлению \rs при извлечении файлов в Windows?, Как нормализовать рабочие окончания строк дерева в Git? и многое другое (поиск CRLF, окончаний строк, gitattributes и т. д. в разделе git.)
1Я волшебным образом узнаю об этом, читая ваши мысли. ???? Нет, конечно, я на самом деле не знаю, чего вы ожидаете, но на практике никто не ожидает, что Git сделает это там, где Git это делает на самом деле.
person
torek
schedule
14.06.2021