排除git diff中已删除的行

时间:2019-07-14 06:53:37

标签: git

我对函数进行了几处更改,并使用git add -p登台了其中的一个。 在提交它之前,我想检查一下此更改是否确实应做的事情。

因此,我想完全按照分阶段区域的方式打印代码,以便我可以复制此功能并在单独的文件中对其进行测试。

gitk中将有一个有用的单选按钮,我可以选择新版本而不是 Diff 。 但是,我不能在这里使用gitk,因为我是通过ssh连接到没有图形用户界面的计算机的。

如果更改已经提交,我可以使用git show HEAD:myfile(尽管这会打印整个文件,这远远超出了我当前感兴趣的范围),但是我不知道如何指定暂存区域HEAD。

我对两者都感兴趣:

  1. 我如何打印带有上下文行但没有删除行的分阶段更改?
  2. 如何在git show中指定暂存区域,以便可以打印整个文件?

我找到了this answer,但是-e中没有记录git diff --help,当尝试使用它时,出现错误:无效选项:-e 。 / p>

我当然可以提交更改,在git show HEAD:myfile的输出中搜索它们,然后在必要时使用git commit --amend更改提交,但是我觉得必须有一种更简单的方法。

2 个答案:

答案 0 :(得分:1)

被称为临时区域的事物也被称为 index 。因此,文件的暂存副本也是文​​件的索引副本。要引用特定文件的索引副本,请使用前导语法::digit:filename,例如:0:myfile

git show :0:myfile

索引在暂存插槽零中保留文件的1个副本,在暂存插槽1、2和3中保留(最多)文件的三个副本。后者仅在合并期间发生,同时解决了冲突。由于您不在冲突合并的中间,因此文件仅存在于阶段零。您可以省略数字和第二个冒号,以表示“暂存槽为零”:

git show :myfile

(与git show HEAD:myfile比较,从HEAD提交中提取文件的副本,或者git show hash:myfile从给定的提交哈希中提取文件的副本。)这些文件以内部的,Git格式的文件副本工作,采用已提交文件的特殊Git-only /只读格式(已复制到索引中的文件已经采用这种格式)。

要针对索引对HEAD进行 diff 提交,请使用:

git diff --cached

请注意,这会将HEAD中的每个文件与索引中的每个文件进行比较。当然,索引中的大多数文件已经与HEAD中的副本匹配。特别是,如果您这样做:

git checkout master
<edit some file>
git add [options] just-one-file

然后除索引/暂存区中的just-one-file文件以外的所有文件HEAD中的对应文件匹配,因此diff无论如何将只显示一个文件。 / p>

如果索引中有多个文件与它们的HEAD不同,则可以使用路径名进一步限制git diff的输出:

git diff --cached -- myfile

例如。 (这仍将显示已删除的所有。)

(常见的误解是,暂存区域仅保存 new 个文件。情况并非如此-实际上,它实际上保存了随时准备提交的每个文件时间-但是由于许多教程中描述了暂存区域的方式,并且由于git diff对于未更改的文件没有显示任何内容,因此它可以似乎< / em>首先。要查看暂存区域中所有文件的列表以及有关文件的信息,请使用git ls-files --stage。请注意,此列表可能很长!)

答案 1 :(得分:0)

我认为您要寻找的选项是--diff-filter

使用--diff-filter=M,您可以过滤差异以仅显示 m 个经过修改的文件。

来自man git-diff

  

--diff-filter=[ACDMRTUXB*]

     

仅选择符合以下条件的文件

     
      
  • A已添加
  •   
  • C已复制
  •   
  • D已删除
  •   
  • M修改
  •   
  • R重命名
  •   
  • T的类型(模式)已更改
  •   
  • U未合并
  •   
  • X未知
  •   
  • B的配对已损坏
  •   
  • *全部或全部
  •   
     

可以使用过滤器字符的任何组合。

     

将*(全或全)添加到组合中时,所有路径均为   如果有任何文件符合   比较如果没有符合其他条件的文件,则没有任何内容   被选中。

有关git-diff的完整文档,请参见here