如何在提交前撤消'git add'?

pax*_*977 8567 git version-control git-commit git-stage

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

git add myfile.txt
Run Code Online (Sandbox Code Playgroud)

我还没跑git commit.有没有办法撤消这个,所以这些文件不会包含在提交中?


到目前为止有48个答案(有些已删除).除非您有一些新信息,否则请不要添加新的.

gen*_*ack 9777

您可以git add在提交之前撤消

git reset <file>
Run Code Online (Sandbox Code Playgroud)

这将从当前索引("即将提交"列表)中删除它而不更改任何其他内容.

您可以使用

git reset
Run Code Online (Sandbox Code Playgroud)

没有任何文件名来取消所有应有的更改.当在合理的时间内逐个列出太多文件时,这可以派上用场.

在旧版本的Git中,上面的命令分别等同于git reset HEAD <file>,git reset HEAD如果HEAD未定义(因为你还没有在你的repo中做过任何提交)或者模糊不清(因为你创建了一个叫做的分支HEAD,这是一个愚蠢的事情)将会失败你不应该这样做.这是在Git的1.8.2改变,虽然如此,在Git中的现代版本,你可以使用,甚至在决策前上方的命令,你的第一个承诺:

当您在历史记录中没有任何提交时,"git reset"(没有选项或参数)用于错误输出,但它现在为您提供一个空索引(以匹配不存在的提交您甚至没有).

  • 当然,这不是一个真正的撤销,因为如果错误的`git add`覆盖了以前的阶段性的uncommited版本,我们就无法恢复它.我试着在下面的答案中澄清这一点. (81认同)
  • @Jonny,索引(也称为临时区域)包含*all*文件,而不仅仅是已更改的文件.它"启动生命"(当您检出提交或克隆存储库时)作为HEAD指向的提交中的所有文件的副本.因此,如果您*从索引中删除*文件(`git rm --cached`),则表示您准备进行*删除*该文件的提交.另一方面,`git reset HEAD <filename>`会将文件从HEAD复制到索引,这样下一次提交就不会显示对该文件所做的任何更改. (15认同)
  • 我刚刚发现有一个`git reset -p`就像`git add -p`.这太棒了! (9认同)
  • 你实际上**可以恢复覆盖以前上演但未完成的更改**但不是以用户友好的方式而不是100%安全(至少没有我找到):goto .git/objects,搜索在`git时创建的文件添加`你要恢复(`61/3AF3 ...` - >对象ID`613AF3 ...`),然后`git cat-file -p <object-id>`(可能值得它恢复几个小时工作,但也经常教训...) (7认同)
  • `git reset HEAD*.ext`其中`ext`是你要取消添加的给定扩展名的文件.对我来说,它是`*.bmp`和`*.zip` (6认同)
  • 从 git 2.23.0 开始,现在可以使用“git Restore --staged &lt;file&gt;...”来取消暂存。请参阅/sf/answers/1123149121/ (3认同)
  • 那么“添加”的反义词是“重置”?“去除”呢? (2认同)
  • `-p` 绝对是很棒的,它被用在很多 git 命令中(不仅仅是重置和添加)。但是为了回答@WeDoTDD.com 和@Johnny,`git reset` 本身只是清除 Git 是否“知道”这些变化;它不会清除更改本身。为此,您需要执行`git checkout someFile.txt`(针对单个文件)或`git reset --hard`(将所有内容清除干净)。但是,这些命令中的任何一个都不会返回,因此在使用它们时要非常小心。 (2认同)

Rhu*_*arb 2105

你要:

git rm --cached <added_file_to_undo>
Run Code Online (Sandbox Code Playgroud)

推理:

当我刚接触这个时,我首先尝试过

git reset .
Run Code Online (Sandbox Code Playgroud)

(撤消我的整个初始添加),只是为了得到这个(不那么)有用的消息:

fatal: Failed to resolve 'HEAD' as a valid ref.
Run Code Online (Sandbox Code Playgroud)

事实证明这是因为HEAD ref(branch?)直到第一次提交之后才存在.也就是说,如果你的工作流程像我一样,你会遇到和我一样的初学者问题:

  1. cd到我伟大的新项目目录,尝试Git,新的热点
  2. git init
  3. git add .
  4. git status

    ......很多废话卷轴......

    =>该死,我不想加上所有这些.

  5. 谷歌"撤消git添加"

    =>找到Stack Overflow - yay

  6. git reset .

    =>致命:无法将'HEAD'解析为有效的参考号.

