我使用命令错误地将文件添加到git:
git add myfile.txt
我还没跑 git commit
。有没有办法撤消这个,所以这些文件不会包含在提交中?
到目前为止有48个答案(有些已删除)。除非您有一些新信息,否则请不要添加新的。
我使用命令错误地将文件添加到git:
git add myfile.txt
我还没跑 git commit
。有没有办法撤消这个,所以这些文件不会包含在提交中?
到目前为止有48个答案(有些已删除)。除非您有一些新信息,否则请不要添加新的。
你可以撤消 git add
在提交之前
git reset <file>
这将从当前索引(“即将提交”列表)中删除它而不更改任何其他内容。
您可以使用
git reset
没有任何文件名来取消所有应有的更改。当在合理的时间内逐个列出太多文件时,这可以派上用场。
在旧版本的Git中,上述命令相当于 git reset HEAD <file>
和 git reset HEAD
分别,如果,将失败 HEAD
未定义(因为您尚未在您的仓库中进行任何提交)或模糊(因为您创建了一个名为的分支) HEAD
,这是一件你不应该做的蠢事。这个 在Git 1.8.2中被改变了但是,在现代版本的Git中,您甚至可以在第一次提交之前使用上述命令:
用于错误输出的“git reset”(没有选项或参数) 你在历史上没有任何提交,但它现在给你了 一个空索引(用于匹配您甚至不在的不存在的提交)。
你要:
git rm --cached <added_file_to_undo>
推理:
当我是新手时,我首先尝试过
git reset .
(撤消我的整个初始添加),只是为了得到这个(不那么)有用的消息:
fatal: Failed to resolve 'HEAD' as a valid ref.
事实证明,这是因为HEAD ref(branch?)直到第一次提交后才存在。也就是说,如果你的工作流程像我一样,你会遇到和我一样的初学者问题:
git init
git add .
git status
......很多废话卷轴......
=>该死,我不想加上所有这些。
谷歌“撤消git添加”
=>查找Stack Overflow - yay
git reset .
=>致命:无法将'HEAD'解析为有效的参考号。
它进一步证明了存在 记录了一个错误 反对邮件列表中的这种无益。
并且正确的解决方案就在Git状态输出中(是的,我把它作为'废话'掩盖了)
... # Changes to be committed: # (use "git rm --cached <file>..." to unstage) ...
而解决方案确实是使用 git rm --cached FILE
。
注意这里其他地方的警告 - git rm
删除文件的本地工作副本,但是 不 如果你使用 --cached。这是结果 git help rm
:
--cached 使用此选项仅从索引中取消暂存和删除路径。 将保留工作树文件,无论是否已修改。
我继续使用
git rm --cached .
删除所有内容并重新开始。虽然没有工作,因为虽然 add .
结果是递归的 rm
需求 -r
递减。叹。
git rm -r --cached .
好的,现在我回到了我开始的地方。下次我要去使用 -n
做一个干运行,看看会添加什么:
git add -n .
在信任之前,我把所有东西都拉到了一个安全的地方 git help rm
有关 --cached
不破坏任何东西(如果我拼错它会怎么样)。
如果您输入:
git status
git会告诉你什么是上演的,包括如何取消演出的说明:
use "git reset HEAD <file>..." to unstage
我发现git在推动我在这样的情况下做正确的事情方面做得非常好。
注意:最近的git版本(1.8.4.x)已更改此消息:
(use "git rm --cached <file>..." to unstage)
澄清: git add
将更改从当前工作目录移动到 集结区 (指数)。
这个过程被称为 分期。所以最自然的命令 阶段 更改(更改的文件)是显而易见的:
git stage
git add
只是更容易键入别名 git stage
可惜没有 git unstage
也不 git 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
对于已接受的答案的补充,如果您错误添加的文件很大,您可能会注意到,即使在将其从索引中删除后也是如此git reset
',它似乎仍占据着空间 .git
目录。这没什么可担心的,文件确实仍在存储库中,但只是作为“松散对象”,它不会被复制到其他存储库(通过克隆,推送),并且该空间最终将被回收 - 尽管也许不是很快。如果您感到焦虑,可以运行:
git gc --prune=now
更新 (接下来是我试图澄清最多投票答案可能引起的混淆):
那么,这才是真实的 解开 的 git add
?
git reset HEAD <file>
?
要么
git rm --cached <file>
?
严格地说,如果我没弄错的话: 没有。
git add
无法撤消 - 一般来说,安全。
让我们先回顾一下 git add <file>
实际上:
如果 <file>
是 以前没有跟踪, git add
将其添加到缓存中,以其当前的内容。
如果 <file>
是 已被跟踪, git add
保存当前内容 (快照,版本)到缓存。在GIT中,仍然会调用此操作 加,(不仅仅是 更新 因为文件的两个不同版本(快照)被视为两个不同的项目:因此,我们确实在缓存中添加了一个新项目,最终将在稍后提交。
鉴于此,问题有点含糊:
我错误地使用命令添加文件...
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),并且我们通过提交更新新内容,这不是非常关键的, git commit -a
命令。
git rm --cached . -r
将以递归方式“取消添加”您从当前目录添加的所有内容
跑
git gui
并手动删除所有文件或选择所有文件并单击 从提交中删除 按钮。
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>
问题没有明确提出。原因是 git add
有两个含义:
git rm --cached file
。git reset HEAD file
。如果有疑问,请使用
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
解开 已添加的文件非常容易使用 混帐,用于重置 myfile.txt
已添加,使用:
git reset HEAD myfile.txt
说明:
在您上传不需要的文件后,要撤消,您可以这样做 git reset
, Head
是本地文件的头部,最后一个参数是文件的名称。
我将在下面的图片中为您创建更多详细信息,包括在这些情况下可能发生的所有步骤:
如果您正在进行初始提交并且无法使用git reset,只需声明“Git破产”并删除.git文件夹并重新开始