有时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
#

当前回答

如果有问题的文件已经在repo中并且处于版本控制之下(以前提交过等),这两个命令有几个微妙的区别:

git reset HEAD <file>取消当前提交的文件。 Git rm——cached <file>将取消该文件以供将来提交。直到git add <file>再次添加它之前,它都是不暂存的。

还有一个更重要的区别:

在运行git rm——cached <file>并将你的分支推到远程,任何从远程拉你的分支的人都会从他们的文件夹中实际删除这个文件,即使在你的本地工作集中,这个文件只是变得不被跟踪(即没有从文件夹中物理删除)。

最后一个区别对于包含配置文件的项目很重要,其中团队中的每个开发人员都有不同的配置(即不同的基本url, ip或端口设置),所以如果你使用git rm——cached <file>,任何拉你的分支的人都必须手动重新创建配置,或者你可以将你的配置发送给他们,他们可以重新编辑回他们的ip设置(等),因为删除只会影响从远程拉你的分支的人。

其他回答

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

git restore --staged abc.html

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

git restore --staged .

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

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

如果你无意中暂存了不想提交的文件,并且想要确保保留更改,你也可以使用:

git stash
git stash pop

这将执行HEAD重置并重新应用您的更改,允许您重新提交单个文件。如果你忘记了为pull请求创建一个特性分支(git stash;Git checkout -b <feature>;Git stash pop)。

如果有问题的文件已经在repo中并且处于版本控制之下(以前提交过等),这两个命令有几个微妙的区别:

git reset HEAD <file>取消当前提交的文件。 Git rm——cached <file>将取消该文件以供将来提交。直到git add <file>再次添加它之前,它都是不暂存的。

还有一个更重要的区别:

在运行git rm——cached <file>并将你的分支推到远程,任何从远程拉你的分支的人都会从他们的文件夹中实际删除这个文件,即使在你的本地工作集中,这个文件只是变得不被跟踪(即没有从文件夹中物理删除)。

最后一个区别对于包含配置文件的项目很重要,其中团队中的每个开发人员都有不同的配置(即不同的基本url, ip或端口设置),所以如果你使用git rm——cached <file>,任何拉你的分支的人都必须手动重新创建配置,或者你可以将你的配置发送给他们,他们可以重新编辑回他们的ip设置(等),因为删除只会影响从远程拉你的分支的人。

>并不取消文件,它实际上是从repo中删除文件(假设它之前已经提交),但将文件留在你的工作树中(留下一个未跟踪的文件)。

git reset——<filePath>将取消对给定文件的任何阶段性更改。

也就是说,如果您使用缓存在一个新文件上的git rm—,它基本上看起来就像您刚刚取消了它的暂存,因为它之前从未提交过。

更新git 2.24 在这个新版本的git中,你可以使用git restore - staging而不是git reset。 参见git文档。