在终端保留“git diff”结果

9

我在终端中使用Git。当我需要进行一些更改时,我使用git diff查看我所做的更改。我希望输出结果保留在终端中,这样我就可以在按下Q后查看它,因为当我按下Q时,结果都会消失。


为什么不能将输出重定向到文件中? - Rajeev
@Rajeev 但是我会有很多文件?我不喜欢它们。我认为在终端中打印更好。 - mygoare
1
有一个答案对您有用吗?如果是这样,您应该接受它。 - John Szakmeister
2个回答

20

这是因为 Git 通过分页器输出它。取而代之,请使用:

git --no-pager diff
它默认设置为使用分页器,您可以更改此默认设置以改用cat,以避免必须在git config --global core.pager cat中键入--no-pager。您可以在此处的文档中阅读更多内容。
STDOUT输出并通过分页器输出要复杂得多,需要超出常规Unix重定向和管道的工具。您可以使用tee将输出重定向到STDERR并将其管道传输到less,这会给您想要的错觉。注意,这是一种黑客技术,滥用了STDERR的概念。
git diff | tee /dev/stderr | less

如果您经常使用此内容,您可能希望将其设置为别名。


@mygoare 抱歉,我把它放错了顺序,请查看更新的答案。 - Trent Earl
它能够工作,但我无法使用j、k进行移动,结果会打印全部内容。我希望这种情况发生在按下q之后。 - mygoare
@mygoare 看到更新的回答了,我现在才明白你想要什么。 - Trent Earl

16
你所遇到的问题是由于git将输出通过分页程序(通常为less)进行处理引起的。默认情况下,less会发送终端初始化和去初始化序列,去初始化序列可能导致屏幕被清空。
要停止这种行为,你可以通过git config core.pager设置其他内容,或者更有可能的是,你设置了一个LESS环境变量,而git只是使用它。在这种情况下,你需要在LESS环境变量中包含X选项。-X--no-init相同,它使less停止向屏幕输出去初始化序列,从而停止被清除。默认情况下,当git发现LESS没有设置时,它默认为FRX,其中包括保留屏幕不被清除的选项。
总的来说,我也不喜欢less随内容一起消失。我通常将LESS环境变量设置为eFRX
export LESS=eFRX

e是一种在到达文件结尾并尝试滚动页面时退出的方式。 F表示如果只有一个屏幕大小的内容,就直接退出。 R有助于解释ANSI颜色代码(你需要在git diff中使用它),而X则使其在退出前停止清除屏幕。

这将使您对使用less的其他程序更加满意。


我认为这个回答更加简洁地回答了原问题。另一个回答解释了diff消失的“原因”,但是这个回答告诉我们如何以最经济的方式防止这种情况发生。 - jhrr
这是Linux Mint上less的默认行为,直到我不得不在工作中使用Mac才知道我有多幸运。就我而言,这个解决方案比TRENT的更优越。 - sage88
这只是我的个人意见:e选项是--quit-at-eof的缩写标志。使用此选项,您可以在滚动到最后一行时退出less页面,而无需按下q键。 eE略有不同,但差别不大。 - Roeniss

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接