Как мне использовать git diff для длинных строк?

235

Я запускаю git-diff для файла, но изменение находится в конце длинной строки.

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

Есть ли способ предотвратить эту проблему или просто сделать перенос строк?

Я запускаю Git 1.5.5 через mingw32.

Питер Боутон
источник
6
Вы можете попробовать 'git diff --color-words', это не решает проблему с прокруткой, но изменения слов окружены контекстом в одной строке!
Кевинф
7
Использование «сгиба», кажется, работает очень хорошо:git diff --color-words | fold
Эми
@ Эми, я пытался использовать, foldно он удаляет цвет. Поскольку вы указываете, --color-wordsя предполагаю, что вам удалось передать цвета fold. Как?
Неро Гри

Ответы:

120

Отображение вывода git diffобрабатывается любым используемым вами пейджером.

Обычно под Linux, lessбудет использоваться.

Вы можете указать git использовать другой пейджер, установив GIT_PAGERпеременную окружения. Если вы не возражаете против пейджинга (например, ваш терминал позволяет вам прокручивать назад), вы можете явно установить GIT_PAGERпустое значение, чтобы остановить его, используя пейджер. Под Linux:

$ GIT_PAGER='' git diff

Без пейджера строки будут перенесены.

Если ваш терминал не поддерживает цветной вывод, вы также можете отключить его, используя либо --no-colorаргумент, либо поместив запись в раздел цвета вашего файла конфигурации git.

$ GIT_PAGER='' git diff --no-color
SpoonMeiser
источник
1
Я могу подтвердить, что установка пустого значения GIT_PAGER приводит к переносу строк. Он также вставляет символы, которые немного затрудняют его чтение, но при необходимости я могу найти другой пейджер, поэтому все еще действительный ответ. :) Спасибо.
Питер Боутон
1
Какие символы он добавляет, что затрудняет чтение? Я мог бы изменить свой ответ, чтобы решить эту проблему тоже.
SpoonMeiser,
Главным образом "<- [m" для каждой новой строки (где <- был один символ стрелки), но также и маркеры, где (я думаю) каждый цвет должен был бы начаться, как "<- [1m" и "<- [32m".
Питер Боутон
1
Аргумент --no-color помогает вообще? Я не уверен насчет символов новой строки.
SpoonMeiser
Да, спасибо, это предотвращает появление всего нежелательного контента, поэтому новые строки также должны были быть связаны с цветом.
Питер Боутон
229

Или, если вы используете меньше как пейджер по умолчанию, просто введите -Sпри просмотре различий в включаемую упаковку в меньше.

someone45
источник
60
соответствующий совет, используйте, --word-diffчтобы увидеть цветовую подсветку измененных слов
Джош Дил
5
просто примечание для этого, так как я видел, что у некоторых людей были проблемы с этим, -S отличается от -s (убедитесь, что вы нажимаете shift + s)
longda
2
@JoshDiehl: Надеюсь, ты не возражаешь ... Я думаю, что эта --word-diffчасть заслуживает того, чтобы иметь свой собственный ответ на этот вопрос, так как мне кажется, что я многое делаю, чтобы помочь решить основную проблему: выяснить, что изменилось на длинной линии. Итак, я сделал это один: stackoverflow.com/a/19253759/313756
Линдес
1
Примечание: это, кажется, не работает на OS X (mavericks).
DilithiumMatrix
@zhermes Это работает для меня в Mavericks, с меньшим 418. Убедитесь, что вы печатаете -Sс большой буквы, а не -s. Меньше отображает сообщение «Fold long lines (нажмите RETURN)» внизу после ввода текста -S, а затем нажатие «Return» включает перенос.
Рори О'Кейн,
115

Вы также можете использовать, git configчтобы настроить пейджер для упаковки.

$ git config core.pager 'less -r' 

Устанавливает настройку пейджера для текущего проекта.

$ git config --global core.pager 'less -r' 

Устанавливает пейджер глобально для всех проектов

Shoan
источник
3
с msysgit (1.8.1.msysgit.1) он работал для меня, используя двойные кавычки -git config --global core.pager "less -r"
kerim
Это заставило меня обернуться навсегда с git diff на OS X. Спасибо!
Томсон Комер
Это работает, но я не понимаю почему. Может кто-нибудь объяснить? man less, -rничего не говорит об упаковке.
Сиро Сантилли 郝海东 冠状 病 六四 事件 法轮功
@ThomsonComer '-r' относится к отображению управляющих символов в OS X ... Как у вас получилось?
DilithiumMatrix
Я не могу вспомнить наверняка сейчас. Но нашел некоторые ссылки , которые объясняют его больше: michael.otacoo.com/linux-2/avoid-escape-characters-in-git superuser.com/questions/366930/... unix.stackexchange.com/questions/19317/...
Shoan
49

С полным уважением к Джошу Дилу в комментарии к этому ответу , я, тем не менее, чувствую, что это должен быть ответ сам по себе, поэтому добавлю его:

Один из способов справиться с различиями в длинных строках - использовать разностный текст. Это можно сделать с помощью:

git diff --word-diff

В этом случае вы получите значительно отличающийся вывод diff, который показывает вам, что конкретно изменилось в строке.

Например, вместо того, чтобы получить что-то вроде этого:

diff --git a/test-file.txt b/test-file.txt
index 19e6adf..eb6bb81 100644
--- a/test-file.txt
+++ b/test-file.txt
@@ -1 +1 @@
-this is a short line
+this is a slightly longer line