事实证明,在邮件列表中存在一个针对此无益的错误.

并且正确的解决方案就在Git状态输出中(是的,我把它作为'废话'掩盖了)

...
# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
...
Run Code Online (Sandbox Code Playgroud)

而解决方案确实是使用git rm --cached FILE.

请注意此处其他地方的警告 - git rm删除文件的本地工作副本,但如果使用--cached则不会删除.这是结果:git help rm

--cached使用此选项仅从索引中取消暂存和删除路径.将保留工作树文件,无论是否已修改.

我继续使用

git rm --cached .
Run Code Online (Sandbox Code Playgroud)

删除所有内容并重新开始.虽然没有工作,因为虽然add .是递归的,但结果rm需要-r递归.叹.

git rm -r --cached .
Run Code Online (Sandbox Code Playgroud)

好的,现在我回到了我开始的地方.下次我要用-n来做干运行,看看会添加什么:

git add -n .
Run Code Online (Sandbox Code Playgroud)

我相信前拉上了一切到一个安全的地方git help rm关于--cached不破坏任何东西(和什么如果我拼错了它).

  • git rm --cached <file>实际上是正确的答案,如果它是<file>初始导入到存储库中.如果您尝试取消对文件的更改,git reset是正确的答案.人们说这个答案是错误的,正在考虑一个不同的问题. (16认同)
  • 这实际上是可行的,但**仅在第一次提交时**,之前文件不存在,或者`git add`命令添加新文件,**但不是**更改现有文件. (14认同)
  • 哈.我遵循了同样的过程.除了我放弃并说`rm -rf .git`,`git init`因为我不相信`git rm --cached`来保留我的工作副本.它说了一些git在某些地方仍然过于复杂的说法.`git unstage`应该只是一个库存标准命令,我不在乎我是否可以将它添加为别名. (13认同)
  • 对我来说,git说`git reset HEAD <File> ...` (5认同)
  • 只是表明git是多么不直观和错综复杂.而不是并行"撤消"命令,你必须找到如何撤消它们.就像试图用快速的沙子释放你的腿,然后让你的手臂卡住,然后让你的另一只手臂卡住...每个命令都应该通过GUI完成,下拉菜单项可以选择...想想所有的UI,我们已经拥有的生产力提升,但我们有一个复古的命令行界面.它不像git GUI程序使这更直观. (4认同)
  • 这样做并删除了我所有其他现有文件 - 未更改 - 从 git 备份中删除。重新添加它们会使所有内容变大并破坏正确的历史记录。Git 完全是一个未完成的项目。 (2认同)
  • 根据git版本1.8.1.4的`git status`输出,取消新文件的正确方法是:`git reset HEAD <file> ...` (2认同)
  • @BarryKelly不,这不是正确的答案.你真正想要做的是`git reset`来撤销所有添加的文件,或者`git reset <file>`来撤消特定的添加文件.`git rm --cached`可能在表面上工作,但实际发生的是它将它从跟踪历史记录中移除,这不是你想要做的,除非你将该文件添加到gitignore文件中,该文件不应该首先是跟踪,然后在那种情况下就可以了. (2认同)
  • 为什么不删除隐藏的.git文件夹,大声笑..然后再次执行git init ...(假设您是第一次进行git repo并且没有做任何提交) (2认同)
  • 如果文件尚未在索引中,请使用`git rm --cache &lt;filename&gt;`;如果文件已在索引中,但是您不希望它们包含在此提交中,请使用`git reset &lt;filename&gt;`。 (2认同)
  • 此命令清除/删除索引中的内容。OP 和其他人真正想要的是撤销索引中的更改而不是删除内容。git重置。是正确答案。 (2认同)

Pau*_*ham 522

如果输入:

git status
Run Code Online (Sandbox Code Playgroud)

git会告诉你什么是上演的,包括如何取消演示的说明:

use "git reset HEAD <file>..." to unstage
Run Code Online (Sandbox Code Playgroud)

我发现git在推动我在这样的情况下做正确的事情方面做得非常好.

注意:最近的git版本(1.8.4.x)已更改此消息:

