如何在提交之前撤消“git add”?

git version-control git-commit git-stage 白色喷泉蜀黍 | 2020-02-02 19:35:06




想改进这篇文章吗?提供这个问题的详细答案,包括引文和解释为什么你的答案是正确的。没有足够详细信息的答案可能会被编辑或删除。


我错误地使用命令将文件添加到Git中:
git add myfile.txt

我尚未运行
git commit
。是否有方法撤消此操作,以便这些文件不会包含在提交中?


本站提供【Linux疑难问题解决】50元起 ,【爬虫开发】200元起。欢迎咨询QQ:376667689 点击这里给我发消息



30 回答


9921


使用
git reset 

可以在提交之前撤消
git add

操作,该操作将从当前索引(“即将提交”列表)中删除它,而无需更改任何其他内容。
您可以使用
git reset

而无需任何文件名来取消所有应做的更改。当在合理的时间内有太多的文件需要逐个列出时,这一点非常有用。
在旧版本的Git中,上述命令分别相当于
git reset HEAD 
git reset HEAD
,如果未定义
HEAD
则会失败(因为您尚未在或者模棱两可(因为您创建了一个名为
HEAD
的分支,这是您不应该做的蠢事)。不过,这在Git 1.8.2中有所改变,因此在Git的现代版本中,即使在第一次提交之前,您也可以使用上面的命令:
“Git reset”(不带选项或参数)用于在您的历史记录中没有任何提交时出错,但是现在它给出了
空索引(以匹配甚至不存在的不存在的提交)。

2020-02-02 19:35:18
传说哥

2114


你想要:
git rm --cached 

推理:
当我刚开始做这个的时候,我第一次尝试了
git reset .

(撤销我的整个初始添加),结果得到了这个(不是这样)有用的消息:
fatal: Failed to resolve 'HEAD' as a valid ref.

结果是因为头引用(分支?)直到第一次提交之后才存在。也就是说,如果你的工作流程和我的一样,是这样的话,你会遇到和我一样的初学者问题:
cd到我的新项目目录去尝试Git,新的hotness
git init

git add .

git status

。。。很多垃圾卷轴…
=>该死,我不想全部添加。
google“undo git add”
=>查找堆栈溢出-yay
git reset .

=>致命:未能将“HEAD”解析为有效的ref。
进一步发现,邮件列表中记录了一个错误,说明此错误没有帮助。
正确的解决方案就在git中状态输出(是的,我把它隐藏为“垃圾”
...
# Changes to be committed:
# (use "git rm --cached ..." 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
之前将所有内容压缩到一个安全的地方,然后才信任
[18]
关于
--缓存的
不销毁任何内容(以及如果我拼写错误该怎么办)。

2020-02-02 19:35:18
阿菲

523


如果您键入:
git status

Git将告诉您什么是分段的,等等。,包括有关如何取消标记的说明:
use "git reset HEAD ..." to unstage

我发现Git很好地推动我在这种情况下做正确的事情。
注意:最新的Git版本(1.8.4.x)更改了此消息:
(use "git rm --cached ..." to unstage)

2020-02-02 19:35:18
李子alt

243


要澄清:
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

2020-02-02 19:35:18
落落

165


除了公认的答案之外,如果错误添加的文件很大,您可能会注意到,即使使用“
git reset
”将其从索引中删除,它似乎仍会占用
.git
目录中的空间。
这没什么好担心的;文件确实仍在存储库中,但只是作为一个“松散的物体”。它不会被复制到其他存储库(通过克隆、推送),空间最终会被回收——尽管可能不会很快。如果你焦虑,你可以运行:
PRE> [代码] > BR> Update(以下是我试图澄清一些从最乐观的答案中产生的混淆):
那么,这是
  [3 ] < /C> < /Pr> >的真正撤销?
git reset HEAD 


git rm --cached 

严格地说,如果我没有弄错的话:没有。
git add
一般来说是无法安全撤消的。
让我们首先回顾一下
git add 
实际上做了什么:
如果
以前没有被跟踪过,则
git add
会将其添加到缓存中,使用当前内容。
如果已经跟踪了
,则
git add
将当前内容(快照、版本)保存到缓存中。在Git中,这个操作仍然称为add(不仅仅是更新它),因为一个文件的两个不同版本(快照)被视为两个不同的项:因此,我们确实在向缓存中添加一个新项,以便以后最终提交。
有鉴于此,这个问题有点模棱两可:
我使用命令错误地添加了文件…
OP的场景似乎是第一个(未跟踪的文件),我们希望“撤消”从跟踪项中删除文件(而不仅仅是当前内容)。如果是这种情况,那么可以运行
git rm --cached 

,我们也可以运行
git reset HEAD 
。一般来说,这是比较可取的,因为它在两种情况下都有效:当我们错误地添加了已跟踪项的版本时,它也会执行撤消操作。
但有两个注意事项。
首先:只有一种情况(如回答中指出的那样)在这种情况下,
git reset HEAD
不起作用,但是
git rm --cached
确实:一个新的存储库(没有提交)。但是,事实上,这几乎是一个无关紧要的情况。
第二:要知道
git reset 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 irrevocably lost "version 2"
-version 1
+version 3

当然,如果我们只是遵循通常的惰性工作流,即只为添加新文件而执行“git add”(案例1),并且我们通过提交更新新内容,这就不是很关键了,
git commit -a
命令。

*(编辑:上述内容实际上是正确的,但仍有一些稍微有点老套/复杂的方法来恢复已暂存但未提交然后被覆盖的更改-请参阅Johannes Matokic和iolsmit的注释)

2020-02-02 19:35:18
Tomoyo

103


使用Git撤销已经添加的文件非常容易。要重置已添加的
myfile.txt
,请使用:
git reset HEAD myfile.txt

说明:
在暂存不需要的文件之后,若要撤消,可以执行
git reset
Head
是本地文件的头,最后一个参数是文件名。
我已经为您创建了下面图像中的步骤,其中包括在这些情况下可能发生的所有步骤:

2020-02-02 19:35:18
oicpigsfly

92


git rm --cached . -r

将递归“取消添加”您从当前目录添加的所有内容

2020-02-02 19:35:18
那怒火多

88


运行
git gui

并手动删除所有文件,或选择所有文件并单击“从提交中取消保存”按钮。

2020-02-02 19:35:18
阿拉垃圾君

82


Git对每个可以想象的操作都有命令,但它需要广泛的知识才能使事情正确,因此它充其量是违反直觉的……
您以前所做的:
更改了一个文件并使用了
git add .
git add 

您想要的:
从索引中删除该文件,但要保持其版本和在工作副本中保留未提交的更改:
git reset head 

将文件重置为HEAD的最后一个状态,撤消更改并将其从索引中删除:
# Think `svn revert ` IIRC.
git reset HEAD
git checkout
# If you have a `` named like ``, use:
git checkout --

这是必需的,因为
git reset --hard HEAD
不能用于单个文件。
从索引和版本控制中删除
,在工作副本中保留未版本化的文件:
git rm --cached 

从工作副本和版本化中完全删除

git rm 

2020-02-02 19:35:18
妃小姬

77


这个问题没有明确提出。原因是
git add
有两种含义:
向暂存区域添加新文件,然后使用
git rm --cached file
撤消
向暂存区域添加修改过的文件,然后使用
git reset HEAD file
撤消
如果有疑问,使用< BR> < PRE> < /PRE> > BR>因为在两种情况下都做了预期的事情。
警告:如果在修改过的文件(存储库中以前存在的文件)中执行了代码>(4)< /代码> /PRE>,则文件将在

>代码> [ 5 ] < /代码>

上删除!它将仍然存在于您的文件系统中,但是如果有人从您的提交树中删除该文件,则该文件将从其工作树中删除。
< PRE> [代码> < /PRE> >将告诉您该文件是新文件还是修改的:
< PRE> >代码> [ 7 ] < /PRE> > BR>

2020-02-02 19:35:18
naia

64


如果您在初始提交时无法使用
git reset
,只需声明“Git破产”,删除
.git
文件夹并重新开始

2020-02-02 19:35:18
雪夜HAGURO

57


根据许多其他答案,您可以使用
git reset

但是:
我发现这个很棒的小帖子实际上添加了用于
git unadd
的Git命令(一个别名):有关详细信息,请参见Git unadd,或者..
简单地说,
git config --global alias.unadd "reset HEAD"

现在您可以
git unadd foo.txt bar.txt

2020-02-02 19:35:18
三倍速kana

44


使用
git add -i
从即将提交的文件中删除刚添加的文件。示例:
添加您不想要的文件:
$ git add foo
$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD ..." to unstage)
#
# new file: foo
#
# Untracked files:
# (use "git add ..." to include in what will be committed)
# [...]#

进入交互式添加以撤消添加(在git中键入的命令有“r”(还原)、“1”(列表中的第一个条目还原显示)、“return”退出还原模式和“q”(退出):
$ git add -i
staged unstaged path
1: +1/-0 nothing foo
*** Commands ***
1: [s]tatus 2: [u]pdate 3: [r]evert 4: [a]dd untracked
5: [p]atch 6: [d]iff 7: [q]uit 8: [h]elp
What now> r
staged unstaged path
1: +1/-0 nothing [f]oo
Revert>> 1
staged unstaged path
* 1: +1/-0 nothing [f]oo
Revert>>
note: foo is untracked now.
reverted one path
*** Commands ***
1: [s]tatus 2: [u]pdate 3: [r]evert 4: [a]dd untracked
5: [p]atch 6: [d]iff 7: [q]uit 8: [h]elp
What now> q
Bye.
$

就这样!这是您的证明,表明“foo”已回到未跟踪列表中:
$ git status
# On branch master
# Untracked files:
# (use "git add ..." to include in what will be committed)
# [...]
# foo
nothing added to commit but untracked files present (use "git add" to track)
$

2020-02-02 19:35:18
aya4649

43


git remove
git rm
可用于此,并带有
--cached
标志。尝试:
git help rm

2020-02-02 19:35:18
1.2.3

38

这是一个避免新项目启动时的麻烦问题的方法:
为新项目创建主目录。
运行< PRE> >代码> [代码> < /PRE> > BR>现在创建一个GiTigGORE文件(即使它是空的)。
提交您的.GiTigGORE文件。如果您创建一个小的初始提交只是为了有一个,之后,您可以根据需要多次

git add -A
git reset
以获得正确的结果。
此方法的另一个优点是,如果您遇到以后结束故障的行,并且需要刷新所有文件,很简单:
查看初始提交。这将删除所有文件。
然后再次签出最近的提交。这将使用当前行尾设置检索文件的新副本。

2020-02-02 19:35:18
猥神

34


也许自从你提出问题以来,Git已经发展了。
$> git --version
git version 1.6.2.1

现在,你可以尝试:
git reset HEAD .

这应该是你想要的。

2020-02-02 19:35:18
猪帽子亭店长

34


请注意,如果未能指定修订,则必须包含分隔符。我的控制台示例:
git reset 
fatal: ambiguous argument '': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions
git reset --
Unstaged changes after reset:
M

(Git版本1.7.5.4)

2020-02-02 19:35:18
解離

31


要从暂存区域中删除新文件(仅在有新文件的情况下),如上所述:
git rm --cached FILE

仅对意外添加的新文件使用rm--cached。

2020-02-02 19:35:18
八云寺神奈子

25


要重置特定文件夹(及其子文件夹)中的每个文件,可以使用以下命令:
git reset *

2020-02-02 19:35:18
风来

25


使用
*
命令一次处理多个文件:
git reset HEAD *.prj
git reset HEAD *.bmp
git reset HEAD *gdb*

等。

2020-02-02 19:35:18
该用户已下线

23


只需键入
git reset
它将返回,就像您上次提交后从未键入过
git add .
。确保你以前已经承诺过。

2020-02-02 19:35:18
封兽鵺

20


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

假设我意外添加了该文件,
git add newFile.txt

现在我想在提交之前撤消此添加,
git reset newFile.txt

2020-02-02 19:35:18
扒你裤衩打你家玻璃

19


对于特定文件:

git reset my_file.txt
git checkout my_file.txt

对于所有添加的文件:

git reset.
git checkout.

注意:checkout更改文件中的代码并移到最后更新(提交)状态。重置不会更改代码;它只是重置标题。

2020-02-02 19:35:18
因幡帝

14


对于世界,请使用:
git reset filename

2020-02-02 19:35:18
rimis

14


此命令将取消显示您的更改:
git reset HEAD filename.txt

您还可以使用
git add -p 

添加部分文件。

2020-02-02 19:35:18
XEの大叔

14


还有交互模式:
git add -i

选择选项3取消添加文件。在我的例子中,我经常想添加多个文件,在交互模式下,你可以使用这样的数字来添加文件。这将需要4:1、2、3和5以外的所有文件
要选择一个序列,只需键入1-5从1到5获取所有文件。
Git staging files

2020-02-02 19:35:18
樱酱SAMA

10


git reset filename.txt

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

2020-02-02 19:35:18
muye

10


git add myfile.txt
#这会将您的文件添加到待提交列表中
与此命令完全相反的是,
git reset HEAD myfile.txt  # This will undo it.

因此,您将处于前一状态。指定的将再次处于未跟踪列表(以前的状态)。
它将用指定的文件重置您的头。所以,如果你的头没有它的意思,它将简单地重置它。

2020-02-02 19:35:18
江南狂徒


在Sourcetree中,您可以通过GUI轻松完成此操作。
您可以检查Sourcetree使用哪个命令来取消文件的保存。
我创建了一个新文件并将其添加到Git中。然后,我使用Sourcetree GUI将其解封。
结果是:
解封文件[08/12/15 10:43]
git-c diff.mnemonicprefix=false-c core.quotepath=false-c credential.helper=Sourcetreereset-q--path/to/file/filename.java
Sourcetree使用
reset
来解封新文件。

2020-02-02 19:35:18
alina


git reset filename.txt  

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

2020-02-02 19:35:18
茅原千秋



Copyright © 2019-2020 zimt8.com
备案号:湘ICP备19012068号