0

当我像这样删除文件时

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
$
4

1 回答 1

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但确实有的修订版newfile。Agit 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冻结该安排的副本,永久可用。在 you 之前commit,git 假设您还不太满意。 git status将当前阶段的安排与HEAD提交进行比较并总结差异*,它并不关心您添加或删除或移动了多少次,它只是比较“阶段现在的样子”与“它的样子”在最后一次冻结”。

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

于 2013-08-29T21:45:30.683 回答