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

Chr*_*nix 12 git

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 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
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`文档可能在这方面有所清理(特别是与`git`相关的非官方第三方的东西,如果你不小心的话,就质量而言往往会遍布整个地图去...). (3认同)

Von*_*onC 7

托雷克回答

什么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也使用了这个不正确的术语。


Mad*_*ist 5

根据官方 Git 文档,在关于Stashing的部分中,脏状态被定义为... the dirty state of your working directory — that is, your modified tracked files and staged changes。根据这个定义,提交提交的文件也是脏的。这意味着kernel.org文章是正确的,而gitguys.com文章几乎是错误的。你可能应该向他们指出这一点。