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

在...创建的问题 Mon, Jun 10, 2019 12:00 AM

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

 
git add myfile.txt

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

    
8195
  1. 从Git v1.8.4开始,下面使用HEADhead的所有答案现在可以使用@代替HEAD。请参阅此答案(上一部分)以了解为何可以那样做。
    2013-07-26 02:04:14Z
  2. 我做了一个小小的总结,展示了取消暂存文件的所有方法: stackoverflow.com/questions/6919121 /...
    2014-04-26 12:09:03Z
  3. 为什么不git checkout?
    2016-09-05 14:57:00Z
  4. @ ErikReppen git checkout不会从提交索引中删除暂存的更改。它只会将未上传的更改恢复到上次提交的修订版 - 顺便说一句,这也不是我想要的,我希望这些更改,我只是想在以后的提交中使用它们。
    2016-09-06 21:08:58Z
  5. 如果你使用Eclipse,就像在提交对话框中取消选中文件一样简单
    2016-11-17 12:49:17Z
  6. 醇>
    30答案                              30 跨度>                         

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

     
    git reset <file>
    

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

    您可以使用

     
    git reset
    

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

    在旧版本的Git中,上面的命令分别相当于git reset HEAD <file>git reset HEAD,如果HEAD未定义(因为你还没有在你的repo中进行任何提交)或者模糊不清(因为你创建了一个名为HEAD,这是一件你不应该做的蠢事。这个在Git 1.8中进行了更改。 2 ,但是,在现代版本的Git中,您甚至可以在第一次提交之前使用上述命令:

      

    “git reset”(没有选项或参数)用于出错时      你在历史上没有任何提交,但它现在给你了      一个空索引(用于匹配您甚至不在的不存在的提交)。

        
    9303
    2015-10-29 23:04:30Z
    1. 当然,这不是一个真正的撤销,因为如果错误的git add覆盖了以前上演的非常规版本,我们就无法恢复它。我试着在下面的答案中澄清这一点。
      2013-05-06 19:10:43Z
    2. git reset HEAD *.ext其中ext是您要取消添加的给定扩展名的文件。对我来说这是*.bmp&amp; *.zip
      2013-11-26 14:25:19Z
    3. @ Jonny,索引(也称为暂存区)包含所有文件,而不仅仅是已更改的文件。它“启动生命”(当您检出提交或克隆存储库时)作为HEAD指向的提交中的所有文件的副本。因此,如果您从索引(git rm --cached删除文件,则意味着您准备提交删除该文件。另一方面,git reset HEAD <filename>会将文件从HEAD复制到索引,以便下一次提交不会显示对该文件所做的任何更改。
      2016-03-16 12:27:34Z
    4. 我刚刚发现git reset -p就像git add -p一样。这真棒!
      2016-07-17 23:23:05Z
    5. 你实际上可以恢复覆盖以前上演但未完成的更改但不是以用户友好的方式而不是100%安全(至少没有我发现):goto .git /objects,搜索你要恢复的git add时创建的文件(61/3AF3... - &gt;对象id 613AF3...),然后搜索git cat-file -p <object-id>(可能值得恢复几个小时的工作但也需要提交一课更常见的是......)
      2017-07-31 14:03:25Z
    6. 醇>

    你想:

     
    git rm --cached <added_file_to_undo>
    

    推理:

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

     
    git reset .
    

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

     
    fatal: Failed to resolve 'HEAD' as a valid ref.
    

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

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

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

      =&GT;该死的,我不想加上所有这些。

    5. google“undo git add”

      =&GT;找到Stack Overflow - yay

    6. git reset .

      =&GT;致命:无法将“HEAD”解析为有效的参考号。

    7. 醇>

      进一步证明记录了一个错误这在邮件列表中没有用。

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

       
      ...
      # Changes to be committed:
      #   (use "git rm --cached <file>..." to unstage)
      ...
      

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

      请注意此处其他位置的警告 - git rm会删除文件的本地工作副本,但如果您使用 - 已缓存,则不会。这是git help rm的结果:

        

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

      我继续使用

       
      git rm --cached .
      

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

       
      git rm -r --cached .
      

      好的,现在我回到了我开始的地方。下次我将使用-n进行干运行,看看会添加什么:

       
      git add -n .
      

      我把所有东西都拉到一个安全的地方,然后相信git help rm关于--cached没有破坏任何东西(如果我拼错它会怎么样)。

          
    2062
    2018-09-13 00:05:11Z
    1. 哈。我遵循了同样的过程。除了我放弃并说rm -rf .git,git init,因为我不相信git rm --cached保留我的工作副本。它说了一些git在某些地方仍然过于复杂的说法。 git unstage应该只是一个股票标准命令,我不在乎我是否可以将它添加为别名。
      2011-03-29 03:45:18Z
    2. 对我来说git说git reset HEAD <File>...
      2012-09-12 06:50:13Z
    3. git rm --cached&lt; file&gt;实际上是正确的答案,如果它是&lt; file&gt;的初始导入进入存储库。如果您尝试取消对文件的更改,git reset是正确的答案。人们说这个答案是错误的,正在考虑一个不同的问题。
      2013-02-28 22:14:57Z
    4. 这实际上有效,但第一次提交,之前文件不存在,或者git add命令添加了新文件文件,但不是更改现有文件。
      2013-04-10 02:33:36Z
    5. 只是表明git是多么不直观和错综复杂。而不是并行“撤消”命令,你必须找到如何撤消它们。就像试图用快速的沙子释放你的腿,然后让你的手臂卡住,然后让你的另一只手臂卡住...每个命令都应该通过GUI完成,下拉菜单项可以选择...想想所有的UI,我们已经拥有的生产力提升,但我们有一个复古的命令行界面。它不像git GUI程序使这更直观。
      2014-05-24 10:54:36Z
    6. 醇>

    如果输入:

     
    git status
    

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

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

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

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

     
    (use "git rm --cached <file>..." to unstage)
    
        
    507
    2013-11-09 03:48:01Z
    1. 根据add ed文件是否已被跟踪(add仅将新版本保存到缓存中 - 此处将显示您的消息),消息将有所不同。在其他地方,如果文件以前没有暂存,它将显示use "git rm --cached <file>..." to unstage
      2013-05-06 18:25:26Z
    2. 好极了!如果您想要取消暂存文件删除
      ,那么git reset HEAD <file>就是唯一可用的
      2018-02-24 00:25:25Z
    3. 我的git版本2.14.3说git reset HEAD要取消暂停。
      2018-04-23 19:16:53Z
    4. 醇>

    澄清:git add将更改从当前工作目录移至临时区域(索引)。

    此过程称为 staging 。因此,阶段更改(更改文件)的最自然的命令是显而易见的:

     
    git stage
    

    git add只是更容易为git stage

    输入别名

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

     
    git reset HEAD --
    

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

     
    git config --global alias.unadd 'reset HEAD --'
    git config --global alias.unstage 'reset HEAD --'
    

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

     
    git add file1
    git stage file2
    git unadd file2
    git unstage file1
    

    我个人使用更短的别名:

     
    git a #for staging
    git u #for unstaging
    
        
    240
    2013-04-29 13:05:17Z
    1. “移动”?这表明它已从工作目录中删除。情况并非如此。
      2017-06-08 09:18:33Z
    2. 为什么这很明显?
      2017-06-23 18:25:52Z
    3. 实际上,git stagegit add的别名,这是Git和其他SCM上的历史命令。如果可以的话,它已于2008年12月在“Git的git存储库”中添加了commit 11920d28da。
      2018-09-12 18:13:20Z
    4. 醇>

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

     
    git gc --prune=now
    

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

    那么,这是git add的真正撤消

    git reset HEAD <file>

    git rm --cached <file>

    严格地说,如果我没弄错的话: none

    git add 无法撤消 - 安全,一般而言。

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

    1. 如果<file> 之前未跟踪,则git add 将其添加到缓存及其当前内容。

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

    3. 醇>

      鉴于此,问题有点含糊不清:

        

      我错误地使用命令...

      添加了文件

      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 lost irrevocably "version 2"
      -version 1
      +version 3
      

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


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

          
    161
    2018-10-15 17:23:57Z
    1. 严格来说,有一种方法可以恢复已经被git add替换的已经暂存的文件。正如你所提到的,git add为该文件创建了一个git对象,它不仅在完全删除文件时,而且在被新内容覆盖时将成为一个松散的对象。但没有命令自动恢复它。相反,必须手动识别和提取文件,或者使用仅为此案例编写的工具(libgit2允许这样)。但是,如果文件非常重要且很大,并且无法通过编辑以前的版本来重建,那么这只会付出代价。
      2017-12-06 13:07:37Z
    2. 要纠正自己:找到松散的目标文件后(使用创建日期/时间等元数据)git cat-file可用于恢复其内容。
      2017-12-06 13:22:17Z
    3. 另一种方法恢复已暂存但未提交但随后被覆盖的更改另一个git add通过git fsck --unreachable将列出所有无法访问的obj,然后您可以通过git show SHA-1_IDgit fsck --lost-found进行检查,将&gt;将悬空对象写入.git/lost-found/commit/.git/lost-found/other/,具体取决于类型。另见git fsck --help
      2018-04-27 15:29:46Z
    4. 醇>
     
    git rm --cached . -r
    

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

        
    92
    2013-05-28 15:18:28Z
    1. 我不想取消所有内容,只需要一个特定的文件。
      2009-12-09 22:35:27Z
    2. 如果您之前没有任何提交,也会很有帮助。如果没有先前的提交,git reset HEAD <file>会说fatal: Failed to resolve 'HEAD' as a valid ref.
      2013-06-02 03:46:13Z
    3. 不,这个添加当前目录中所有内容的删除。与非暂停更改非常不同。
      2015-10-30 01:33:56Z
    4. 醇>

    运行

     
    git gui
    

    并手动删除所有文件,或者选择所有文件并单击 unstage from commit 按钮。

        
    85
    2013-03-09 11:21:19Z
    1. 是的,我理解。我只是想隐含地建议你在答案上表明“你可以使用git-gui ....”:)
      2014-08-01 16:11:05Z
    2. 它说,“git-gui:command not found”。我不确定这是否有效。
      2017-09-13 04:19:18Z
    3. 哇,这很简单,然后做你不理解的命令行。 对于像我这样的初学者来说,这绝对是值得推荐的。感谢你写这篇文章!
      2019-04-11 04:27:43Z
    4. 醇>
    使用 git

    撤消已添加的文件非常简单,重置已添加的myfile.txt,请使用:

     
    git reset HEAD myfile.txt
    

    说明:强>

    在您上传不需要的文件后,要撤消,您可以执行git reset,Head是本地文件的头部,最后一个参数是您文件的名称。

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

        
    85
    2019-03-21 09:34:42Z
    1. AMAZING !!!!!!!!!!!!!!!!!!!!!
      2019-03-26 12:56:08Z
    2. 醇>

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

    您之前做过的事情:

    • 更改了文件并使用了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>
      
    80
    2015-10-30 01:37:07Z
    1. 我无法忍受'git reset head&lt; file&gt;'的区别和'git rm --cached&lt; file&gt;。可以你解释一下吗?
      2013-08-14 00:39:07Z
    2. @ jeswang文件对git是“已知的”(正在跟踪它们中的更改。),或者它们没有“版本化”。 reset head撤消当前的更改,但该文件仍由git监视。 rm --cached将文件从版本控制中取出,因此git不再检查它的更改(并且还删除最终索引的当前更改,通过之前的add告诉git),但更改的文件将保留在您的工作副本中,即在您的硬盘上的文件夹。
      2013-08-15 15:09:40Z
    3. 差异是git reset HEAD <file>是临时的 - 该命令将仅应用于下一次提交,但git rm --cached <file>将取消暂停,直到它再次添加git add <file>。此外,git rm --cached <file>表示如果您将该分支推送到远程,任何拉动分支的人都将从其文件夹中删除该文件。
      2014-08-10 19:54:43Z
    4. 醇>

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

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

      如果有疑问,请使用

       
      git reset HEAD file
      

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

      警告:如果您对已修改的文件(以前存储在存储库中的文件)执行了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
      
          
    73
    2015-10-30 23:47:29Z
    1. + 1。关于git rm --cached somefile的行为,这个页面上非常多的高度评价的答案和评论都是错误的。我希望这个答案能够在页面上显示出一个突出的位置,它可以保护新手免受所有虚假声明的误导。
      2015-10-30 23:44:32Z
    2. 这里最好的答案之一,遗憾的是它在列表上相当低
      2019-06-10 01:10:3​​6Z
    3. 醇>

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

        
    62
    2019-02-17 12:01:36Z
    1. 如果您在删除文件夹之前添加了远程原点,则一个提示是复制.git /config文件。
      2010-03-08 23:15:52Z
    2. @ ChrisJohnsen发表评论。有时候,你想提交除了一个以外的所有文件:git add -A && git rm --cached EXCLUDEFILE && git commit -m 'awesome commit'(当没有以前的提交时,这也有效,重新Failed to resolve 'HEAD'问题)
      2013-03-29 04:20:41Z
    3. 醇>

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

    BUT:强>

    我发现这个很棒的小帖子实际上为git unadd添加了Git命令(以及别名):参见 git unadd 了解详情或..

    简单地说,

     
    git config --global alias.unadd "reset HEAD"
    

    现在你可以

     
    git unadd foo.txt bar.txt
    
        
    55
    2016-07-13 16:51:08Z

    git removegit rm可用于此,带有--cached标志。尝试:

     
    git help rm
    
        
    45
    2013-03-09 11:14:55Z
    1. 这不是要完全删除文件吗?
      2015-08-26 05:29:10Z
    2. git rm --cached ...将从git仓库中删除文件。它们仍然存在于您的计算机上,但这与将更改取消暂存至文件非常不同。对于任何磕磕绊绊的人来说,这不是问题的有效答案。
      2018-12-17 20:02:59Z
    3. 醇>

    使用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)
    # [...]#
    

    进入交互式添加以撤消添加(在这里输入的命令是“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.
    $
    

    就是这样!这是你的证明,显示“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)
    $
    
        
    42
    2012-12-21 22:14:31Z

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

    • 为新项目创建主目录。
    • 运行git init
    • 现在创建一个.gitignore文件(即使它是空的)。
    • 提交.gitignore文件。
    如果你没有任何提交,Git会很难做到git reset。如果你创建一个微小的初始提交只是为了拥有一个,那么你可以根据需要多次使用git add -Agit reset,以便让一切正常。

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

    • 查看初始提交。这将删除您的所有文件。
    • 然后再次检查您最近的提交。这将使用您当前的行结束设置检索文件的新副本。
    37
    2012-05-10 18:59:01Z
    1. 确认!在git add之后尝试重置git。和git抱怨腐败的HEAD。按照你的建议,我可以git add&amp;来回重置没有问题:))
      2012-10-03 21:32:16Z
    2. 第二部分有效,但有点笨拙。如何处理行结尾取决于autocrlf值...这将不适用于每个项目,具体取决于设置。
      2013-03-29 11:26:58Z
    3. 这个答案在发布时是合理的,但现在已经过时了;现在,git reset somefilegit reset都在第一次提交之前工作。自从几个Git发布以来就是这种情况。
      2015-10-30 23:38:32Z
    4. @ MarkAmery,你可能是对的(如果你发布了断言的来源会很酷),但是用一个干净的提交启动你的回购仍然是有价值的或两个。
      2015-10-31 20:01:14Z
    5. 醇>

    自从你发布问题以来,也许Git已经发展了。

     
    $> git --version
    git version 1.6.2.1
    

    现在,您可以尝试:

     
    git reset HEAD .
    

    这应该是你要找的。​​ p>     

    33
    2013-03-09 11:17:13Z
    1. 当然,但是你有一个后续问题,即如何添加一个两个(或更多)文件。 “git reset”手册确实提到“git reset&lt; paths&gt;”然而,与“git add&lt; paths&gt;”相反。
      2013-05-15 13:36:21Z
    2. 醇>

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

     
    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)

        
    33
    2014-04-05 05:32:50Z
    1. 我尝试了git reset <path>,没有分隔符就可以正常工作。我也在使用git 1.9.0。也许它在旧版本中不起作用?
      2014-04-05 05:32:25Z
    2. 醇>

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

     
    git rm --cached FILE
    

    仅对意外添加的新文件使用rm --cached。

        
    30
    2009-06-22 19:46:28Z
    1. 请注意--cached在这里是一个非常重要的部分。
      2013-04-12 12:21:46Z
    2. - 1;不,这不会取消暂存文件,它会删除文件(实际上不会从工作树中删除它)。
      2015-10-30 23:42:05Z
    3. 醇>

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

     
    git reset *
    
        
    24
    2012-07-26 07:50:36Z
    1. 实际上,这不会重置每个文件,因为*使用shell扩展而忽略了dotfiles(和点目录)。
      2014-05-04 23:20:01Z
    2. 您可以运行git status查看剩余的内容并手动重置,即git reset file
      2014-05-07 15:23:55Z
    3. 醇>

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

     
    git reset HEAD *.prj
    git reset HEAD *.bmp
    git reset HEAD *gdb*
    

        
    24
    2013-08-27 21:15:05Z
    1. 请注意*通常不包括dotfiles或'dot-directories',除非您明确指定.*.*.prj
      2014-05-04 23:21:06Z
    2. 醇>

    只需输入git reset它就会恢复原状,就像你上次提交时从未输入git add .一样。确保你以前犯过。

        
    22
    2015-04-22 10:57:19Z
    1. 如果没有最后一次提交,将无效。
      2012-04-11 22:07:03Z
    2. 碰巧发生了最后一次提交......但我特意要求从提交中删除单个文件,而不是提交中的每个文件。
      2013-01-31 16:21:37Z
    3. 醇>

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

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

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

        
    18
    2016-10-04 11:02:48Z
    1. 假设我在第1张图片意思是我甚至没有“git.add”。而且,我根本不想要所有这些改变。我的意思是当我做git状态时,它不应该显示任何红色文件。我的意思是它应该同步,好像自上次git推送以来没有一个文件被改变。如何实现这一点。
      2017-03-26 00:59:40Z
    2. 假设你刚才是第一步。并且你想要摆脱你所做的所有改变,使“newFile.txt”变为红色。
      2017-03-26 01:00:12Z
    3. 当我做git状态时。我根本不应该看到任何变化。所有红色文件都应该被还原。
      2017-03-26 01:00:50Z
    4. 您好,我认为您的问题是如何从当前树中删除未跟踪的文件。为此,您可以使用“git clean -f -d”。这将删除未跟踪的目录。
      2017-03-26 10:19:04Z
    5. 如果您不想删除未跟踪的文件,只需忽略“-f”标志。
      2017-03-26 10:20:26Z
    6. 醇>

    对于特定文件:

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

    对于所有添加的文件:

      
    • git reset。
    •   
    • git checkout。
    •   

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

        
    17
    2018-09-28 18:11:49Z
    1. 请解释git reset <file>git checkout <file>之间的区别。
      2018-01-22 23:47:24Z
    2. reset不会改变文件,只是把它放在舞台上(=索引,它是由git add放的)
      2018-03-12 11:18:32Z
    3. checkout更改文件中的代码并移至上次更新状态。重置不会更改它重置标头的代码。例如,重置用于添加或提交的文件,在推送和结帐之前使用,以便在git add之前返回上一个更新/已提交的阶段。
      2018-03-14 11:38:53Z
    4. reset =从舞台中删除文件,但更改仍然存在。 checkout =从存储库中获取更新的文件,并将覆盖当前文件
      2018-09-12 10:16:22Z
    5. 醇>

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

     
    git reset HEAD filename.txt
    

    您也可以使用

     
    git add -p 
    

    添加部分文件。

        
    13
    2013-03-09 11:22:31Z

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

     
    git add -i
    

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

    要选择一个序列,只需输入1-5即可将全部从1到5。

    Git临时文件

        
    13
    2015-10-26 12:20:07Z
    1. “我很惊讶没有人提到交互模式” - 他们做了:stackoverflow.com/a/10209776/1709587
      2015-10-30 23:52:13Z
    2. 醇>

    撤消git add use

    git reset filename

        
    13
    2016-10-02 15:54:48Z
     
    git reset filename.txt
    

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

        
    9
    2016-07-11 18:40:52Z

    git add myfile.txt#这会将您的文件添加到提交列表

    与此命令完全相反的是,

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

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

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

        
    9
    2017-06-27 13:58:34Z

    在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取消暂存新文件。

        
    8
    2015-12-08 09:58:33Z

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

    您只需从暂存和未暂存中拖放文件即可

        
    7
    2017-05-26 08:32:16Z
来源放置 这里