在git diff中跳转到下一个修改过的文件?

67

我犯了一个错误,在未提交之前将Visual Studio 2008项目升级到2010版。由于这个原因,我有一个巨大的系统生成文件(10k+行),其中每四行更改一次。

通常我很善于经常检查并提交更改,所以我通常只是使用向下键来浏览我的更改。但在这种情况下,要浏览修改后的系统生成文件需要花费几生时间。

在执行git diff之后是否有一种方法可以跳过到下一个被修改的文件,以便您不必滚动查看每个文件中的每个更改内容?


如果您的更改集很小,只需使用“git diff fileName”即可。 - zbrunson
2
我想看到所有被修改过的文件,只跳过那个巨大的文件就可以了。 - Abe Miessler
6个回答

111

默认情况下,git diff通过less进行输出。因此,您可以使用less命令搜索下一个标题。键入/^diff并按Enter跳转到下一个文件。


2
我需要先退出当前的差异吗?我尝试从当前的差异中执行它,但它显示“未找到模式”。 - Abe Miessler
2
/ 命令从您正在查看的当前位置开始搜索。因此,如果您收到该消息,则输出中没有以 diff 开头的其他行。 - Greg Hewgill
实际上,听起来你*真正想要做的是将这些(未提交的)更改拆分为两个单独的提交。执行git add large.file.name,然后执行git commit,然后所有剩下的更改都将是其他文件,而不是大文件。 - Greg Hewgill
4
然后,使用“n”跳转到下一个“^diff”的出现位置,使用“N”跳转到上一个出现位置。在使用“/”搜索其他模式之前,这应该能够正常工作。 - Gauthier
你节省了我很多时间。谢谢你。 - relipse

19

git diff中,只需按下n即可直接跳转到下一个文件,再按一次将跳转到后面的文件,以此类推。

您还可以使用N返回一个文件。

(为了使用这些命令,请先输入/^diff并按下Enter,如此答案所述。)


5
按下“n”键可查找下一个搜索词。为了使此功能生效,您需要搜索文件头的公共部分。 - Aaron Swan

7

如果您在 git diff 中,可以输入 h 查看其他有用的命令(此时您处于 less 界面中)。

特别地:

                           JUMPING

  g  <  ESC-<       *  Go to first line in file (or line N).
  G  >  ESC->       *  Go to last line in file (or line N).
  p  %              *  Go to beginning of file (or N percent into file).
  t                 *  Go to the (N-th) next tag.
  T                 *  Go to the (N-th) previous tag.
  {  (  [           *  Find close bracket } ) ].
  }  )  ]           *  Find open bracket { ( [.
  ESC-^F <c1> <c2>  *  Find close bracket <c2>.
  ESC-^B <c1> <c2>  *  Find open bracket <c1>

4
我建议您使用 tig。它是一个基于 curses 的界面,用于 git,非常好用。
使用 tig status 可以查看索引状态,按下任何文件的 Enter 键,就可以查看其差异。按下 h 键可以查看帮助菜单,但它是一个基于 vi 快捷键的界面。
我认为在任何基于 Debian 的发行版中,您都可以直接使用 apt-get install 命令进行安装,或者从链接的网站上下载并安装。

6
默认情况下,tig 不允许您快速跳转文件,但您可以使用以下绑定实现:bind diff F :/^\+\+\+ - VitalyB
2
@VitalyB 谢谢你 - 我很惊讶居然没有默认的绑定。对于未来的SO用户,使用上述shift+f将搜索下一个文件。由于这不是搜索,因此n将移动到下一个文件,而shift+n将移动到上一个文件。 - Samaursa
1
本意是说“因为现在是一个搜索”另外,bind diff 对我来说停止工作了。不确定原因,但这个可以:bind stage F :/^\+\+\+ - Samaursa

0

我想你想要的是:

:n                *  Examine the (N-th) next file from the command line.

less的帮助文档中查看此内容。

                      CHANGING FILES
:e [file]            Examine a new file.
^X^V                 Same as :e.
:n                *  Examine the (N-th) next file from the command line.
:p                *  Examine the (N-th) previous file from the command line.
:x                *  Examine the first (or N-th) file from the command line.
:d                   Delete the current file from the command line list.
=  ^G  :f            Print current file name.

1
只有当less处理多个文件时,这才有效。在这里,它只是对输出进行分页,没有文件的概念。 - undefined

0

另一个选择是调用update-index命令,并告诉它假装一个巨大的文件没有改变。这里有一个更完整的例子在这里


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