如何在提交前撤销 'git add'?

11227

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

git add myfile.txt

我还没有运行git commit命令。我该如何撤销这个操作,以便这些更改不会被提交?


50
从 Git v1.8.4 开始,所有使用 HEADhead 的答案现在可以使用 @ 代替 HEAD。请参见此答案(最后一节)了解为什么可以这样做。 - user456814
5
我做了一个小总结,展示了取消暂存文件的所有方法:https://dev59.com/Dmw05IYBdhLWcg3w9mhW#16044987 - Daniel Alder
8
如果您使用Eclipse,取消勾选提交对话框中的文件就像简单的操作一样。 - Hamzahfrq
2
这是一份来自Github的绝佳资源:如何使用Git撤销(几乎)所有操作 - jasonleonhard
3
在发布新答案之前,请考虑此问题已经有25个以上的答案。确保您的答案提供了现有答案中不存在的内容。 - Sazzad Hissain Khan
显示剩余6条评论
39个回答

31

要重置特定文件夹(包括其子文件夹)中的所有文件,您可以使用以下命令:

git reset *

5
实际上,这并不会重置每个文件,因为 * 使用了 shell 扩展,并忽略了点文件和点目录。 - Luc
你可以运行 git status 命令查看未提交的更改,然后手动重置它,例如:git reset 文件名 - Zorayr

30

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

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

等等。


4
请注意,* 通常不包括点文件或“点目录”,除非您明确指定 .*.*.prj - Luc
* 不是一个命令,它是一个通配符。 - Dan Dascalescu

29

只需键入git reset,它将恢复到以前的状态,就像您从未键入过git add .一样。请确保您已经提交了更改。


恰好,最后一次提交确实发生了...但我特别询问的是如何从提交中删除单个文件,而不是每个文件。 - oz10
除了顶部答案,这个答案还提供了什么? - Dan Dascalescu

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

图片描述

假设我不小心添加了这个文件:git add newFile.txt

图片描述

现在我想在提交之前撤销此操作:git reset newFile.txt

图片描述


假设我现在处于第一张图片,也就是说我甚至还没有执行“git.add”。而且我根本不想要这些更改。我的意思是,当我执行git status时,它不应该显示任何红色文件。我的意思是,它应该与上次git push之后没有单个文件被更改一样同步。如何实现这一点? - Unbreakable
假设您现在处于第一步,想要撤销所有更改,使得“newFile.txt”不再以红色显示。 - Unbreakable
当我执行git status时,我不应该看到任何更改。所有红色文件都应该被还原。 - Unbreakable
更加技术性地说,“如何撤销本地仓库中未放入暂存区的文件更改”。 - Unbreakable
你试过使用 "git checkout file_name" 吗?另外,你也可以通过使用 "git stash" 储藏这些更改。 - Vidura Mudalige
显示剩余6条评论

25

针对特定文件:

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

针对所有添加的文件:

  • git reset .
  • git checkout .

注意: checkout 更改文件中的代码并移动到最后更新 (已提交) 的状态。而reset 不更改代码,只是重置头部。


4
请解释 git reset <file>git checkout <file> 之间的区别。git reset <file> 会将指定文件的更改从暂存区中撤回,但仍然保留在工作目录中。这意味着您可以继续编辑该文件并提交更改。git checkout <file> 会将指定文件恢复为当前分支上最新提交的版本,即丢弃所有未保存的更改。因此,git reset <file> 是用于取消已暂存文件的更改,而 git checkout <file> 用于放弃对一个文件的所有未提交更改。 - Trent
1
重置不会改变文件,只是将它从暂存区(即通过git add放置的位置)移开。 - franc
检出更改文件中的代码并移动到最后更新的状态。 重置不会更改代码,它只会重置标题。例如,重置用于在推送之前重置已添加或提交的文件,而检出用于返回到 git add 之前的最后更新/提交阶段。 - Hasib Kamal Chowdhury
1
重置(reset)= 从暂存区中删除该文件,但更改仍将存在。 检出(checkout)= 从版本库获取更新的文件,并覆盖当前文件。 - Imam Bux

18

要撤销git add,请使用:

git reset filename

这个答案有什么优势,比起8年前给出的最佳答案呢?@PeterMortensen,你编辑过这个问题 - 为什么不标记为重复并删除呢? - Dan Dascalescu

17

还有交互模式:

git add -i

选择选项3来取消添加文件。在我的情况下,我经常想要添加多个文件,而使用交互模式,您可以使用类似于这样的数字来添加文件。 这将除了4号以外全部添加:1、2、3和5。

要选择一个序列,只需键入1-5以从1到5获取所有内容。

Git分段文件


"我很惊讶没有人提到交互模式" - 他们提到了:https://dev59.com/mnRC5IYBdhLWcg3wSu97#10209776。 - Mark Amery

16

这个命令将会取消储藏您所做的更改:

git reset HEAD filename.txt

你也可以使用

git add -p 

添加文件的部分。


16
git reset filename.txt  

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


git 重置 [文件名]例: git 重置 src/main/java/com/dao/ImportCsvDataDaoImpl.java - Rohit Chaurasiya

15
git add -A

用于将所有文件添加到您的提交(暂存区)中。

git reset

git reset命令是'git add -A'命令的相反操作,它会移除所有已经暂存(即准备提交)的文件。

同样地,若要将特定文件加入到提交中,我们使用git add <filename>命令。

同样地,若要取消特定文件的暂存(或重置),我们使用git reset <filename> 命令,该命令是git add命令的完全相反操作。


欢迎来到Stack Overflow。 如果您决定回答一个已经有了成熟和正确答案的旧问题,那么在一天结束时添加新答案可能不会给您带来任何好处。 如果您有一些独特的新信息,或者您确信其他答案都是错误的,请务必添加新答案,但通常情况下,在问题被提出很久之后再提供相同基本信息的“又一个答案”通常不会为您赢得太多信誉。 - Jonathan Leffler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接