https://www.kernel.org/pub/software/scm/git/docs/gitglossary.html#def_dirty 如果工作树包含尚未提交给当前分支的修改,则称其为“脏”。
http://www.gitguys.com/topics/glossary/ 脏的工作目录 如果在索引中更新文件后工作目录中的文件已更新,则工作目录将被视为“脏”。如果工作目录中的所有已修改文件都已添加到索引中,则工作目录是干净的。
如果我理解正确,“索引”也称为“暂存区”,并且当你更改它们,想要提交它们时,文件将被存储(复制到?符号链接?),但是避风港还没完成提交。 (第一个词汇表说暂存区域也可以用于合并。第二个词汇表说文件通过'git add'移动到那里。)
所以这两个词汇表似乎在说不相容的东西。哪个是对的?或者他们有什么方法可以正确吗?
答案 0 :(得分: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
我们现在有一个存储库,其中一个提交包含一个文件。
$ echo second line >> file; git add file; echo contents > file
此时,索引中包含file
个两个行。但file
的工作树版本只有一行,并且与存储库中的内容相匹配。
file
是否脏了?好吧,git status --short
说它是两次(两个M
s)。 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
让我们做出奇怪的改变并再做一件事。这一次,我们使用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
#
它说我们可以使用git reset
(与git reset --mixed
相同)和HEAD
以及文件名取消暂存;肯定会使工作目录变脏? : - )
$ git reset HEAD file
$ git status
# On branch master
nothing to commit, working directory clean
不,实际上,它使工作目录再次清理!这是由git diff HEAD
的输出(缺乏)引起的:&#34; un-staging&#34;添加第二行的更改使索引引用HEAD
版本,而工作目录版本与HEAD
版本相同,因此取消暂挂&#34;更改为致力于&#34;导致无法提交和没有工作目录更改。
&#34;对&#34;我认为,定义是你的树是干净的#34;如果没有提交和的更改,那么在提交&#34;树之间没有变化(索引的内容)和&#34;工作目录&#34;。但是,分别询问索引是否干净(即,没有任何阶段提交)和/或工作树是否干净(未更改)与填写 - 是否合理是合理的。空白,其中空白可以填入&#34;暂存区域&#34;或者&#34; HEAD
提交&#34;。
git status
告诉你的是&#34;答案是什么,如果有的话,是为了提交#34;和&#34;工作树和索引之间有什么不同(#34;)。您必须使用git diff HEAD
(您可能希望添加--name-only
或类似内容)以查看工作树与HEAD
提交之间的差异(如果有),除非< / em>(通常就是这种情况)索引匹配HEAD
提交。
答案 1 :(得分:4)
git status
告诉你的是答案:
- &#34;什么,如果有的话,是为了提交而进行的#34;和
- &#34;工作树和索引之间有什么不同之处&#34;。
请注意,只有工作树涉及git status,而不是&#34;工作目录&#34;。
Git 2.9.1 +(2016年第3季度)将更清楚
请commit 2a0e6cd查看Lars Vogel (vogella
)(2016年6月9日)
(2016年6月27日Junio C Hamano -- gitster
-- commit a010d61合并)
使用&#34;工作树&#34;而不是&#34;工作目录&#34;对于
git status
工作目录很容易与当前目录混淆 在我的一个补丁中,我已经使用工作树更新了工作目录的用法,但是我注意到
git status
也使用了这个不正确的术语。
答案 2 :(得分:1)
根据官方Git文档,在Stashing部分,脏状态定义为... the dirty state of your working directory — that is, your modified tracked files and staged changes
。根据此定义,为提交而暂存的文件也是脏的。这意味着kernel.org
文章如果正确,而gitguys.com
文章则非常错误。你应该向他们指出这一点。