Як слід використовувати git diff для довгих ліній?


235

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

Якщо я використовую клавіші курсору для переміщення вправо, він втрачає кольорове кодування - а ще гірше, що лінії не вирівнюються, що ускладнює відстеження змін.

Чи є спосіб запобігти цій проблемі або просто змусити накручувати лінії замість цього?

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


6
Ви можете спробувати "git raz - кольорові слова", це не вирішує проблему прокрутки, але зміни слів оточені контекстом на одному рядку!
kevinf

7
Використання "складки", здається, працює досить добре:git diff --color-words | fold
Емі,

@Amy Я намагався використовувати, foldале він видаляє колір. Оскільки ви вказуєте, --color-wordsя припускаю, що вам вдалося передати кольори fold. Як?
Nero gris

Відповіді:


120

Відображення результату git diffобробляється будь-яким пейджером, який ви використовуєте.

Зазвичай під Linux lessможна використовувати.

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

$ GIT_PAGER='' git diff

Без пейджера лінії будуть обмотуватися.

Якщо ваш термінал не підтримує кольоровий вихід, ви можете також вимкнути це, використовуючи або --no-colorаргумент, або ввівши запис у розділі кольорів вашого файлу конфігурації git.

$ GIT_PAGER='' git diff --no-color

1
Я можу підтвердити, що встановлення параметра GIT_PAGER на порожнє не призводить до того, що рядки загортаються. Він також вставляє символи, що ускладнює читання, але якщо потрібно, я можу знайти інший пейджер, тому все-таки дійсна відповідь. :) Дякую.
Пітер Бауфтон

1
Які символи він додає, що ускладнюють читання? Я можу відредагувати свою відповідь і для вирішення цієї проблеми.
SpoonMeiser

Переважно "<- [m" для кожного нового рядка (де <- був символ однієї стрілки), а також маркери, де (я думаю) кожен колір починався б, як "<- [1m" та "<- [32m".
Пітер Бауфтон

1
Чи взагалі допомагає аргумент --no color? Я не впевнений у символах нового рядка.
SpoonMeiser

Так, спасибі, що запобігає появі всього небажаного вмісту, тому нові рядки також повинні бути пов’язані з кольором.
Пітер Бауфтон

229

Або якщо ви використовуєте менше як пейджер за замовчуванням, просто введіть -S, переглядаючи різну та повторну обробку менше.


60
відповідна порада, скористайтеся, --word-diffщоб побачити кольорове виділення змінених слів
Джош Діель

5
просто зауваження для цього, оскільки я бачив, що деякі люди мали проблеми з цим, -S відрізняється від -s (переконайтеся, що ви натискаєте зміну + s)
longda

2
@JoshDiehl: Я сподіваюсь, що ви не заперечуєте ... Я думаю, що --word-diffчастина заслуговує на власну відповідь на це, оскільки мені здається, що я дуже багато допомагаю вирішити основну проблему: з'ясувати, що змінилося на довгій лінії. Таким чином, я зробив це одне: stackoverflow.com/a/19253759/313756
Lindes

1
Примітка: це, здається, не працює в OS X (маверики).
DilithiumMatrix

@zhermes Це працює для мене в Мавериках, менше 418. Переконайтеся, що ви вводите -Sз великої літери S, ні -s. Менше відображається повідомлення "Складайте довгі рядки (натисніть RETURN)" внизу після введення -S, а потім натискання Return повертається.
Rory O'Kane

115

Ви також git configможете встановити пейджер для завершення.

$ git config core.pager 'less -r' 

Встановлює параметр пейджера для поточного проекту.

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

Встановлює пейджер у всьому світі для всіх проектів


3
з msysgit (1.8.1.msysgit.1) він працював для мене за допомогою подвійних лапок -git config --global core.pager "less -r"
kerim

Це мене постійно обгортає git diff на OS X. дякую!
Thomson Comer

Це працює, але я не розумію, чому. Може хтось пояснить? man less, -rнічого не говорить про обгортання.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

@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 --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>

Тепер, якщо ви порівнюєте дійсно довгий рядок, у вас все ще можуть виникнути проблеми з ситуацією пейджера, яку ви спочатку описали, і на яку, мабуть, із задоволенням, зверталися в інших відповідях. Сподіваємось, це дає вам новий інструмент, щоб легше визначити, що в лінії змінилося.


6
Є кілька варіантів для --word-diff: color, plain, і porcelain. Також можна змінити регулярний вираз для меж слова за допомогою --word-diff-regex. Здається, за замовчуванням є \S+. ( v2.1.1 )
Майкл - Де Клей Ширкий

