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

Cra*_*lus 11 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  
#  
Run Code Online (Sandbox Code Playgroud)

现在该文件是经过修改的跟踪文件.所以我认为这是在临时区域.所以我无法理解推荐的含义是什么(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)  
Run Code Online (Sandbox Code Playgroud)

那发生了什么?

Eth*_*ter 14

这是一种思考方式:

git rm --cached [file]
Run Code Online (Sandbox Code Playgroud)

这只是删除一个文件被跟踪(文件在添加后的状态 - 即 git add [file])

git reset HEAD [file]
Run Code Online (Sandbox Code Playgroud)

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

这是一个例子.

首先,我创建了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)
Run Code Online (Sandbox Code Playgroud)

接下来,我使用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
Run Code Online (Sandbox Code Playgroud)

现在我将修改文件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
Run Code Online (Sandbox Code Playgroud)

现在这是差异很重要的地方.

我将给你的第一个例子是当你使用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
Run Code Online (Sandbox Code Playgroud)

注意文件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")
Run Code Online (Sandbox Code Playgroud)

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


And*_*mar 7

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

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

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


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

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

git diff --cached modified_file
Run Code Online (Sandbox Code Playgroud)

您将看到修改后的文件不存在于索引中.这证实了:

git status
Run Code Online (Sandbox Code Playgroud)

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