【问题标题】:How can you undo the last git add?如何撤消最后一个 git add?
【发布时间】:2012-08-21 08:49:55
【问题描述】:

是否可以取消暂存 git 中最后一次暂存(未提交)的更改?假设当前分支中有很多文件,有些是暂存的,有些没有。在某些时候,一些愚蠢的程序员不小心执行了:

git add -- .

...而不是:

git checkout -- .

这个程序员现在可以用一些神奇的 git 命令取消他最后的更改吗?还是他应该在实验之前就做出承诺?

【问题讨论】:

  • 嘿。不过,我们从中得到了一个有用的问题和答案。
  • Undo 'git add' before commit 的可能重复项
  • 我相信它不是重复的。另一个问题中的 OP 正在寻求一种方法来撤消此操作或从提交中删除这些文件。我想要(ed)精确地并且只撤消使用最后一个git add 命令添加的更改,特别是对于已经暂存更改并且有一些要撤消而不是暂存的更改的文件。不能说另一个问题不相关。
  • 也许他应该在实验之前先提交 /been/ 。
  • @android.weasel 是的,那是很多年前的事了……

标签: git


【解决方案1】:

您无法撤消 latest git add,但您可以撤消自上次提交以来的所有 adds。 git reset 没有提交参数会重置索引(取消分阶段更改):

git reset

【讨论】:

  • “你无法撤消 latest git add”:哇,这令人惊讶,而且可能很痛苦。这有确定的来源吗?此外,是否有充分的理由应该如此?谢谢!
  • @AndrewMoylan:嗯,没有 自动 方法可以做到这一点。您始终可以reset 单个文件,或使用reset -p 取消暂存特定块。
【解决方案2】:

你可以使用git reset(见docs

【讨论】:

    【解决方案3】:

    您可以使用git reset。这将“取消暂存”您在上次提交后添加的所有文件。

    如果您只想取消暂存某些文件,请使用git reset -- <file 1> <file 2> <file n>

    还可以使用git reset -p 取消暂存文件中的某些更改。

    【讨论】:

    • 多么悲伤。我想我的提交实践毕竟有问题。接受这个答案,因为您提到了-p 开关。谢谢! :)
    • 生成(对我而言)错误:致命:无法将“HEAD”解析为有效参考。我还没有提交任何东西(新仓库)刚刚完成 git add 。并后悔了。我不想重置整个添加,只是一个目录。 git reset -- dir/*.* 生成上面的错误。
    • ...啊,我明白发生了什么。我还没有任何 HEAD 可以指向的东西,所以 git reset 失败了(因为它在 HEAD 上运行)。
    【解决方案4】:

    根据难度的大小和规模,您可以创建一个临时(临时)分支并在那里提交当前工作。

    然后切换到并签出您的原始分支,并从草稿提交中选择适当的文件。

    至少您将拥有当前和以前状态的永久记录(直到您删除该临时分支)。

    【讨论】:

      【解决方案5】:

      所以真正的答案

      这个程序员现在可以用一些神奇的 git 命令取消他最后的更改吗?

      实际上是:不,你不能只取消最后一个git add

      也就是说,如果我们将问题解释为以下情况:

      初始文件:

      void foo() {
      
      }
      
      main() {
          foo();
      }
      

      第一个更改,然后是git add

      void foo(int bar) {
          print("$bar");
      }
      
      main() {
          foo(1337);
      }
      

      第二次更改,然后是git add

      void foo(int bar, String baz) {
          print("$bar $baz");
      }
      
      main() {
          foo(1337, "h4x0r");
      }
      

      在这种情况下,git reset -p 将无济于事,因为它的最小粒度是行。 git 不知道中间状态:

      void foo(int bar) {
          print("$bar");
      }
      
      main() {
          foo(1337);
      }
      

      还有。

      【讨论】:

      • 我很高兴,因为作为一个新的 git 用户,这是一个非常重要的区别,突出了我的朋友所说的“有良好的签到卫生”......我的个人经历 - 它被描述为“拼车”(糟糕!)。
      【解决方案6】:

      在日期 git 提示:

      1. use "git rm --cached <file>..." to unstage 如果文件不在仓库中。它会取消暂存文件,将它们保存在那里。
      2. use "git reset HEAD <file>..." to unstage 如果文件在 repo 中,并且您将它们添加为已修改。它保持文件原样,并取消暂存它们。

      据我所知,您无法撤消 git add --,但您可以取消暂存上述文件列表。

      【讨论】:

        【解决方案7】:
        • 从索引中删除文件,但保留它的版本并在工作副本中保留未提交的更改:

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

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

          这是必需的,因为 git reset --hard HEAD 不适用于单个文件。

        • 从索引和版本控制中删除&lt;file&gt;,保留未版本控制的文件与工作副本中的更改:

          git rm --cached <file>
          
        • 从工作副本和版本控制中完全删除 &lt;file&gt;

          git rm <file>
          

        【讨论】:

          【解决方案8】:

          如果你想删除所有添加的文件从 git 提交

          git reset
          

          如果您想删除单个文件

          git rm <file>
          

          【讨论】:

            【解决方案9】:

            你可以使用

            git reset
            

            撤销最近添加的本地文件

             git reset file_name
            

            撤消对特定文件的更改

            【讨论】:

              猜你喜欢
              • 2017-09-03
              • 2011-05-28
              • 2011-06-06
              • 2015-03-16
              • 2017-05-27
              • 2010-09-25
              相关资源
              最近更新 更多