git“脏”是指不上传或未提交的文件? (词汇​​表冲突)

时间:2013-12-17 19:29:00

标签: git

https://www.kernel.org/pub/software/scm/git/docs/gitglossary.html#def_dirty 如果工作树包含尚未提交给当前分支的修改,则称其为“脏”。

http://www.gitguys.com/topics/glossary/ 脏的工作目录 如果在索引中更新文件后工作目录中的文件已更新,则工作目录将被视为“脏”。如果工作目录中的所有已修改文件都已添加到索引中,则工作目录是干净的。

如果我理解正确,“索引”也称为“暂存区”,并且当你更改它们,想要提交它们时,文件将被存储(复制到?符号链接?),但是避风港还没完成提交。 (第一个词汇表说暂存区域也可以用于合并。第二个词汇表说文件通过​​'git add'移动到那里。)

所以这两个词汇表似乎在说不相容的东西。哪个是对的?或者他们有什么方法可以正确吗?

3 个答案:

答案 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 diffgit 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)

来自torek&#39; answer

  

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文章则非常错误。你应该向他们指出这一点。