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的状态重置为未暂停状态,但仍会继续跟踪其更改.
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直接在索引中工作.
| 归档时间: |
|
| 查看次数: |
8715 次 |
| 最近记录: |