(use "git rm --cached <file>..." to unstage)
Run Code Online (Sandbox Code Playgroud)

  • 根据是否已经跟踪"添加"文件("添加"仅将新版本保存到缓存 - 这里它将显示您的消息),消息将有所不同.在其他地方,如果该文件以前没有上演过,它将显示"use"git rm --cached <file> ..."to unstage` (16认同)
  • 自 Git v2.23 以来,该消息再次发生了变化。现在显示“git Restore --staged &lt;file&gt;”。请参阅下面的[我的答案](/sf/answers/4379835351/)以获取更新。 (10认同)
  • 我的 git 版本 2.14.3 说`git reset HEAD` 取消暂存。 (2认同)

tak*_*hin 243

澄清:git add将更改从当前工作目录移动到暂存区域(索引).

此过程称为分段.所以最自然的命令阶段的变化(修改过的文件)是明显的:

git stage
Run Code Online (Sandbox Code Playgroud)

git add 只是更容易键入别名 git stage

可惜没有git unstage也没有git unadd命令.相关的一个更难猜测或记住,但很明显:

git reset HEAD --
Run Code Online (Sandbox Code Playgroud)

我们可以轻松地为此创建一个别名:

git config --global alias.unadd 'reset HEAD --'
git config --global alias.unstage 'reset HEAD --'
Run Code Online (Sandbox Code Playgroud)

最后,我们有了新的命令:

git add file1
git stage file2
git unadd file2
git unstage file1
Run Code Online (Sandbox Code Playgroud)

我个人使用更短的别名:

git a # For staging
git u # For unstaging
Run Code Online (Sandbox Code Playgroud)

  • 为什么这很明显? (4认同)
  • 我同意,Linus Torvalds 没有创建 simmetric 命令,而是为不同的命令创建了一个新词,这非常烦人。对于 simmetric,我的意思是:提交 - 取消提交;阶段-取消阶段。或者可用于许多命令的关键字UNDO:git commit X - git UNDO commit x。背诵很多单词似乎是很自然的事情。不经常使用的内容很容易被遗忘......而我们都在这一页上 (3认同)
  • "动作"?这表明它已从工作目录中删除.事实并非如此. (2认同)

leo*_*loy 164

对于已接受的答案的补充,如果您错误添加的文件很大,您可能会注意到,即使在使用' git reset' 将索引从索引中删除之后,它仍然会占用.git目录中的空间.这没什么可担心的,文件确实仍在存储库中,但只是作为"松散对象",它不会被复制到其他存储库(通过克隆,推送),并且该空间最终将被回收 - 尽管也许不是很快.如果你很焦虑,你可以运行:

git gc --prune=now
Run Code Online (Sandbox Code Playgroud)

更新(以下是我尝试清除最多投票答案可能引起的混淆):

所以,这是真正的撤销git add

git reset HEAD <file>

要么

git rm --cached <file>

严格地说,如果我没有弄错:没有.

git add 一般来说,不能放松 - 安全.

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

  1. 如果<file>之前未跟踪过,git add 请将添加到缓存中,并使用其当前内容.

  2. 如果<file>已经跟踪,git add 保存当前内容(快照,版本)到缓存中.在GIT中,这个动作仍称为add,(不仅仅是更新它),因为文件的两个不同版本(快照)被视为两个不同的项目:因此,我们确实在缓存中添加了一个新项目,最终稍后提交.

鉴于此,问题有点含糊:

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

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
Run Code Online (Sandbox Code Playgroud)

当然,如果我们只是按照通常的懒惰工作流程来执行'git add'仅用于添加新文件(案例1),并且我们通过commit,git commit -a命令更新新内容,这不是非常关键.


