Git '的意外行为;吉特rm';
给定一个Git存储库和一个提交的文件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
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
在后者中,而不是前者,它会说“deletefile1
”是为提交而进行的更改。索引不是更改列表。克隆包含大型项目的回购协议。不要改变任何事,不要上演任何事
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