如何在长行中使用git diff?


235

我正在文件上运行git-diff,但是更改是在一行的结尾处。

如果我使用光标键向右移动,它将失去颜色编码-更糟糕的是,线条无法对齐-使得跟踪更改变得更加困难。

有什么方法可以防止该问题,或者只是使行换行?

我正在通过mingw32运行Git 1.5.5。


6
您可能想尝试'git diff --color-words',它不能解决滚动问题,但是单词的变化被上下文包围在一行中!
kevinf 2014年

7
使用“ fold”似乎效果很好:git diff --color-words | fold
Amy

我尝试过使用@Amy,fold但是它会消除颜色。由于您已指定,因此--color-words我假设您已成功将颜色传递给fold。怎么样?
Nero gris

Answers:


120

输出的显示git diff由您使用的任何寻呼机处理。

通常,将在Linux下less使用。

您可以通过设置GIT_PAGER环境变量来告诉git使用其他分页器。如果您不介意分页(例如,终端允许您向后滚动),则可以尝试GIT_PAGER使用寻呼机显式设置为空以停止它。在Linux下:

$ GIT_PAGER='' git diff

没有寻呼机,行将自动换行。

如果您的终端不支持彩色输出,您也可以使用--no-color参数将其关闭,或者在git config文件的color部分中放置一个条目。

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

1
我可以确认将GIT_PAGER设置为空白确实会导致行换行。它还插入了一些符号,使阅读起来有些困难,但是如果有必要,我可以找到其他的寻呼机,因此还是一个有效的答案。:) 谢谢。
Peter Boughton

1
它添加了哪些符号使其难以阅读?我也可以编辑答案来解决该问题。
SpoonMeiser

对于每个换行符,大多数情况下为“ <-[m”(其中<-为单个箭头字符),但对于每个颜色将要开始(我认为)的标记,例如“ <-[1m”和“ <-[32m””。
彼得·布顿

1
--no-color参数是否有帮助?我不确定换行符。
SpoonMeiser

是的,谢谢,这样可以防止所有不需要的内容出现,因此换行符也必须与颜色相关。
彼得·布顿

229

或者,如果您使用较少作为默认寻呼机,则只需-S在查看差异时键入以重新启用环绕即可。


60
相关技巧,用于--word-diff查看更改词的彩色编码突出显示
Josh Diehl 2012年

5
这只是一个注释,因为我看到有些人对此有疑问,-S与-s不同(请确保您使用的是shift + s)
longda

2
@JoshDiehl:我希望你不要介意...我认为该--word-diff部分应该对此有自己的答案,因为它令我惊讶地为帮助解决潜在问题做出了很多努力:弄清长线的变化。所以,我做到了:stackoverflow.com/a/19253759/313756
lindes

1
注意:这似乎在OS X(小牛)上不起作用。
DilithiumMatrix 2014年

@zhermes在Mavericks中对我有用,用不到418。确保您-S使用大写字母S而不是-s。键入以后-S,Less会在底部显示一条消息“折叠长行(按RETURN)” ,然后按Return键即可进行换行。
罗里·奥肯

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"
有用

这使我在OS X上永久使用git diff包装。谢谢!
汤姆森·科默

它有效,但是我不明白为什么。有人可以解释吗?man less-r关于包裹什么也没说。
西罗Santilli郝海东冠状病六四事件法轮功

@ThomsonComer'-r'与在OS X中显示控制字符有关...您是如何工作的?
DilithiumMatrix 2014年


49

在对这个答案的评论中乔什·迪尔Josh Diehl)给予了充分的肯定,我仍然认为这应该是对自己的答案,因此添加以下内容:

解决长行差异的一种方法是使用面向单词的差异。这可以通过以下方式完成:

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-diffcolorplain,和porcelain。同样,您可以使用更改单词边界的正则表达式--word-diff-regex。默认显示为\S+。(v2.1.1
Michael-Clay Shirky在哪里,2014年

3
--color-words似乎是的简写--word-diff=color,当您仅查看差异而不共享它时,这很好。
CivFan 2015年

嗯,这很有趣并且可能非常有用。感谢分享!
Darragh Enright

1
--word-diff=porcelain更喜欢这样做,--word-diff因为porcelain将更改放在单独的行中,而--word-diff将更改放入行中。当差异细微时,单独的行使您可以更轻松地查看差异。
wisbucky

1
LaTeX文件改变了生活!
6005

30

要减少使用寻呼机并使行换行成为永久性,您只需启用fold-long-lines选项:

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

这样,您不必在使用更少的时候键入它。

干杯


在OS X 10.9.5上为我工作。谢谢!
杰伊·泰勒

同样,如果要在读取Git差异时禁用换行,则设置类似:git config --global core.pager 'less -S
Topher Hunt 2015年

19

刚刚用谷歌搜索了这个。 GIT_PAGER='less -r'为我工作


9
甚至更好(对我而言):(less -R实际上,我也使用less -eiFRSX,它也解决了颜色和换行问题。)
cdunn2001 2011年

2
less -R类似于-r,但是仅以“原始”形式输出ANSI“颜色”转义序列。与-r不同,在大多数情况下,屏幕外观都可以正确维护。(少了人)
richk

19

Mac OSX:除了有人运行时,有人的45的“ -S”对我来说没有其他答案。需要以下步骤来使自动换行:

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

这对我也有用,但是我不明白为什么。什么是-+$LESS参数做什么?除非git定义了它,否则我的LESS环境变量都没有设置。
雅加达2012年

3
@jakar:那么它什么都不做。在某些环境中,$LESS将其设置为某个值(例如,通过a .login或a .profile或诸如此类的值),我认为该选项只是添加默认值,然后再添加默认值-FRX
naught101

并没有对我的OS X小牛队工作,$LESS是不确定的。
DilithiumMatrix 2014年

naught101是正确的,即+-$ LESS仅包括.login或.profile中的任何设置(如果有)。对于我来说,它在Mavericks上运行良好,但是,如果它引起问题,您可以忽略它。
John Lemberger 2014年



5

当您使用“ git diff”时,它将显示多个页面(在页面末尾看到“:”),在这种情况下,您可以键入“ -S”并按Enter。(S应该为大写)。它将切换折线。


这比麻烦任何设置都容易得多
chharvey

4

到目前为止,没有人指出这一点。它很容易记住,不需要在git config中进行额外的配置

git diff --color | less -R

到目前为止,此页面中所有答案中最简单的。我的环境-Oracle Linux 7.6。git diff --color | less -FR不需要滚动时进行小的更改
Rakesh N

3

您可以简单地将git diff的输出传递给更多:

git diff | more

3

不是一个完美的解决方案,但gitkgit-gui都能表现出这个信息,并有滚动条。


1

列出当前/默认配置:

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

然后更新并省略-S之类的内容:

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

-S:使长度超过屏幕宽度的线被切碎而不是折叠。


-1

遇到麻烦时,我经常求助于DiffMerge。出色的差异工具,具有在线差异突出显示功能。另外,在最新版本中,他们添加了具有水平模式的模式。

不过,我无法配置git来使用它。因此,我必须要弄乱才能首先获得文件的两个版本。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.