*(编辑:以上几乎是正确的,但仍然可以有一些稍微讨厌/错综复杂的方法来恢复已上演但未提交然后被覆盖的更改 - 请参阅Johannes Matokic和iolsmit的评论)

  • __恢复已暂存但未提交然后被另一个`git add`覆盖的更改的另一种方法是通过`git fsck --unreachable`,它将列出所有无法访问的obj,然后您可以通过`git show SHA-1_ID`检查或 `git fsck --lost-found` 将 &gt; 将悬空对象写入 `.git/lost-found/commit/` 或 `.git/lost-found/other/`,具体取决于类型。另见`git fsck --help` (6认同)
  • 严格来说,有一种方法可以恢复已经被git add替换的已经暂存的文件.正如你所提到的,git add为该文件创建了一个git对象,它不仅在完全删除文件时,而且在被新内容覆盖时将成为一个松散的对象.但没有命令自动恢复它.相反,必须手动识别和提取文件,或者使用仅为此案例编写的工具(libgit2允许这样).但是,如果文件非常重要且很大,并且无法通过编辑以前的版本来重建,那么这只会付出代价. (3认同)
  • 要纠正自己:一旦找到松散的目标文件(使用元数据,如创建日期/时间),可以使用`git cat-file`来恢复其内容. (2认同)
  • @FilipSavic 如果您多次添加同一文件而不提交。例如 `echo 1 &gt; a.txt` 后跟 `git add a.txt` - 尚未提交 - `echo 2 &gt; a.txt` 后跟 `git add a.txt`;现在提交例如 `git commit -m "create unreachable blob"` 并运行 `git fsck --unreachable` (2认同)

Ali*_*eza 101

使用git 撤消已经添加的文件很容易,重置myfile.txt已经添加的文件,使用:

git reset HEAD myfile.txt
Run Code Online (Sandbox Code Playgroud)

说明:

在您转发不需要的文件后,要撤消,您可以这样做git reset,Head是本地文件的头部,最后一个参数是文件的名称.

我将在下面的图片中为您创建更多详细信息,包括在这些情况下可能发生的所有步骤:

git reset HEAD


bra*_*sch 92

git rm --cached . -r
Run Code Online (Sandbox Code Playgroud)

将以递归方式"取消添加"您从当前目录添加的所有内容

  • 不,这*在当前目录中添加了*a*删除*.只是取消暂停更改非常不同. (5认同)
  • 我不打算取消所有内容,只是一个特定的文件. (3认同)
  • 如果您之前没有任何提交,也会很有帮助.如果没有先前的提交,`git reset HEAD <file>`会说'致命:无法解析'HEAD'作为有效的参考. (3认同)

Kha*_*din 87

git gui
Run Code Online (Sandbox Code Playgroud)

并手动删除所有文件,或者选择所有文件并单击" 提交"按钮.

  • 是的,我明白。我只是想含蓄地建议您在答案中指出这一点,例如“您可以使用 `git-gui`....”:) (2认同)
  • 它说,“git-gui:找不到命令”。我不确定这是否有效。 (2认同)

sja*_*jas 82

Git拥有可以想象的每一个动作的命令,但需要广泛的知识来使事情正确,因此它最好是反直觉的......

你之前做过的事:

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

你想要什么:

  • @jeswang文件要么是git'已知'(正在跟踪它们中的更改),要么它们不是'版本化'.`reset head`撤消当前的更改,但git仍在监视该文件.`rm --cached`将文件从版本控制中取出,因此git不再检查它的更改(并且还删除最终索引的当前更改,通过先前的`add`告诉git),但更改的文件将保留在您的工作副本,即在HDD上的文件夹中. (6认同)
  • 我无法理解“git reset head &lt;file&gt;”和“git rm --cached &lt;file&gt;”的区别。你能解释一下吗? (2认同)
  • 不同之处是`git reset HEAD <file>`是临时的 - 该命令仅应用于下一次提交,但`git rm --cached <file>`将取消暂停,直到它再次添加`git add <file> `.此外,`git rm --cached <file>`表示如果将该分支推送到远程,任何拉动分支的人都会从其文件夹中删除该文件. (2认同)
  • 正是我搜索的`git checkout -- &lt;file&gt;` 谢谢! (2认同)

Mic*_*arf 76

问题没有明确提出.原因是它git add有两个含义:

  1. 新文件添加到暂存区域,然后撤消git rm --cached file.
  2. 修改后的文件添加到暂存区域,然后撤消git reset HEAD file.

如果有疑问,请使用

git reset HEAD file
Run Code Online (Sandbox Code Playgroud)

因为它在两种情况下都做了预期的事情.

警告:如果您git rm --cached file对已修改的文件(以前在存储库中存在的文件)执行操作,则该文件将被删除git commit!它仍然存在于您的文件系统中,但如果有其他人提取您的提交,该文件将从其工作树中删除.

git status将告诉您文件是新文件还是已修改:

On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    new file:   my_new_file.txt
    modified:   my_modified_file.txt