Вы можете получить что-то вроде этого:

diff --git a/test-file.txt b/test-file.txt
index 19e6adf..eb6bb81 100644
--- a/test-file.txt
+++ b/test-file.txt
@@ -1 +1 @@
this is a [-short-]{+slightly longer+} line

Или с раскрашиванием вместо этого:

результат только <code> git diff </ code>

Вы можете получить это:

результат <code> git diff --word-diff </ code>

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

Lindes
источник
6
Есть несколько вариантов для --word-diff: color, plain, и porcelain. Кроме того, можно изменить регулярное выражение для границ слова с помощью --word-diff-regex. По умолчанию кажется \S+. ( v2.1.1 )
Майкл - Где Клэй Ширки
3
--color-wordsвыглядит кратко --word-diff=color, что хорошо, когда вы просто просматриваете diff, а не делитесь им.
CivFan
Ах, это интересно и потенциально очень полезно. Спасибо, что поделился!
Дарра Энрайт
1
Мне нравится --word-diff=porcelainлучше, чем --word-diffпотому, porcelainчто выстроить изменения будут в отдельных строках, тогда --word-diffкак изменения будут внесены в строку . Отдельные линии позволяют вам видеть различия легче, когда различия неуловимы.
Wisbucky
1
Жизнь меняется для файлов LaTeX!
6005
30

Чтобы использовать меньше как пейджер и сделать перенос строк постоянным, вы можете просто включить опцию сгиба длинных линий:

git config --global core.pager 'less -+S'

Таким образом, вам не нужно вводить его при использовании меньше.

ура

Даниэль Монтезано
источник
Работал для меня на OS X 10.9.5. Спасибо!
Джей Тейлор,
Точно так же, если вы хотите ОТКЛЮЧИТЬ перенос строк при чтении Git diffs, настройка аналогична:git config --global core.pager 'less -S
Topher Hunt
19

Просто погуглил этот. GIT_PAGER='less -r'работает для меня

Singingfish
источник
9
Еще лучше (для меня): less -R(На самом деле, я использую less -eiFRSX, что также решает проблемы с цветом и
переносом строк
2
less -R похож на -r, но только escape-последовательности ANSI "color" выводятся в "сыром" виде. В отличие от -r, внешний вид экрана поддерживается в большинстве случаев правильно. (человек меньше)
Ричк
19

Mac OSX: Ни один из других ответов, кроме чьего-либо 45 '-S', пока работает меньше, мне не помог. Чтобы сделать перенос слов постоянным, потребовалось следующее:

git config --global core.pager 'less -+$LESS -FRX'
Джон Лембергер
источник
Это сработало и для меня, но я не понимаю почему. Что -+$LESSделает параметр? Если git не определяет это, моя переменная окружения LESS даже не установлена.
Джакар
3
@jakar: тогда это ничего не делает. В некоторых средах $LESSустанавливается какое-то значение (например, a .loginили a .profileили что-то), и эта опция, я думаю, просто добавляет значения по умолчанию, а затем добавляет их -FRXповерх.
naught101
Это не работает для меня на OS X Mavericks, $LESSне определено.
DilithiumMatrix
naught101 верно, что + - $ LESS просто включает все настройки в .login или .profile (если есть). Он отлично работает на Mavericks для меня, но вы можете опустить его, если это вызывает проблемы.
Джон Лембергер
11

Начиная с Git 1.5.3 ( сентябрь 2007 г. )

--no-pagerопция была доступна.

git --no-pager diff

Как я могу запретить git diff использовать пейджер?

пример

Начиная с версии 2.1, по умолчанию используется перенос

Примечания к выпуску Git v2.1

Стивен Пенни
источник
1
Ссылка на заметки о выпуске помогла мне. Просто хотел узнать, что происходит (wr) (g) в git> 2 ^^
func0der
5

Восемь лет спустя я нахожу превосходный ответ от /superuser/777617/line-wrapping-less-in-os-x-specifically-for-use-with-git-diff :

git config core.pager `fold -w 80 | less`

Теперь вы перенаправляете git diff через сгиб, а затем на меньшее: обернуто, правильная меньшая высота страницы, сохраняйте подсветку синтаксиса.

Томсон Комер
источник
5

Когда вы используете «git diff», и он показывает несколько страниц (вы видите «:» в конце страницы), в этом случае вы можете набрать «-S» и нажать Enter (S должно быть заглавной). это переключит сгибы длинных линий.

Амин
источник
это намного проще, чем возиться с какими-либо настройками
chharvey
4

Никто не указал на это до сих пор. Его довольно просто запомнить, и в конфиге git не нужно выполнять никаких дополнительных настроек.

git diff --color | less -R
infoclogged
источник
Безусловно самый простой из всех ответов на этой странице. Моя среда - Oracle Linux 7.6. git diff --color | less -FRдля небольших изменений, когда не нужно прокручивать
Ракеш N
3

Вы можете просто направить вывод git diff к следующему:

git diff | more
AnonTidbits
источник
3

Не идеальное решение, но gitkи git-guiможет показывать эту информацию, и иметь полосы прокрутки.

Питер Боутон
источник
1

перечислите текущую / стандартную конфигурацию:

  $ git config --global core.pager  
    less -FXRS -x2

затем обновите и пропустите -S как:

  $ git config --global core.pager 'less -FXR -x2'

-S: заставляет линии, длина которых превышает ширину экрана, обрезаться, а не складываться.

user5870226
источник
-1

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

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

webmat
источник