Git '的意外行为;吉特rm';

Git '的意外行为;吉特rm';,git,Git,给定一个Git存储库和一个提交的文件a 我使用O/S命令删除文件:$rm a 调用git status返回: On branch master Changes not staged for commit: (use "git add/rm <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working direct

给定一个Git存储库和一个提交的文件
a

我使用O/S命令删除文件:
$rm a

调用
git status
返回:

On branch master
Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        deleted:    a

no changes added to commit (use "git add" and/or "git commit -a")
Git的手册页对命令的描述
Git rm

从索引或工作树和索引中删除文件

根据我的理解,在上面的命令序列中发生的是
git rm
将删除文件的更改放入暂存区域(我使用的是索引的同义词),而不是从中删除某些内容


我在这里的误解是什么?

实际上
git rm
从本地目录中删除文件,更改将在下一次提交时推送到存储库。因此,在您的存储库中无法再看到已删除的文件。使用
rm
时,文件将仅从本地存储库中删除,更改不会写入原始repo。因此,您不必在
git-rm
之前使用
rm
,实际上
git-rm
会从本地目录删除文件,并且在下一次提交时会将更改推送到存储库。因此,在您的存储库中无法再看到已删除的文件。使用
rm
时,文件将仅从本地存储库中删除,更改不会写入原始repo。因此,您不必在
git-rm
之前使用
rm
git-rm
所做的是将索引更改为从工作目录中删除文件。因此,您准备删除一个文件。这听起来可能有点奇怪,但这是你能想到的最清晰的方式

提交包含更改,即您以前进行的更改。通常的更改包括新文件和文件更改,但也包括文件删除。因此,删除文件被认为是一种更改,通过调用
git-rm
,您将该更改添加到索引中

这是顺便说一句。为什么您可以使用诸如
git add-u
之类的东西来添加所有挂起的更改,并且还包括文件删除:文件删除是一个挂起的更改,因此当您添加它时,您添加更改以删除文件



此外,什么
git rm
也可以从工作目录中物理删除文件。因此,如果您没有首先使用
rm
删除该文件,Git也会将其从工作目录中删除。如果文件已经被删除,那么Git将只进行删除更改。与此相关的是
git rm--cached
,它也将阶段性地删除文件,但不会从工作目录中物理删除文件。因此,这只会进行更改以删除文件(尽管该更改尚未实际执行)。

git rm所做的是添加对索引的更改,以从工作目录中删除文件。因此,您准备删除一个文件。这听起来可能有点奇怪,但这是你能想到的最清晰的方式

提交包含更改,即您以前进行的更改。通常的更改包括新文件和文件更改,但也包括文件删除。因此,删除文件被认为是一种更改,通过调用
git-rm
,您将该更改添加到索引中

这是顺便说一句。为什么您可以使用诸如
git add-u
之类的东西来添加所有挂起的更改,并且还包括文件删除:文件删除是一个挂起的更改,因此当您添加它时,您添加更改以删除文件


此外,什么
git rm
也可以从工作目录中物理删除文件。因此,如果您没有首先使用
rm
删除该文件,Git也会将其从工作目录中删除。如果文件已经被删除,那么Git将只进行删除更改。与此相关的是
git rm--cached
,它也将阶段性地删除文件,但不会从工作目录中物理删除文件。因此,这只会将更改转移到删除文件的阶段(尽管该更改尚未实际执行)。

索引不是更改列表。克隆包含大型项目的回购协议。不要改变任何事,不要上演任何事

ls -l .git/index
为什么它这么大?索引不是空的吗?不,因为索引不是变化列表

索引包含项目快照的表示形式。(或者,在合并过程中,多个这样的表示形式。)提交也是项目的快照

许多命令,如
status
,根据与另一版本(在本例中为
HEAD
commit)的差异来解释项目的一种状态(在本例中为暂存状态)

如果我创建了一个新的回购协议,在
master
上签出,创建
file1
file2
,并提交它们,那么新提交包含两个文件,索引也包含两个文件

正如文档准确指出的那样,
git rm file1
将从索引中删除
file1
git status
会将索引与现有提交进行比较,看到
file1
在后者中,而不是前者,它会说“delete
file1
”是为提交而进行的更改。

索引不是更改列表。克隆包含大型项目的回购协议。不要改变任何事,不要上演任何事

ls -l .git/index
为什么它这么大?索引不是空的吗?不,因为索引不是变化列表

索引包含项目快照的表示形式。(或者,在合并过程中,多个这样的表示形式。)提交也是项目的快照

许多命令,如
status
,根据不同的状态解释项目的一种状态(在本例中是暂存状态)
 Working   Staging   HEAD  
--------- --------- ------ 
 a         a         a     
 Working   Staging   HEAD  
--------- --------- ------ 
 -         a         a   
 Working   Staging   HEAD  
--------- --------- ------ 
 -         -         a   
 Working   Staging   HEAD  
--------- --------- ------ 
 a         -         a