11

我很困惑,git rm --cached我猜。
我有一个存储库和一个提交的文件。我修改了文件,然后我做了:git add myfile
文件现在已暂存。
当我这样做时git status

# On branch master   
# Changes to be committed:  
#   (use "git reset HEAD <file>..." to unstage)  
#  
#       modified:   com/main/StringMain.java  
#  

现在该文件是修改后的跟踪文件。所以我认为那是在临时区域。所以我无法理解推荐的含义(use "git reset HEAD <file>..." to unstage)。所以我做了:git rm --cached而不是后面跟着一个git commit. 但这似乎使我的文件无法被跟踪并使其无法跟踪。
如果我这样做git status

# On branch master  
# Untracked files:  
#   (use "git add <file>..." to include in what will be committed)  
#  
#       com/  
nothing added to commit but untracked files present (use "git add" to track)  

那么发生了什么?

4

3 回答 3

15

这是一种思考方式:

git rm --cached [file]

这只是从跟踪中删除文件(文件添加后的状态 - 即 git add [file]

git reset HEAD [file]

这只是继续跟踪对文件的更改,但会将其放回“未暂存”区域。

这是一个例子。

首先,我创建了 4 个未跟踪的文件:

$ for i in {A..D}; do touch $i; echo "First line" > $i; done
$ ls
A   B   C   D
$ git status
On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)

    A
    B
    C
    D

nothing added to commit but untracked files present (use "git add" to track)

接下来,我使用 git add 跟踪它们,然后我将提交更改:

$ git add .

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

    new file:   A
    new file:   B
    new file:   C
    new file:   D

$ git commit -m "First Commit"
[master 6e8d625] First Commit
 4 files changed, 4 insertions(+)
 create mode 100644 A
 create mode 100644 B
 create mode 100644 C
 create mode 100644 D

$ git status
On branch master
nothing to commit, working directory clean

现在我将修改文件 A 以便 git 获取更改,然后将更改的文件添加到暂存区域:

$ echo "First line of file A" > A

$ git status
On branch master
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:   A

no changes added to commit (use "git add" and/or "git commit -a")

$ git add A

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

    modified:   A

现在这就是差异重要的地方。

我要给你的第一个例子是当你使用git rm --cached时会发生什么:

$ git rm --cached A
rm 'A'

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

    deleted:    A

Untracked files:
  (use "git add <file>..." to include in what will be committed)

    A

注意文件 A 现在是如何未被跟踪的,就像一开始将它添加到 git 之前的样子(当使用“ git add . ”时)。

现在,第二个例子是如果我使用git reset HEAD代替:

$ git reset HEAD A
Unstaged changes after reset:
M   A

$ git status
On branch master
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:   A

no changes added to commit (use "git add" and/or "git commit -a")

在这里您会注意到它将文件 A 的状态重置为未暂存状态,但仍继续跟踪它的更改。

于 2015-07-04T18:31:35.443 回答
7

git rm --cached从索引中删除文件。

git reset HEAD将文件的索引版本重置回HEAD提交中的状态。

所以区别在于第一个删除文件,而第二个将它恢复到最后提交的版本。


为了验证这一点,您可以使用git diff将工作树与索引git diff --cached进行比较,并将索引与头部提交进行比较。

当您运行git rm --cached时,修改后的文件将从索引中完全删除。它仍然存在于工作目录和最后一次提交中。如果将索引与上次提交进行比较:

git diff --cached modified_file

您会看到修改后的文件不在索引中。这通过以下方式得到证实:

git status

这将显示文件计划在提交时删除。您的工作目录不受 影响git rm --cached,因为--cached直接在索引中工作。

于 2013-06-15T11:08:40.143 回答
0

假设您从暂存区(git rm 文件)中删除了一个文件,因此它从您的工作目录和暂存区中删除了该文件,现在让我们再次删除它,但在您暂存它之后,所以您已暂存但不在您的暂存区工作目录,如果你使用 git rm --cached file ,你会把你的文件放回你的工作目录(git也不再跟踪它,它不会告诉你暂存它),但是如果你使用 git reset HEAD file ,文件已从舞台区域中删除,而无需返回您的工作目录。

于 2020-06-13T14:45:11.837 回答