Run Code Online (Sandbox Code Playgroud)

  • +1.关于`git rm --cached somefile`的行为,这个页面上非常多的高度评价的答案和评论都是错误的.我希望这个答案能够在页面上显示出一个突出的位置,它可以保护新手免受所有虚假声明的误导. (5认同)

Ana*_*tts 64

如果您正在进行初始提交并且无法使用git reset,只需声明"Git破产"并删除该.git文件夹并重新开始

  • 一个提示是在删除文件夹之前复制.git/config文件(如果已添加远程源). (5认同)
  • @ChrisJohnsen发表评论.有时候,你想提交除了一个以外的所有文件:`git add -A && git rm --cached EXCLUDEFILE && git commit -m'awesome commit'`(当没有先前的提交时,这也有效,重新"无法解决"HEAD ''问题) (4认同)

ele*_*ake 57

根据您可以使用的许多其他答案 git reset

但:

我发现这个伟大的小帖子实际上添加了Git命令(以及别名)git unadd:请参阅git unadd了解详细信息或..

只是,

git config --global alias.unadd "reset HEAD"
Run Code Online (Sandbox Code Playgroud)

现在你可以

git unadd foo.txt bar.txt
Run Code Online (Sandbox Code Playgroud)


gnu*_*nud 44

git remove或者git rm可以用于此,带有--cached旗帜.尝试:

git help rm
Run Code Online (Sandbox Code Playgroud)

  • 这不是要完全删除文件吗? (9认同)
  • git rm --cached ...将从git仓库中删除文件。它们仍将存在于您的计算机上,但这与取消对文件的*更改*的分段非常不同。对于任何对此绊脚石的人来说,这不是一个有效的答案。 (7认同)

Ale*_*eys 44

用于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)
# [...]#
Run Code Online (Sandbox Code Playgroud)

