git索引中修改过的文件数

时间:2017-11-06 21:25:17

标签: git

如何查找索引中已修改文件的数量?也就是说,在运行git status时显示为“已修改”的文件。

我知道很多可视化的git工具,以及显示提示旁边的计数的shell附加组件,但我不知道如何以合理的方式在命令行上执行此操作。

2 个答案:

答案 0 :(得分:4)

您可以使用以下方式获取修改后的文件数:

git status -s -uno | wc -l

git status documentation-s以短格式提供输出,-uno不显示未跟踪文件。

答案 1 :(得分:1)

TL; DR

你可能想要 HEAD vs work-tree HEAD vs index ,或者 HEAD vs index plus index vs work-tree 。如果您想将两个比较分开,则无法一步完成。

详细说明

根据您的意思,您可能会有几种可能的答案。请注意,对于下面的所有diff命令,如果您对文件中的特定更改不感兴趣,则可以使用--name-only。如果您决定添加--diff-filter以选择仅检查特定类型的更改,则状态字母(已添加,已删除,已修改等)非常有用。例如,如果您想知道有多少文件是严格修改,不计算添加或删除的文件,您可以在M上进行过滤。

  1. git diff --cached --name-status HEAD | wc -l
  2. git diff --name-status HEAD | wc -l
  3. git diff --name-status | wc -l
  4. git status -s -uno | wc -l(如mpromonet's comment)。
  5. 每个产生不同的结果:

    1. HEAD与索引进行比较:如果您现在运行git commit,与提交中的内容相比,您现在将提交的内容会有什么不同? HEAD现在?也就是说,您有一个当前提交现在,如果您进行新提交,则当前提交将是新提交的父提交。会有什么不同?

      (请记住,索引代表下一个提交。它从与HEAD完全相同的文件副本开始。每次git add一个文件,您将文件从工作树复制回索引。因此,比较您提交时提交的内容,以及HEAD提交中的内容。这里有一个特例,您可以省略名称HEAD; --cached将假定为HEAD。)

      在漫长的git status输出中,这些内容出现在第一部分:Changes to be committed

    2. HEAD与工作树进行比较。这些是在工作树中修改的文件,但分阶段进行提交。在较长的git status输出中,这些通常在第二部分Changes not staged for commit中出现 - 但请看下一部分。

    3. 将索引与工作树进行比较。这些也是在工作树中修改的文件 - 但这次它们已经相对于已经复制回索引的文件进行了更改。如果索引与HEAD提交匹配,则#2和#3生成相同的文件列表。但假设READMEHEAD中作为版本H(对于Head)。您修改READMEgit add README,将版本W(对于工作树)复制到版本I(对于索引)。然后再次修改W 版本。现在这三个都不同了!使用git status --shortgit status -s,您会在输出中看到MM README:它已被修改两次。

      此部分的输出实际上显示在git status输出的后半部分Changes not staged for commit部分。

    4. 比较HEAD vs index,然后比较索引与工作树,然后使用 two 打印摘要,组合格式 - 每个文件的名称和状态每个文件的字母。

    5. 为了清楚地说明这一点,请考虑使用单个初始提交此存储库,其中包含一个文件。该文件名为README,初始提交版本包含文本Read me.

      $ git init
      Initialized empty Git repository in ...
      $ echo 'Read me.' > README
      $ git add README
      $ git commit -m initial
      [master (root-commit) a9362c4] initial
       1 file changed, 1 insertion(+)
       create mode 100644 README
      $ echo 'Please read me.' > README
      $ git add README
      $ echo 'Read me, for I am very readable.' > README
      

      现在有三个活动版本的文件README和:

      $ git status -s
      MM README
      

      git status的长版本向我们显示README已准备好提交,并且没有为提交暂存的更改:

      $ git status
      On branch master
      Changes to be committed:
        (use "git reset HEAD <file>..." to unstage)
      
              modified:   README
      
      Changes not staged for commit:
        (use "git add <file>..." to update what will be committed)
        (use "git checkout -- <file>..." to discard changes in working directory)
      
              modified:   README
      

      但是,看看如果我们把初始文本放回去会发生什么,然后将HEAD与工作树进行比较:

      $ echo 'Read me.' > README
      $ git diff --name-status HEAD
      $
      

      当前提交与工作树匹配,因此这里没有区别。如果您git add README,则简短状态从MM README变为空:

      $ git status -s
      MM README
      $ git add README
      $ git status -s
      $
      

      所以,如果你想知道如果我添加并提交所有内容&#34;我会得到什么?你需要将HEAD与工作树进行比较。如果您想知道如果我现在提交&#34;我会得到什么?您希望将HEAD与索引进行比较。