【问题标题】:How should I use git diff for long lines?我应该如何使用 git diff 处理长行?
【发布时间】:2010-09-13 06:21:56
【问题描述】:

我正在对一个文件运行 git-diff,但更改位于一行的末尾。

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

有没有办法防止这个问题,或者只是让行换行?

我正在通过 mingw32 运行 Git 1.5.5。

【问题讨论】:

  • 你可能想试试'git diff --color-words',它不能解决滚动问题,但是单词的变化会被上下文包围在一行中!
  • 使用“折叠”似乎效果很好:git diff --color-words | fold
  • @Amy 我试过使用fold,但它会去除颜色。由于您指定了--color-words,我假设您设法将颜色传递给fold。怎么样?

标签: git diff word-wrap


【解决方案1】:

或者,如果您使用 less 作为默认分页器,只需在查看差异时键入 -S 即可重新启用在 less 中的换行。

【讨论】:

  • 相关提示,使用--word-diff 可以看到更改后的单词的颜色标记突出显示
  • 只是一个注释,因为我看到有些人对此有疑问,-S 与 -s 不同(确保你按 shift+s)
  • @JoshDiehl:我希望你不介意......我认为--word-diff 部分应该对此有自己的答案,因为它为帮助解决底层问题做了很多工作让我感到震惊问题:弄清楚长线发生了什么变化。所以,我做到了:stackoverflow.com/a/19253759/313756
  • 注意:这似乎不适用于 OS X(小牛)。
  • 这是正确的答案,但我一直在尝试将-S 添加到命令或寻呼机核心默认值...对于像我这样无法阅读全文的人,简要解决方案键入-S查看差异而不是在发出命令之前
【解决方案2】:

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

通常,在 Linux 下,会使用less

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

$ GIT_PAGER='' git diff

没有寻呼机,行将换行。

如果您的终端不支持彩色输出,您也可以使用 --no-color 参数或在 git 配置文件的颜色部分输入一个条目来关闭它。

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

【讨论】:

  • 我可以确认将 GIT_PAGER 设置为空白确实会导致换行。它还插入符号,使其有点难以阅读,但如有必要,我可以找到不同的寻呼机,所以仍然是一个有效的答案。 :) 谢谢。
  • 它添加了哪些符号使其难以阅读?我也可以编辑我的答案来解决这个问题。
  • 每个换行符主要是“
  • --no-color 参数有帮助吗?我不确定换行符。
  • 是的,谢谢,这可以防止出现所有不需要的内容,所以换行符也必须与颜色相关。
【解决方案3】:

您也可以使用git config 设置寻呼机进行换行。

$ git config core.pager 'less -r' 

为当前项目设置寻呼机设置。

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

为所有项目全局设置寻呼机

【讨论】:

【解决方案4】:

a commentthis answer 中完全归功于Josh Diehl,但我觉得这应该是一个答案,所以添加它:

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

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

或者,使用着色,而不是这样:

你可能会得到这个:

现在,如果您要比较一条很长的线路,则您最初描述的寻呼机情况可能仍然存在问题,并且已在其他答案中得到解决,显然令您满意。不过,希望这可以为您提供一个新工具,以便更轻松地识别在线上发生了哪些变化。

【讨论】:

  • --word-diff 有几个选项:colorplainporcelain。此外,可以使用--word-diff-regex 更改单词边界的正则表达式。默认值似乎是\S+。 (v2.1.1)
  • --color-words 看起来是--word-diff=color 的简写,当您只是查看差异而不是共享差异时,这很好。
  • 啊,这很有趣,而且可能非常有用。感谢分享!
  • 我比--word-diff 更喜欢--word-diff=porcelain,因为porcelain 会将更改排列在不同的行上,而--word-diff 将更改内联。当差异很细微时,单独的行可以让您更容易地看到差异。
  • LaTeX 文件改变生活!
【解决方案5】:

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

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

这样您就不必在使用 less 时键入它。

干杯

【讨论】:

  • 在 OS X 10.9.5 上为我工作。谢谢!
  • 同理,如果你想在读取 Git diff 时禁用换行,设置类似:git config --global core.pager 'less -S
【解决方案6】:

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

【讨论】:

  • 甚至更好(对我来说):less -R(实际上,我使用less -eiFRSX,它也解决了颜色和换行问题。)
  • less -R 类似于 -r,但只有 ANSI“颜色”转义序列以“原始”形式输出。与 -r 不同,在大多数情况下,屏幕外观保持正确。 (少人)
【解决方案7】:

Mac OSX:除了someone45's '-S' while less is running 对我来说没有其他答案。使自动换行持久化需要以下几点:

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

【讨论】:

  • 这对我也有用,但我不明白为什么。 -+$LESS 参数在做什么?除非 git 定义它,否则我的 LESS 环境变量甚至没有设置。
  • @jakar:那么它什么也不做。在某些环境中,$LESS 设置为某个值(例如,通过.login.profile 或其他东西),我认为该选项只是添加默认值,然后在这些之上添加-FRX .
  • 没有在 OS X Mavericks 上对我有用,$LESS 未定义。
  • naught101 是正确的, +-$LESS 仅包含 .login 或 .profile (如果有)中的任何设置。对我来说,它在 Mavericks 上运行良好,但如果它引起问题,你可以省略它。
【解决方案8】:

从 Git 1.5.3 开始 (Sep 2007)

--no-pager 选项已可用。

git --no-pager diff

How do I prevent git diff from using a pager?

Example

从 v2.1 开始,wrap 是默认的

Git v2.1 Release Notes

【讨论】:

  • 发行说明链接帮助了我。只是想知道 git > 2 ^^ 中发生了什么 (wr)on(g)
【解决方案9】:

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

git diff --color | less -R

【讨论】:

  • 到目前为止,此页面中所有答案中最简单的。我的环境 - Oracle Linux 7.6。 git diff --color | less -FR 不需要滚动时的小改动
【解决方案10】:

八年后我从https://superuser.com/questions/777617/line-wrapping-less-in-os-x-specifically-for-use-with-git-diff找到了一个更好的答案:

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

现在你通过 fold 管道 git diff,首先,然后到 less: Wrapped,less page-height 是正确的,保持语法突出显示。

【讨论】:

    【解决方案11】:

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

    【讨论】:

    • 这比搞乱任何设置要容易得多
    【解决方案12】:

    您可以简单地将 git diff 的输出通过管道传输到更多:

    git diff | more
    

    【讨论】:

      【解决方案13】:

      不是一个完美的解决方案,但gitkgit-gui 都可以显示此信息, 并有滚动条。

      【讨论】:

        【解决方案14】:

        列出当前/默认配置:

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

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

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

        -S:使长于屏幕宽度的行被截断而不是折叠。

        【讨论】:

          【解决方案15】:

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

          不过,我无法配置 git 来使用它。所以我必须先搞定这两个版本的文件。

          【讨论】:

            猜你喜欢
            • 2011-01-21
            • 2015-02-12
            • 2016-02-04
            • 1970-01-01
            • 2013-03-02
            • 1970-01-01
            • 1970-01-01
            • 2014-04-11
            • 2011-07-02
            相关资源
            最近更新 更多