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

git add myfile.txt

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


当前回答

更新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 rm --cached FILE

使用 rm -- -- 刻录仅用于新文件不小心添加 。

吉特拥有每一个可以想象到的行动的指令, 但是它需要广泛的知识才能把事情弄好, 并且因为它充其量是反直觉的...

你以前做过的事:

  • 更改文件并使用git add .,或git add <file>.

你想怎样:

  • 从索引中删除文件, 但保留其版本, 并保留工作副本中未承诺的更改 :

     git reset HEAD <file>
    
  • 从 HEAD 将文件重置为最后一个状态, 撤消更改并将其从索引中删除 :

     # Think `svn revert <file>` IIRC.
     git reset HEAD <file>
     git checkout <file>
    
     # If you have a `<branch>` named like `<file>`, use:
     git checkout -- <file>
    

    之所以需要这样做,是因为git reset --hard HEAD单项文件不会工作。

  • 删除删除<file>从索引和版本中创建, 保留未翻过的文件, 更改工作副本 :

     git rm --cached <file>
    
  • 删除删除<file>从工作副本和版本完全版本中产生 :

     git rm <file>
    

使用使用git add -i以删除您即将承诺的添加文件 。 例如 :

添加您不想添加的文件 :

$ git add foo
$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       new file:   foo
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
# [...]#

进入交互式添加以取消您的添加( 这里输入的 git 命令是“ r”( revert) , “ 1”( 列表返回显示的第一个条目) , “ return” 退出返回模式, 以及“ q” ( quit) :

$ git add -i
           staged     unstaged path
  1:        +1/-0      nothing foo

*** Commands ***
  1: [s]tatus     2: [u]pdate     3: [r]evert     4: [a]dd untracked
  5: [p]atch      6: [d]iff       7: [q]uit       8: [h]elp
What now> r
           staged     unstaged path
  1:        +1/-0      nothing [f]oo
Revert>> 1
           staged     unstaged path
* 1:        +1/-0      nothing [f]oo
Revert>> 
note: foo is untracked now.
reverted one path

*** Commands ***
  1: [s]tatus     2: [u]pdate     3: [r]evert     4: [a]dd untracked
  5: [p]atch      6: [d]iff       7: [q]uit       8: [h]elp
What now> q
Bye.
$

这就是你的证据 证明"foo"又回到了未追踪的名单上

$ git status
# On branch master
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
# [...]
#       foo
nothing added to commit but untracked files present (use "git add" to track)
$
git add -A

用于将所有文件添加到您的承诺( 阶段) 。

git reset

是“ git 添加 - A” 命令的对面。它会删除所有要执行的分阶段文件( 手段已准备就绪 ) 。

同样,为了添加一个用于承诺的具体文件,我们使用git add <filename>相同的方式, to unstage( 或重置) 一个我们添加的具体文件git add我们使用git reset <filename> .

git 重置与 git 添加完全相反 。

撤消撤消git add用于未承诺更改的更改 :

git reset <file>

这将将文件从当前索引( “ 即将被承诺” 列表) 中删除, 而不更改其它内容 。


取消所有文件的所有更改 :

git reset

在旧的 Git 版本中,上述命令相当于git reset HEAD <file>git reset HEAD或将失效,如果HEAD未定义(因为你尚未在仓库中做出任何承诺)或模糊(因为你创建了一个分支,称为:HEAD这是你不该做的蠢事在Git 1.8.2中更改。,所以在现代版本的 Git 中,你可以使用上面的命令,甚至在你第一次做出承诺之前:

当您在历史中没有任何承诺时, “ 将重置” (没有选项或参数) 用于错误退出, 但它现在给了您一个空索引( 匹配不存在的重置, 您甚至没有在 ) 。

文 件:git 重设