3
--color-wordsвиглядає як скорочення --word-diff=color, що приємно, коли ви просто переглядаєте різницю, не ділившись нею.
CivFan

Ах, це цікаво і потенційно дуже корисно. Дякую, що поділились!
Darragh Enright

1
Мені подобається --word-diff=porcelainкраще, ніж --word-diffтому, що porcelainбудуть викладені зміни в окремі рядки, тоді --word-diffяк зміни будуть вбудовані. Окремі лінії дозволяють легше бачити відмінності, коли відмінності тонкі.
wisbucky

1
Життя змінюється для файлів LaTeX!
6005

30

Щоб менше використовувати як пейджер і робити обгортання ліній постійним, ви можете просто включити параметр "Згинати довгі рядки":

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

Таким чином, вам не потрібно вводити його, використовуючи менше.

Ура


Працював для мене на ОС X 10.9.5. Дякую!
Джей Тейлор

Аналогічно, якщо ви хочете відключити обертання рядків під час читання Git різниться, налаштування аналогічно:git config --global core.pager 'less -S
Topher Hunt

19

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


9
Ще краще (для мене): less -R(Насправді, я використовую less -eiFRSX, що вирішує проблеми із кольором та обертанням ліній.)
cdunn2001,

2
менше -R схоже на -r, але лише "кольорові" послідовності відтворення ANSI виводяться у "сирому" вигляді. На відміну від -r, у більшості випадків зовнішній вигляд екрану підтримується правильно. (людина менше)
richk

19

Mac OSX: жоден з інших відповідей, окрім "-S", якщо хтось працює45, працює на мене. Щоб зробити обгортання слів стійким, потрібно було наступне:

git config --global core.pager 'less -+$LESS -FRX'

Це теж працювало для мене, але я не розумію, чому. Що -+$LESSробить параметр? Якщо git не визначить це, мій змінний середовища LESS навіть не встановлений.
jakar

3
@jakar: тоді це нічого не робить. У деяких середовищах $LESSвстановлюється якесь значення (наприклад, через a .loginабо a .profileабо щось), і цей варіант, я думаю, просто додає значення за замовчуванням, а потім додає -FRXповерх них.
naught101

Це не спрацювало для мене на OS X Mavericks, $LESSне визначено.
DilithiumMatrix

naught101 вірно, що + - $ LESS просто включає будь-які параметри в .login або .profile (якщо такі є). Для мене це добре працює, але ви можете опустити це, якщо це спричинить проблеми.
Джон Лембергер

11

З моменту Git 1.5.3 ( вересень 2007 р. )

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

git --no-pager diff

Як запобігти різниці git від використання пейджера?

Приклад

Починаючи з v2.1, wrap є типовим

Примітки до випуску Git v2.1


1
Посилання Примітки до випуску допомогла мені. Просто хотів дізнатися, що відбувається (wr) на (g) у git> 2 ^^
func0der

5

Через вісім років я знаходжу вищу відповідь на веб-сайті /superuser/777617/line-wrapping-less-in-os-x-specirely-for-use-with-git-diff :

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

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


5

Коли ви використовуєте "git diff" і показує кілька сторінок (ви бачите ":" в кінці сторінки), в цьому випадку ви можете ввести "-S" і натиснути клавішу Enter (S має бути великою літерою). вона буде перемикати складні довгі рядки.


це простіше, ніж возитися з будь-якими налаштуваннями
chharvey

4

Досі ніхто цього не вказував. Його досить просто запам’ятати, і додаткової конфігурації не потрібно робити в git config

git diff --color | less -R

На сьогодні найпростіший з усіх відповідей на цій сторінці. Моє середовище - Oracle Linux 7.6. git diff --color | less -FRдля невеликих змін, коли не потрібно прокручувати
Ракеш N


3

Чи не ідеальне рішення, але gitkі git-guiможе як показати цю інформацію, і мають смуги прокрутки.


1

перерахуйте поточну / конфігурацію за замовчуванням:

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

потім оновіть і залиште -S на зразок:

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

-S: лінійки довші, ніж ширина екрана, потрібно скоротити, а не скласти.


-1

У біді я часто вдаюсь до DiffMerge. Відмінний інструмент для розрізнення, який має підкреслене лінійне розходження. Крім того, в останніх версіях вони додали режим, щоб мати горизонтальний режим.

Я не зміг налаштувати git, щоб використовувати його. Тож мені доведеться схибитись, щоб спочатку отримати обидві версії файлу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.