https://www.kernel.org/pub/software/scm/git/docs/gitglossary.html#def_dirty 如果工作树包含尚未提交给当前分支的修改,则称其为"脏".
http://www.gitguys.com/topics/glossary/ 脏工作目录如果文件在索引中更新后在工作目录中已更新,则工作目录被视为"脏".如果工作目录中的所有已修改文件都已添加到索引,则工作目录是干净的.
如果我理解正确,"索引"也称为"暂存区",并且当你更改它们,想要提交它们但尚未完成时,文件将被存储(复制到?符号链接?).提交了.(第一个词汇表说暂存区域也可以用于合并.第二个词汇表说文件通过'git add'移动到那里.)
所以这两个词汇表似乎在说不相容的东西.哪个是对的?或者他们有什么方法可以正确吗?
tor*_*rek 11
他们实际上都是合理的主张.我认为"最佳答案"是两者都错了,尽管前者(kernel.org版本)可能更接近.
考虑:
$ mkdir /tmp/repo && cd /tmp/repo
$ git init
Initialized empty Git repository in /tmp/repo/.git/
$ echo contents > file
$ git add file
$ git commit -m initial
[master (root-commit) e1731a6] initial
1 file changed, 1 insertion(+)
create mode 100644 file
Run Code Online (Sandbox Code Playgroud)
我们现在有一个存储库,其中一个提交包含一个文件.
$ echo second line >> file; git add file; echo contents > file
Run Code Online (Sandbox Code Playgroud)
此时,索引中file有两行.但是工作树版本中file只包含一行,并且与存储库中的内容相匹配.
是file脏?嗯,git status --short说是两次(两次M).无论git diff和git diff --cached变化显示,(所以是的,它是"脏"),但git diff HEAD说有没有变化,如果我们git add这一次和尝试git status:
$ git status --short
MM file
$ git diff HEAD
$ git add file
$ git status
# On branch master
nothing to commit, working directory clean
Run Code Online (Sandbox Code Playgroud)
让我们把这个奇怪的改变放回去再做一件事.这一次让我们使用长形式,git status以便为我们提供更多信息:
$ echo second line >> file; git add file; echo contents > file
$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: file
#
# 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: file
#
Run Code Online (Sandbox Code Playgroud)
它说我们可以使用git reset(和它相同git reset --mixed)HEAD和文件名来取消阶段; 肯定会使工作目录变脏?:-)
$ git reset HEAD file
$ git status
# On branch master
nothing to commit, working directory clean
Run Code Online (Sandbox Code Playgroud)
不,实际上,它使工作目录再次清洁!这源于(缺少)输出git diff HEAD:"取消暂存"添加第二行的更改使索引引用HEAD版本,而工作目录版本与HEAD版本相同,因此取消暂存"要提交的更改"导致没有任何提交,也没有工作目录更改.
我认为,"正确"的定义是,如果没有提交更改,并且 "tree staged for commit"(索引内容)和"工作目录"之间没有任何更改,那么您的树是"干净的".但是,分别询问索引是否干净(即,没有任何阶段提交)和/或工作树是否干净(未更改),填空方法是空白的,其中空白可以是填写"临时区域"或" HEAD提交".
什么git status告诉你的答案是"什么,如果有的话,是为了提交而上演"和"工作树与索引之间有什么不同"的答案.您必须使用git diff HEAD(您可能想要添加--name-only或类似)来查看工作树和HEAD提交之间的内容(如果有的话),除非(通常情况下)索引与HEAD提交匹配.
什么
git status告诉你俩的答案是:
- “什么,如果有的话,是为了提交而上演的”和
- “工作树和索引之间有什么不同,如果有的话”。
请注意,只有工作树与 git status 相关,而不是“工作目录”。
Git 2.9.1+(2016 年第三季度)将使这一点更加清晰。
请参阅Lars Vogel ( ) 的commit 2a0e6cd (2016 年 6 月 9 日)。(由Junio C Hamano合并-- -- in commit a010d61,2016 年 6 月 27 日)vogella
gitster
使用“工作树”而不是“工作目录”
git status工作目录很容易与当前目录混淆。
在我的一个补丁中,我已经使用手册页的工作树更新了工作目录的使用,但我注意到它git status也使用了这个不正确的术语。