我使用命令错误地将文件添加到 Git :
git add myfile.txt
我还没有执行 git 承诺 。 我如何撤销此操作, 使这些更改不被包含在承诺中 ?
我使用命令错误地将文件添加到 Git :
git add myfile.txt
我还没有执行 git 承诺 。 我如何撤销此操作, 使这些更改不被包含在承诺中 ?
当前回答
在接受的答案之外, 如果你的错误添加文件是巨大的, 你可能会注意到, 即使从索引中删除了“ git 重置 ” , 它似乎仍然在. git 目录中占据着空间 。
这没什么可担心的;文件确实还在存储库中,但只是作为“空天体”而已。它不会被复制到其他存储库(通过克隆、推推),空间最终会被回收——也许不会很快。如果你急躁,你可以运行:
git gc --prune=now
最新消息(以下是我试图澄清在最受欢迎的答复中可能出现的一些混乱):
那么,Git 添加的哪一种才是真正的反差呢?
git 重置 HEAD < file > 吗 ?
或
git rm -- ccared <file > 吗 ?
严格地说,如果我没弄错:没有。
无法撤销 git 添加 - 一般来说是安全的 。
让我们首先回忆一下 Git 添加 < file > 实际所做的 :
如果 < file > 之前没有被跟踪, Git 将它添加到缓存中, 并包含其当前内容 。 如果 < file > 已经被跟踪, git 将当前内容( snapshot, 版本) 添加到缓存中。 在 Git 中, 此动作仍然被称作添加( 不仅仅是更新) , 因为文件的两个不同版本( snapshots) 被视为两个不同的项目 : 因此, 我们确实正在缓存中添加一个新项目, 最终要执行 。
有鉴于此,问题略微模糊不清:
我使用命令错误地添加了文件...
OP 的假想似乎是第一个( 未跟踪的文件) , 我们希望“ 未做 ” 从跟踪的项目中删除文件( 不仅仅是当前内容 ) 。 如果是这样, 那么运行 git rm -- cashed < file > 就可以了 。
我们还可以运行 git 重置 HEAD < file > 。 这一般来说比较可取, 因为它在两种情况下都有效: 当我们错误地添加了已经跟踪到的项目的版本时, 它也会发生错误 。
但有两个警告。
第一: (如在答案中指出的) 只有一种情况是, git 重置 HEAD 不起作用, 但是 git rm -- cashed does: 一个新的仓库( 没有承诺 ) 。 但实际上, 这实际上是一个无关紧要的个案 。
第二:请注意, Git 重置 HEAD 无法神奇地收回先前的缓存文件内容, 它只是从 HEAD 中收回它。 如果我们错误的 GIT 添加了一个先前的未承诺版本, 我们无法收回它。 因此, 严格地说, 我们无法撤销 [ *] 。
示例:
$ 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
当然,如果我们只是遵循通常的懒惰工作流程,只为添加新文件而做“git add” (第1个案例),而我们通过承诺、 git enture - a 命令更新新内容,这并非非常关键。
* (编辑:上述内容实际上是正确的,但是仍然可以有一些稍有黑客/参与的方式来恢复已经形成但并未实施、但又被推翻的变革——见Johannes Matokic和iolsmit的评论)
其他回答
还有一个互动模式:
git add -i
选择 选项 3 到 取消 添加文件 。 在我的情况中, 我通常要添加多个文件, 用交互模式, 您可以使用这样的数字来添加文件 。 这将除 4: 1, 1, 2, 3, 和 5 以外, 全部要用这个数字来添加文件 : 1, 2, 3 和 5
要选择一个序列, 只要类型 1-5 就可以从 1 到 5 全部取出 。
Git 中转文件
git 添加我的文件. txt # 这将将您的文件添加到待发列表中
与这个命令完全相反的是,
git reset HEAD myfile.txt # This will undo it.
因此,您将处于上一个状态。指定的状态将再次出现在未跟踪的列表中(先前的状态)。
它会用指定的文件重置你的头。 所以, 如果您的头没有它意味着, 它只会重置它 。
如上文所述,从中转区删除新文件(仅在出现新文件的情况下):
git rm --cached FILE
使用 rm -- -- 刻录仅用于新文件不小心添加 。
您想要 :
git rm --cached <added_file_to_undo>
理由:
当我刚开始做这个的时候,我第一次尝试
git reset .
(取消我最初添加的全部内容), 只是为了得到这个(不是这样的)有用信息:
fatal: Failed to resolve 'HEAD' as a valid ref.
结果发现,这是因为 HEAD ref (blanch?) 直到第一次承诺之后才存在。 这就是说,你会遇到跟我一样的初学者的问题, 如果你的工作流程像我的一样, 像是:
cd to my great new project directory to try out Git, the new hotness git init git add . git status ... lots of crap scrolls by ... => Damn, I didn't want to add all of that. google "undo git add" => find Stack Overflow - yay git reset . => fatal: Failed to resolve 'HEAD' as a valid ref.
邮件列表上记录了一个窃听器 记录了这个无益之处
正确的解决方案就在 Git 状态输出中( 是的, 我将它伪装成“ 废话 ” ) 。
... # 将要执行的修改 : # (使用“ git rm -- cashed < file >...” 来取消)...
事实上,解决办法是使用Git rm -- cashed FILE。
在此注意其它处的警告 - git rm 删除您本地的文件工作副本, 但如果您使用 -- cashed , 则不使用。 这是 Git help rm 的结果 :
--cached 使用此选项来卸载和从索引中删除路径。 工作树文件, 不论是否修改, 都会被左移 。
我开始使用
git rm --cached .
以删除所有内容并重新开始。 虽然没有成功, 因为添加. 是循环的, 结果显示 Rm 需要 - r 循环。 叹息 。
git rm -r --cached .
好了,我现在回到我开始的地方。下次我要用...
git add -n .
我把所有东西都拉到一个安全的地方,
在源树中,您可以通过 GUI 轻松地做到这一点。您可以检查源树命令用什么来取消文件 。
我创建了一个新的文件, 并将其添加到 Git 中。 然后我用“ 原始树 GUI” 解除了它。 这是结果 :
解除文件 [08/12/ 15 10: 43] git - c diff. mnemonicprefix= false - c c c核心. cootepath= false - creedical. helper= 源树重新设置 -q - 路径/ 到/ 文件/ files/ filename.java
源树使用重置来卸载新文件 。