我猜对了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)
那发生了什么?
答案 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文件, ,则文件将从舞台区域中删除,而无需返回到您的工作目录。