git ls-files --stage显示已提交的文件,甚至在提交后也可以看到这些文件。

3

我需要一个展示当前所有位于暂存区(也就是索引?)中文件的 Git 命令。

首先,我从索引中移除了所有文件:

$ git rm --cached *
rm 'newfile'
rm 'os-list.txt'
rm 'remote_stuff'
rm 'removethis'

现在我检查索引中的文件:

$ git ls-files --stage
100644 07e6e472cc75fafa944e2a6d4b0f101bc476c060 0       .gitignore

你只能看到 .gitignore 文件被保留了。

然后我们更改了 newfile 的内容。接下来我们将 newfile 加入了索引。

$ git add newfile

检查状态:

$ git status -s
M  newfile
D  os-list.txt
D  remote_stuff
D  removethis
?? os-list.txt
?? remote_stuff
?? removethis

我们可以看到,新文件现在已经在索引中。
现在我们期望在提交文件时暂存区为空。
$ git commit -m "TEST333"
[master 0adab53] TEST333
 4 files changed, 1 insertion(+), 13 deletions(-)
 delete mode 100644 os-list.txt
 delete mode 100644 remote_stuff
 delete mode 100644 removethis

即使提交了,我们仍然可以看到newfile仍在暂存区:

$ git ls-files --stage
100644 07e6e472cc75fafa944e2a6d4b0f101bc476c060 0       .gitignore
100644 76abab2928bdd7dfe157109666023bb0c5e4c465 0       newfile

但如果我们检查状态,会发现暂存区中没有任何内容:
$ git status -s
?? os-list.txt
?? remote_stuff
?? removethis

我需要的是显示暂存区中所有文件的命令。命令git ls-files --stage返回了我不理解的输出。

谢谢!

1个回答

5
现在我们期望提交文件时暂存区为空。这是你的错误,不要期望它为空!如果我们检查状态,会发现暂存区里什么都没有。`git status` 不会显示索引/暂存区中有哪些内容。相反,对于每个文件,它会将索引/暂存区中的内容与以下内容进行比较: - `HEAD` 提交中的内容:如果不同,则文件被“标记为已提交”; - 工作树中的内容:如果不同,则文件被“未标记为已提交”。 这就是为什么一个文件既可以被“标记为已提交”,也可以被“未标记为已提交”的原因。这只是意味着你看到的(用 `git ls-files --stage` 看到的)索引副本与其他两个副本都不同。 每个文件都有三个活动副本。当所有三个副本相同时,`git status` 不会显示任何信息。当某些文件的副本不同时,`git status` 将告诉您有关该文件的信息。这就是这里的全部内容。 索引/暂存区始终保存着您计划(或 Git 计划)放入下一个提交中的内容。这就是为什么您必须在更改工作树副本后更新它的原因:以便 Git 计划放入下一个提交中的内容与工作树副本相匹配。

2请参见脚注1,然后查看冲突合并案例。在冲突合并期间,索引会保存每个文件的最多三个副本:合并基础副本、--ours 副本和 --theirs 副本。如果再加上 HEAD 副本和工作树副本,则意味着在冲突合并期间,任何一个文件将有最多五个活动副本。


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