我错误地使用以下命令将文件添加到Git:
git add myfile.txt
我还没有运行git commit
命令。我该如何撤销这个操作,以便这些更改不会被提交?
git reset
。但是,我找到了一篇非常好的文章,实际上为git unadd
添加了Git命令(别名):请参见git unadd了解详细信息或者..简单地说,git config --global alias.unadd "reset HEAD"
现在你可以
git unadd foo.txt bar.txt
或者 / 直接:
git reset HEAD foo.txt bar.txt
git add
操作?你只需要使用 git unadd
命令。这是正确的答案。 - gndpsgit reset filename.txt
将从当前索引(也称为“暂存区”,其中保存了即将提交的更改)中删除名为filename.txt
的文件,而不改变其他任何内容(工作目录不会被覆盖)。
man git
中的“Reset, restore and revert”解释了这三个类似且重叠的命令(命令的过多表明首先命令结构不佳),说 git reset “更改提交历史记录”,但在这里却没有?它还说 git restore “不会更新您的分支”。如果没有任何更改,那么这个命令到底是在做什么?“分支”实际上是什么意思?在您的评论中,“anything else”是什么意思?有时人们使用假定的上下文,并遵循建议可能会造成损失。 - NeilG如果您的代码库是初始提交(即没有任何提交记录),无法使用 git reset
,那么可以考虑宣布"Git破产"并删除 .git
文件夹,然后重新开始。
git add -A && git rm --cached EXCLUDEFILE && git commit -m 'awesome commit'
(当没有先前的提交时,也适用,关于“无法解析'HEAD'”的问题)。 - user246672正如其他相关问题中所指出的(请参见这里,这里,这里,这里,这里,这里和这里),您现在可以使用以下命令取消暂存单个文件:
git restore --staged <file>
使用以下命令取消暂存所有文件(从存储库的根目录开始):
git restore --staged .
git restore
是在2019年7月引入的,并在2.23版本中发布。
使用--staged
标志,它将恢复索引的内容(这就是本文所要求的内容)。
当使用已暂存但未提交的文件运行git status
时,Git现在建议使用它来取消暂存文件(而不是在v2.23之前使用的git reset HEAD <file>
)。
git restore --staged .
与 git reset .
有何不同吗? - Dan Dascalescugit reset File.txt
多个文件
git reset File1.txt File2.txt File3.txt
假设您错误地添加了Home.js,ListItem.js和Update.js,
并希望撤消/重置 =>
git reset src/components/home/Home.js src/components/listItem/ListItem.js src/components/update/Update.js
使用Git GUI的相同示例。
git gui
打开一个窗口。取消选中您的文件,从已暂存的更改(将提交)中移除。
git restore --staged <file>...
而不是你提供的解决方案XD - Kim使用 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”(恢复),“1”(revert显示的第一个条目),'return'退出撤销模式,和“q”(退出)):
$ 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 init
命令。如果您没有任何提交记录,Git会让使用git reset
变得非常困难。为了有一个提交记录,您可以创建一个微小的初始提交,并在此之后可以使用git add -A
和git reset
多次进行更改以达到正确性。
这种方法的另一个优点是,如果以后遇到行结尾问题并需要刷新所有文件,这很容易:
autocrlf
值... 这种方法不适用于所有项目,具体取决于设置。 - sjasgit reset somefile
和 git reset
都是有效的。自几个 Git 版本以来就是这种情况。 - Mark Amery请注意,如果您未指定修订版本,则必须包含分隔符。以下是我控制台中的示例:
git reset <path_to_file>
fatal: ambiguous argument '<path_to_file>': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions
git reset -- <path_to_file>
Unstaged changes after reset:
M <path_to_file>
(Git版本1.7.5.4)
git reset <path>
,没有分隔符也可以正常工作。我还在使用 git 1.9.0 版本。也许在旧版本中无法正常工作? - user456814也许自您发布这个问题以来,Git已经发生了变化。
$> git --version
git version 1.6.2.1
现在,您可以尝试:
git reset HEAD .
这应该是你要找的内容。git rm --cached FILE
只有在意外添加新文件时才使用rm --cached。
HEAD
或head
的答案现在可以使用@
代替HEAD
。请参见此答案(最后一节)了解为什么可以这样做。 - user456814