我使用命令错误地将文件添加到 Git :
git add myfile.txt
我还没有执行 git 承诺 。 我如何撤销此操作, 使这些更改不被包含在承诺中 ?
我使用命令错误地将文件添加到 Git :
git add myfile.txt
我还没有执行 git 承诺 。 我如何撤销此操作, 使这些更改不被包含在承诺中 ?
当前回答
要撤销 git 添加, 请使用 :
git reset filename
其他回答
您可以使用 Git 命令或 Git 图形用户界面来卸载或撤销 。
单个文件
git reset File.txt
多个文件
git reset File1.txt File2.txt File3.txt
示例示例示例示例
假设你错误地添加了Home. Js, ListThompt. Js, 更新js,
调
并要撤消/重置
git reset src/components/home/Home.js src/components/listItem/ListItem.js src/components/update/Update.js
调
使用 Git 图形界面的相同例子
git gui
打开窗口。不从阶段更改中检查您的文件( 将执行)
调
git rm --cached . -r
将“ un- add- add” 添加您从当前目录中添加的所有内容递归到当前目录
我将使用 git 恢复 -- paged. 或 git 恢复 -- paged < filename >
您也可以使用 git rm -- ccared, 但是, git rm 命令最好用于已经跟踪的文件 。
在接受的答案之外, 如果你的错误添加文件是巨大的, 你可能会注意到, 即使从索引中删除了“ 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 status
Git会告诉你什么是舞台,等等, 包括关于如何解除舞台的指示:
use "git reset HEAD <file>..." to unstage
我发现吉特做的相当不错 裸体我做正确的事情 在这样的情况下。
注:最近Git版本(1.8.4.x)更改了此电文:
(use "git rm --cached <file>..." to unstage)