进入交互式添加以撤消你的添加(在这里输入的命令是"r"(恢复),"1"(列表恢复中的第一个条目显示),"返回"退出恢复模式,以及"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.
$
Run Code Online (Sandbox Code Playgroud)

而已!这是你的证明,显示"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)
$
Run Code Online (Sandbox Code Playgroud)


Rya*_*ndy 38

当你开始一个新项目时,这是一种避免这个棘手问题的方法:

  • 为新项目创建主目录.
  • git init.
  • 现在创建一个.gitignore文件(即使它是空的).
  • 提交你的.gitignore文件.

git reset如果你没有任何提交,Git会很难做到.如果你创建一个微小的初始提交只是为了拥有一个,之后你可以git add -Agit reset你想要的一样多次,以使一切正确.

这种方法的另一个优点是,如果您以后遇到线路结束的问题并需要刷新所有文件,这很容易:

  • 查看初始提交.这将删除所有文件.
  • 然后再次检查您最近的提交.这将使用您当前的行结束设置检索文件的新副本.


小智 34

也许自你发布问题以来Git已经发展了.

$> git --version
git version 1.6.2.1
Run Code Online (Sandbox Code Playgroud)

现在,您可以尝试:

git reset HEAD .
Run Code Online (Sandbox Code Playgroud)

这应该是你正在寻找的.

  • 当然,但是你有一个后续问题,即如何添加一个*两个*(或更多)文件中的一个.但是,"git reset"手册确实提到"git reset <paths>"与"git add <paths>"相反. (2认同)

pow*_*wlo 34

请注意,如果您未能指定修订版,则必须包含分隔符.我的控制台示例:

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>
Run Code Online (Sandbox Code Playgroud)

(git版本1.7.5.4)

  • 我试过`git reset <path>`并且没有分隔符就可以正常工作.我也在使用git 1.9.0.也许它在旧版本中不起作用? (2认同)

Ran*_*Ran 31

要从暂存区域中删除新文件(仅在新文件的情况下),如上所述:

git rm --cached FILE
Run Code Online (Sandbox Code Playgroud)

仅将rm --cached用于意外添加的新文件.

  • 请注意,`--cached`在这里是一个非常重要的部分. (4认同)

Zor*_*ayr 25

要重置特定文件夹(及其子文件夹)中的每个文件,可以使用以下命令:

git reset *
Run Code Online (Sandbox Code Playgroud)

  • 实际上,这不会重置每个文件,因为*使用shell扩展而忽略了dotfiles(和点目录). (4认同)

bou*_*uby 25

使用该*命令一次处理多个文件

git reset HEAD *.prj
git reset HEAD *.bmp
git reset HEAD *gdb*
Run Code Online (Sandbox Code Playgroud)

等等

  • 请注意*通常不包括dotfiles或'dot-directories',除非你明确指定`.*`或`.*.prj` (2认同)

pro*_*tos 24

2019年更新

正如其他人在相关问题中指出的那样(参见此处此处此处此处此处此处此处),您现在可以使用以下命令取消暂存单个文件

git restore --staged <file>
Run Code Online (Sandbox Code Playgroud)

并使用以下命令取消暂存所有文件(来自 repo 的根目录):

git restore --staged .
Run Code Online (Sandbox Code Playgroud)

笔记

git restore2019 年 7 月推出,并在 2.23 版中发布。
使用该--staged标志,它会恢复索引的内容(此处询问的内容)。

git status使用暂存的未提交文件运行时,这现在是 Git 建议git reset HEAD <file>用来取消暂存文件的(而不是像 v2.23 之前那样)。


小智 23

只需输入git reset它就会恢复原状,就像你git add .上次提交时从未打字过一样.确保你之前已经投入.


Vid*_*ige 20

假设我创建了一个新文件newFile.txt.

在此输入图像描述

假设我意外地添加了文件, git add newFile.txt

在此输入图像描述

现在我要在提交之前撤消此添加 git reset newFile.txt

在此输入图像描述


Has*_*mal 19

对于特定文件:

  • git reset my_file.txt
  • git checkout my_file.txt

对于所有添加的文件:

  • git重置.
  • git checkout.

注意:checkout更改文件中的代码并移至上次更新(已提交)状态.重置不会改变代码; 它只是重置标题.

  • 请解释一下`git reset <file>`和`git checkout <file>`之间的区别. (3认同)

wal*_*ake 14

此命令将取消暂停您的更改:

git reset HEAD filename.txt
Run Code Online (Sandbox Code Playgroud)

你也可以使用

git add -p 
Run Code Online (Sandbox Code Playgroud)

添加部分文件.


Jon*_*han 14

我很惊讶没有人提到交互模式:

git add -i
Run Code Online (Sandbox Code Playgroud)

选择选项3以取消添加文件.在我的情况下,我经常想要添加多个文件,使用交互模式,您可以使用这样的数字来添加文件.这将采取除4:1,2,3,5之外的所有

要选择一个序列,只需输入1-5即可从1到5.

Git临时文件


小智 14

要撤消git add use

git add


小智 10

git reset filename.txt
Run Code Online (Sandbox Code Playgroud)

将从当前索引"即将被提交"区域中删除名为filename.txt的文件,而不更改任何其他内容.


Moh*_*med 10

git add myfile.txt #这将把你的文件添加到提交列表中

与此命令完全相反的是,

git reset HEAD myfile.txt  # This will undo it.
Run Code Online (Sandbox Code Playgroud)

所以,你将处于以前的状态.指定将再次处于未跟踪列表(先前状态).

它将使用指定的文件重置您的头部.所以,如果你的头没有它的意思,它只会重置它


Ger*_*ser 10

如果您想恢复上次提交,但仍想在本地保留提交中所做的更改,请使用以下命令:

git reset HEAD~1 --mixed
Run Code Online (Sandbox Code Playgroud)


miv*_*va2 9

在SourceTree中,您可以通过gui轻松完成此操作.您可以检查sourcetree用于取消暂存文件的命令.

我创建了一个新文件并将其添加到git中.然后我使用SourceTree gui取消了它.这是结果:

取消暂停文件[08/12/15 10:43]
git -c diff.mnemonicprefix = false -c core.quotepath = false -c credential.helper = sourcetree reset -q - path/to/file/filename.java

SourceTree用于取消暂存reset新文件.


Mar*_*zak 8

最直观的解决方案之一是使用SourceTree.

您只需从暂存和未暂存中拖放文件即可 在此输入图像描述


小智 8

git reset filename.txt  
Run Code Online (Sandbox Code Playgroud)

将从当前索引"即将被提交"区域中删除名为filename.txt的文件,而不更改任何其他内容.


Rah*_*nto 8

您可以在 git version 2.23 之后使用此命令:

git restore --staged <filename>
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用以下命令:

git reset HEAD <filename>
Run Code Online (Sandbox Code Playgroud)


Sup*_*Roy 8

我会使用git restore --staged .git restore --staged <filename>

您也可以使用git rm --cached,但是,该git rm命令最适合用于已跟踪的文件。


SAI*_*011 7

git reset命令可帮助您修改暂存区或暂存区和工作树。Git 能够完全按照您的意愿进行提交,这意味着您有时需要撤消对使用git add.

你可以通过调用来做到这一点git reset HEAD <file to change>。您有两种选择可以完全消除更改。git checkout HEAD <file(s) or path(s)>是撤消对暂存区和工作树所做更改的快速方法。

但是,请小心使用此命令,因为它会删除对工作树的所有更改。Git 不知道这些更改,因为它们从未被提交。一旦您运行此命令,就无法恢复这些更改。

您可以使用的另一个命令是git reset --hard. 它对您的工作树同样具有破坏性 - 任何未提交的更改或暂存的更改在运行后都会丢失。运行git reset -hard HEADgit checkout HEAD. 它只是不需要文件或路径即可工作。

您可以--softgit reset. 它将存储库重置为您指定的提交并暂存所有这些更改。您已经暂存的任何更改都不会受到影响,工作树中的更改也不会受到影响。

最后,您可以使用--mixed重置工作树而无需暂存任何更改。这也会取消暂存任何已暂存的更改。


Sam*_*ria 6

我第一次遇到这个问题时,我在这里找到了这篇文章,从第一个答案中我了解到我应该这样做git reset <filename>。效果很好。

最终,我的主 git 文件夹中碰巧有一些子文件夹。我发现很容易将git add .所有文件添加到子文件夹中,然后git reset添加我不想添加的几个文件。

现在我有很多文件和子文件夹。git reset逐一比较乏味,但还是比较容易git add .,但先重置一些重/不需要但有用的文件和文件夹仍然更容易。

我找到了以下方法(这里这里没有记录))相对简单。我希望这会有所帮助:

