git rm缓存和git reset HEAD之间的区别

时间:2013-06-15 10:11:03

标签: git version-control

我猜对了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)  

那发生了什么?

3 个答案:

答案 0 :(得分:12)

这是一种思考方式:

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之前的那样(当使用&#34; git add。&#34;时)。

现在,第二个例子是我使用 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的状态重置为未暂停状态,但仍会继续跟踪其更改。

答案 1 :(得分:6)

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直接在索引中工作。

答案 2 :(得分:0)

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