如何查找索引中已修改文件的数量?也就是说,在运行git status
时显示为“已修改”的文件。
我知道很多可视化的git工具,以及显示提示旁边的计数的shell附加组件,但我不知道如何以合理的方式在命令行上执行此操作。
答案 0 :(得分:4)
答案 1 :(得分:1)
你可能想要 HEAD vs work-tree 或 HEAD vs index ,或者 HEAD vs index plus index vs work-tree 。如果您想将两个比较分开,则无法一步完成。
根据您的意思,您可能会有几种可能的答案。请注意,对于下面的所有diff命令,如果您对文件中的特定更改不感兴趣,则可以使用--name-only
。如果您决定添加--diff-filter
以选择仅检查特定类型的更改,则状态字母(已添加,已删除,已修改等)非常有用。例如,如果您想知道有多少文件是严格修改,不计算添加或删除的文件,您可以在M
上进行过滤。
git diff --cached --name-status HEAD | wc -l
git diff --name-status HEAD | wc -l
git diff --name-status | wc -l
git status -s -uno | wc -l
(如mpromonet's comment)。每个产生不同的结果:
将HEAD
与索引进行比较:如果您现在运行git commit
,与提交中的内容相比,您现在将提交的内容会有什么不同? HEAD
现在?也就是说,您有一个当前提交现在,如果您进行新提交,则当前提交将是新提交的父提交。会有什么不同?
(请记住,索引代表下一个提交。它从与HEAD
完全相同的文件副本开始。每次git add
一个文件,您将文件从工作树复制回索引。因此,比较您提交时将提交的内容,以及HEAD
提交中的内容。这里有一个特例,您可以省略名称HEAD
; --cached
将假定为HEAD
。)
在漫长的git status
输出中,这些内容出现在第一部分:Changes to be committed
。
将HEAD
与工作树进行比较。这些是在工作树中修改的文件,但不分阶段进行提交。在较长的git status
输出中,这些通常在第二部分Changes not staged for commit
中出现 - 但请看下一部分。
将索引与工作树进行比较。这些也是在工作树中修改的文件 - 但这次它们已经相对于已经复制回索引的文件进行了更改。如果索引与HEAD
提交匹配,则#2和#3生成相同的文件列表。但假设README
在HEAD
中作为版本H(对于Head)。您修改README
和git add README
,将版本W(对于工作树)复制到版本I(对于索引)。然后再次修改W 版本。现在这三个都不同了!使用git status --short
或git status -s
,您会在输出中看到MM README
:它已被修改两次。
此部分的输出实际上显示在git status
输出的后半部分Changes not staged for commit
部分。
比较HEAD
vs index,然后比较索引与工作树,然后使用 two 打印摘要,组合格式 - 每个文件的名称和状态每个文件的字母。
为了清楚地说明这一点,请考虑使用单个初始提交此存储库,其中包含一个文件。该文件名为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
与索引进行比较。