假设您有以下情况:

Folder/SubFolder1/file1.txt
Folder/SubFolder2/fig1.png
Folder/SubFolderX/fig.svg
Folder/SubFolder3/<manyfiles>
Folder/SubFolder4/<file1.py, file2.py, ..., file60.py, ...>
Run Code Online (Sandbox Code Playgroud)

您想要添加所有文件夹和文件,但不是fig1.png、不是SubFolderX、不是file60.py并且列表不断增长......

首先,制作/创建一个bash shell script并为其命名。说,git_add.sh

git reset然后添加您想要在其前面添加的所有文件夹和文件的所有路径git reset -- git_add.sh随着文件列表的增长,您可以轻松地将路径复制粘贴到脚本中。该git_add.sh脚本应如下所示:

Folder/SubFolder1/file1.txt
Folder/SubFolder2/fig1.png
Folder/SubFolderX/fig.svg
Folder/SubFolder3/<manyfiles>
Folder/SubFolder4/<file1.py, file2.py, ..., file60.py, ...>
Run Code Online (Sandbox Code Playgroud)

#!/bin/bash很重要。然后source git_add.sh运行它。之后,你可以这样做git commit -m "some comment",然后git push -u origin master如果您已经设置了 Bitbucket/Github。

免责声明:我只在 Linux 中对此进行了测试。


如果您始终在本地 git 存储库中保留大量文件和文件夹,但您不希望 git 跟踪您所做的更改(git add .例如视频和数据文件),那么您必须学习如何使用.gitignore. 也许从这里开始


akh*_*hid 6

您可以使用 git 命令或 GUI git 取消暂存/撤消。

单个文件

git reset File.txt 
Run Code Online (Sandbox Code Playgroud)

多个文件

git reset File1.txt File2.txt File3.txt
Run Code Online (Sandbox Code Playgroud)

示例- 假设您错误地 添加了Home.jsListItem.jsUpdate.js在此处输入图片说明 并想要撤消/重置 =>

git reset src/components/home/Home.js src/components/listItem/ListItem.js src/components/update/Update.js
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

使用git GUI 的相同示例

git gui
Run Code Online (Sandbox Code Playgroud)

打开一个窗口 => 从暂存更改中取消选中您的文件(将提交) 在此处输入图片说明

  • 我喜欢你的屏幕截图告诉你应该使用 `git Restore --staged &lt;file&gt;...` 而不是你提供的解决方案 XD (3认同)

归档时间:

查看次数:

2854202 次

最近记录:

5 年,11 月 前