删除文件并从Git的暂存索引中删除

时间:2013-08-29 21:00:29

标签: git version-control

当我删除这样的文件时

git rm file_name.ext

我必须提交这些更改吗?为什么呢?

如果我必须提交,我会这样做吗?

git commit . -m "Delete file_name.txt"

这就是为什么我问:我将错误的文件添加到Git的登台索引

git add wrong_file.txt

所以我删除了它

git reset HEAD wrong_file.txt

但在这样做之后,我注意到了这条消息

$ git reset HEAD wrong_file.txt
$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       deleted:    test2.txt
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       wrong_file.txt
$

当我将正确的文件添加到登台索引时,我注意到我删除的test2.txt文件已重命名为right_file.txt

$ touch right_file.txt &&  git add right_file.txt
$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       renamed:    test2.txt -> right_file.txt
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       wrong_file.txt
$

1 个答案:

答案 0 :(得分:1)

最短的答案:“是的”。在您git commit之前,您的更改仅存储在索引(暂存区域)中。 commit操作接受所有分阶段的更改,并创建一个包含所有这些更改的新单个提交,“永远”保留它们(除非您执行“重写历史记录”,因为它被称为)。

来自git status的“重命名”消息基于将要删除的文件与要添加的文件进行比较。如果内容匹配,git会假设(在status输出中)您必须重命名该文件,而不是删除它并添加另一个文件。例如:

$ mkdir t; cd t; git init; git commit --allow-empty -m initial
Initialized empty Git repository in ...
[master (root-commit) bca9d63] initial
$ $ echo 'file contents' > somefile
$ git add somefile && git commit -m c1
[master c37af4b] c1
 1 file changed, 1 insertion(+)
 create mode 100644 somefile

现在我有一个包含两个提交的回购,初始为空,而“c1”(c37af4b)包含somefile

$ git rm somefile
rm 'somefile'
$ echo 'file contents' > newfile
$ git add newfile

我删除了somefile并创建了一个新文件,但其内容与我删除的文件完全相同,因此git status会检测到这一点:

$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   renamed:    somefile -> newfile
#

完成git commit后,我的修订版不再具有somefile,但确实有newfilegit diff还会检测到文件看起来完全一样,并假设我重命名了它:

$ git commit -m c2
[master a85cea2] c2
 1 file changed, 0 insertions(+), 0 deletions(-)
 rename somefile => newfile (100%)
$ git diff HEAD^
diff --git a/somefile b/newfile
similarity index 100%
rename from somefile
rename to newfile

临时区域(又名索引)是您安排事物的地方,直到您喜欢这些安排。然后你commit冻结该安排的副本,永远可用。直到你commit,git假设你还不太满意。 git status将当前阶段安排与HEAD提交进行比较,并总结差异*,并不真正关心您添加,移除或移动事物的次数,它只是比较“阶段是什么”看起来现在“反对”最后一次冻结的样子“。

[*它还将阶段与工作目录进行比较,并将 差异汇总为“未提交的更改”和/或“未跟踪文件”。]