有时git会建议git rm——cached来取消文件,有时git会重置HEAD文件。什么时候用哪个?

D:\code\gt2>git init
Initialized empty Git repository in D:/code/gt2/.git/
D:\code\gt2>touch a

D:\code\gt2>git status
# On branch master
#
# Initial commit
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       a
nothing added to commit but untracked files present (use "git add" to track)

D:\code\gt2>git add a

D:\code\gt2>git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
#
#       new file:   a
#
D:\code\gt2>git commit -m a
[master (root-commit) c271e05] a
 0 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 a

D:\code\gt2>touch b

D:\code\gt2>git status
# On branch master
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       b
nothing added to commit but untracked files present (use "git add" to track)

D:\code\gt2>git add b

D:\code\gt2>git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       new file:   b
#

当前回答

只使用:

git重置HEAD <文件名>

这将取消该文件并保留您对其所做的更改,因此您可以反过来更改分支,git会将这些文件添加到另一个分支。保留所有更改。

其他回答

在我看来,git rm——cached <file>从索引中删除了文件,而没有从目录中删除它,而普通的git rm <file>将两者都做,就像OS rm <file>将从目录中删除文件而没有删除它的版本。

在> 2.2的新版本中,你可以使用git restore——staging <file_name>。 请注意这里 如果你想一次取消(移动到更改)你的文件,你可以使用上面的命令和你的文件名。如

git restore --staged abc.html

现在,如果您想一次性取消所有文件,您可以这样做

git restore --staged .

请注意空格和点(.)表示考虑将所有文件分段。

假设你通过git add <folder>暂存整个目录,但是你想从暂存列表(即运行git状态时生成的列表)中排除一个文件,并将修改保留在排除的文件中(你正在做一些事情,它还没有准备好提交,但你不想失去你的工作…)你可以简单地使用:

Git重置<文件>

当您运行git status时,您将看到您重置的任何文件都是非暂存的,而您添加的其余文件仍然在暂存列表中。

仅适用于版本2.23及以上,

除了这些建议,你可以使用 Git恢复—staging <文件>,以便取消文件的阶段。

取消暂存文件(取消git添加)

将file.js的最后一个版本从repo复制到index

丢弃局部更改

将file.js从索引复制到工作目录

file2.js #恢复工作目录下的多个文件

Git恢复。#丢弃所有本地更改(除了未跟踪的文件)

git clean -fd #删除所有未跟踪的文件