我使用命令错误地将文件添加到 Git :

git add myfile.txt

我还没跑呢git commit。我如何撤销这些修改,使这些修改不包含在承诺中?


当前回答

git add myfile.txt# 这将将您的文件添加到待发列表中

与这个命令完全相反的是,

git reset HEAD myfile.txt  # This will undo it.

因此,您将处于上一个状态。指定的状态将再次出现在未跟踪的列表中(先前的状态)。

它会用指定的文件重置你的头。 所以, 如果您的头没有它意味着, 它只会重置它 。

其他回答

更新2019年更新

正如其他人在相关问题中所指出的(见A/CN.9/WG.III/WG.II),在这里, 在这里, 在这里, 在这里, 在这里, 在这里, 和在这里现在可以了取消一个单独的文件与:

git restore --staged <file>

取消所有文件以下列方式写成:

git restore --staged .

Notes

git restore2019年7月以2.23版本发布。
--staged旗帜, 它会恢复索引的内容( 在此询问什么 ) 。

运行时git status与 Saged 未经发送文件一起, Git 现在建议用这个来解开 Page 文件( 而不是git reset HEAD <file>在 v2.23 之前使用过。

git reset filename.txt

将删除命名的文件filename.txt从当前索引(也称为“存储区域”,即“即将实施”的改动”被保存的地方)中取出,不作任何其他改动(工作目录没有被覆盖)。

此命令将卸载您的更改 :

git reset HEAD filename.txt

您也可以使用

git add -p 

以添加文件的部分。

在接受的答案之外加一个, 如果你的错误添加的文档是巨大的, 你可能会注意到, 即使从索引中删除它与 ”git reset',它似乎仍然占据着空间.git目录。

这没什么可担心的;文件确实还在存储库中,但只是作为“空天体”而已。它不会被复制到其他存储库(通过克隆、推推),空间最终会被回收——也许不会很快。如果你急躁,你可以运行:

git gc --prune=now

更新更新更新(以下是我试图澄清最受重视的答案可能引起的混乱):

所以,这是真实的取消对联 联 年 月 日 月 日 月 月 日 月 月 日 月 月 月 日 月 月 日 月 月 日 月 月 月 日 月 月 日 月 月 月 日 月 的 月 月 月 日 月 月 日 月 的 月 月 月 月 日 月 月 月git add?

git reset HEAD <file> ?

git rm --cached <file>?

严格地说 如果我没弄错的话无 无.

git add 无法撤消- 安全,在一般情况下。

让我们首先回顾一下什么git add <file>实际上:

  1. 如果(如果)<file>原为之前未跟踪过, git add 添加到缓存中及其当前内容。

  2. 如果(如果)<file>原为已经跟踪, git add 保存当前内容在 Git 中, 此动作仍然被调用添加 添加, (不仅仅是更新更新更新因为文件的两个不同版本(笔记本)被视为两个不同的项目:因此,我们确实在缓存中添加一个新项目,最终将执行。

有鉴于此,问题略微模糊不清:

我使用命令错误地添加了文件...

OP的假想似乎是第一个(未跟踪文件), 我们希望“ 无法” 从跟踪项目中删除文件( 不仅仅是当前内容) 。如果(如果)情况是这样的 跑就没事了git rm --cached <file>.

我们也可以运行git reset HEAD <file>。这总的来说是可取的,因为它在两种情况下都有效:当我们错误地添加了已经追踪到的项目的版本时,它也会产生相反的结果。

但有两个警告。

第一:(如在答复中所指出)只有一种情况是:git reset HEAD不工作,但git rm --cached确实: 一个新的仓库( 不承诺) 。 但实际上, 这实际上是一个无关紧要的案件 。

第二:注意git reset HEAD无法神奇地收回先前的缓存文件内容, 它只会从 HEAD 中恢复同步 。 如果被误导git add我们无法收回先前的未承诺版本。 因此,严格地说,我们无法撤销 [*] 。

示例:

$ git init
$ echo "version 1" > file.txt
$ git add file.txt   # First add of file.txt
$ git commit -m 'first commit'
$ echo "version 2" > file.txt
$ git add  file.txt   # Stage (don't commit) "version 2" of file.txt
$ git diff --cached file.txt
-version 1
+version 2
$ echo "version 3" > file.txt
$ git diff  file.txt
-version 2
+version 3
$ git add  file.txt    # Oops we didn't mean this
$ git reset HEAD file.txt  # Undo?
$ git diff --cached file.txt  # No dif, of course. stage == HEAD
$ git diff file.txt   # We have irrevocably lost "version 2"
-version 1
+version 3

当然,如果我们只是遵循通常的懒惰工作流程,只做“Git add”来添加新文件(第1个案例),而我们通过承诺更新新内容,这并非非常关键,git commit -a命令。


* (编辑:上述内容实际上是正确的,但是仍然可以有一些稍有黑客/参与的方式来恢复已经形成但并未实施、但又被推翻的变革——见Johannes Matokic和iolsmit的评论)

键入 :

git status

Git会告诉你什么是舞台,等等, 包括关于如何解除舞台的指示:

use "git reset HEAD <file>..." to unstage

我发现吉特做的相当不错 裸体我做正确的事情 在这样的情况下。

注:最近Git版本(1.8.4.x)更改了此电文:

(use "git rm --cached <file>..." to unstage)