pax*_*977 8567 git version-control git-commit git-stage
我错误地使用命令将文件添加到git:
git add myfile.txt
Run Code Online (Sandbox Code Playgroud)
我还没跑git commit
.有没有办法撤消这个,所以这些文件不会包含在提交中?
到目前为止有48个答案(有些已删除).除非您有一些新信息,否则请不要添加新的.
gen*_*ack 9777
您可以git add
在提交之前撤消
git reset <file>
Run Code Online (Sandbox Code Playgroud)
这将从当前索引("即将提交"列表)中删除它而不更改任何其他内容.
您可以使用
git reset
Run Code Online (Sandbox Code Playgroud)
没有任何文件名来取消所有应有的更改.当在合理的时间内逐个列出太多文件时,这可以派上用场.
在旧版本的Git中,上面的命令分别等同于git reset HEAD <file>
,git reset HEAD
如果HEAD
未定义(因为你还没有在你的repo中做过任何提交)或者模糊不清(因为你创建了一个叫做的分支HEAD
,这是一个愚蠢的事情)将会失败你不应该这样做.这是在Git的1.8.2改变,虽然如此,在Git中的现代版本,你可以使用,甚至在决策前上方的命令,你的第一个承诺:
当您在历史记录中没有任何提交时,"git reset"(没有选项或参数)用于错误输出,但它现在为您提供一个空索引(以匹配不存在的提交您甚至没有).
Rhu*_*arb 2105
你要:
git rm --cached <added_file_to_undo>
Run Code Online (Sandbox Code Playgroud)
推理:
当我刚接触这个时,我首先尝试过
git reset .
Run Code Online (Sandbox Code Playgroud)
(撤消我的整个初始添加),只是为了得到这个(不那么)有用的消息:
fatal: Failed to resolve 'HEAD' as a valid ref.
Run Code Online (Sandbox Code Playgroud)
事实证明这是因为HEAD ref(branch?)直到第一次提交之后才存在.也就是说,如果你的工作流程像我一样,你会遇到和我一样的初学者问题:
git init
git add .
git status
......很多废话卷轴......
=>该死,我不想加上所有这些.
谷歌"撤消git添加"
=>找到Stack Overflow - yay
git reset .
=>致命:无法将'HEAD'解析为有效的参考号.
并且正确的解决方案就在Git状态输出中(是的,我把它作为'废话'掩盖了)
Run Code Online (Sandbox Code Playgroud)... # 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 .
Run Code Online (Sandbox Code Playgroud)
删除所有内容并重新开始.虽然没有工作,因为虽然add .
是递归的,但结果rm
需要-r
递归.叹.
git rm -r --cached .
Run Code Online (Sandbox Code Playgroud)
好的,现在我回到了我开始的地方.下次我要用-n
来做干运行,看看会添加什么:
git add -n .
Run Code Online (Sandbox Code Playgroud)
我相信前拉上了一切到一个安全的地方git help rm
关于--cached
不破坏任何东西(和什么如果我拼错了它).
Pau*_*ham 522
如果输入:
git status
Run Code Online (Sandbox Code Playgroud)
git会告诉你什么是上演的,包括如何取消演示的说明:
use "git reset HEAD <file>..." to unstage
Run Code Online (Sandbox Code Playgroud)
我发现git在推动我在这样的情况下做正确的事情方面做得非常好.
注意:最近的git版本(1.8.4.x)已更改此消息:
(use "git rm --cached <file>..." to unstage)
Run Code Online (Sandbox Code Playgroud)
tak*_*hin 243
澄清:git add
将更改从当前工作目录移动到暂存区域(索引).
此过程称为分段.所以最自然的命令阶段的变化(修改过的文件)是明显的:
git stage
Run Code Online (Sandbox Code Playgroud)
git add
只是更容易键入别名 git stage
可惜没有git unstage
也没有git unadd
命令.相关的一个更难猜测或记住,但很明显:
git reset HEAD --
Run Code Online (Sandbox Code Playgroud)
我们可以轻松地为此创建一个别名:
git config --global alias.unadd 'reset HEAD --'
git config --global alias.unstage 'reset HEAD --'
Run Code Online (Sandbox Code Playgroud)
最后,我们有了新的命令:
git add file1
git stage file2
git unadd file2
git unstage file1
Run Code Online (Sandbox Code Playgroud)
我个人使用更短的别名:
git a # For staging
git u # For unstaging
Run Code Online (Sandbox Code Playgroud)
leo*_*loy 164
对于已接受的答案的补充,如果您错误添加的文件很大,您可能会注意到,即使在使用' git reset
' 将索引从索引中删除之后,它仍然会占用.git
目录中的空间.这没什么可担心的,文件确实仍在存储库中,但只是作为"松散对象",它不会被复制到其他存储库(通过克隆,推送),并且该空间最终将被回收 - 尽管也许不是很快.如果你很焦虑,你可以运行:
git gc --prune=now
Run Code Online (Sandbox Code Playgroud)
更新(以下是我尝试清除最多投票答案可能引起的混淆):
所以,这是真正的撤销的git add
?
git reset HEAD <file>
?
要么
git rm --cached <file>
?
严格地说,如果我没有弄错:没有.
git add
一般来说,不能放松 - 安全.
让我们先回顾一下git add <file>
实际做了什么:
如果<file>
之前未跟踪过,git add
请将其添加到缓存中,并使用其当前内容.
如果<file>
是已经跟踪,git add
保存当前内容(快照,版本)到缓存中.在GIT中,这个动作仍称为add,(不仅仅是更新它),因为文件的两个不同版本(快照)被视为两个不同的项目:因此,我们确实在缓存中添加了一个新项目,最终稍后提交.
鉴于此,问题有点含糊:
我错误地使用命令添加文件...
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 irrevocably lost "version 2"
-version 1
+version 3
Run Code Online (Sandbox Code Playgroud)
当然,如果我们只是按照通常的懒惰工作流程来执行'git add'仅用于添加新文件(案例1),并且我们通过commit,git commit -a
命令更新新内容,这不是非常关键.
*(编辑:以上几乎是正确的,但仍然可以有一些稍微讨厌/错综复杂的方法来恢复已上演但未提交然后被覆盖的更改 - 请参阅Johannes Matokic和iolsmit的评论)
Ali*_*eza 101
使用git 撤消已经添加的文件很容易,重置myfile.txt
已经添加的文件,使用:
git reset HEAD myfile.txt
Run Code Online (Sandbox Code Playgroud)
说明:
在您转发不需要的文件后,要撤消,您可以这样做git reset
,Head
是本地文件的头部,最后一个参数是文件的名称.
我将在下面的图片中为您创建更多详细信息,包括在这些情况下可能发生的所有步骤:
bra*_*sch 92
git rm --cached . -r
Run Code Online (Sandbox Code Playgroud)
将以递归方式"取消添加"您从当前目录添加的所有内容
Kha*_*din 87
跑
git gui
Run Code Online (Sandbox Code Playgroud)
并手动删除所有文件,或者选择所有文件并单击" 提交"按钮.
sja*_*jas 82
Git拥有可以想象的每一个动作的命令,但需要广泛的知识来使事情正确,因此它最好是反直觉的......
你之前做过的事:
git add .
,或git add <file>
.你想要什么:
从索引中删除该文件,但保留其版本并在工作副本中保留未提交的更改:
git reset head <file>
Run Code Online (Sandbox Code Playgroud)将文件重置为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>
Run Code Online (Sandbox Code Playgroud)
这是必需的,因为git reset --hard HEAD
不适用于单个文件.
<file>
从索引和版本控制中删除,保留未版本化文件中的工作副本更改:
git rm --cached <file>
Run Code Online (Sandbox Code Playgroud)<file>
完全从工作副本和版本控制中删除:
git rm <file>
Run Code Online (Sandbox Code Playgroud)Mic*_*arf 76
问题没有明确提出.原因是它git add
有两个含义:
git rm --cached file
.git reset HEAD file
.如果有疑问,请使用
git reset HEAD file
Run Code Online (Sandbox Code Playgroud)
因为它在两种情况下都做了预期的事情.
警告:如果您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
Run Code Online (Sandbox Code Playgroud)
Ana*_*tts 64
如果您正在进行初始提交并且无法使用git reset
,只需声明"Git破产"并删除该.git
文件夹并重新开始
ele*_*ake 57
根据您可以使用的许多其他答案 git reset
但:
我发现这个伟大的小帖子实际上添加了Git命令(以及别名)git unadd
:请参阅git unadd了解详细信息或..
只是,
git config --global alias.unadd "reset HEAD"
Run Code Online (Sandbox Code Playgroud)
现在你可以
git unadd foo.txt bar.txt
Run Code Online (Sandbox Code Playgroud)
gnu*_*nud 44
git remove
或者git rm
可以用于此,带有--cached
旗帜.尝试:
git help rm
Run Code Online (Sandbox Code Playgroud)
Ale*_*eys 44
用于git add -i
从即将到来的提交中删除刚刚添加的文件.例:
添加您不想要的文件:
$ git add foo
$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# new file: foo
#
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
# [...]#
Run Code Online (Sandbox Code Playgroud)
进入交互式添加以撤消你的添加(在这里输入的命令是"r"(恢复),"1"(列表恢复中的第一个条目显示),"返回"退出恢复模式,以及"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.
$
Run Code Online (Sandbox Code Playgroud)
而已!这是你的证明,显示"foo"回到未跟踪列表:
$ git status
# On branch master
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
# [...]
# foo
nothing added to commit but untracked files present (use "git add" to track)
$
Run Code Online (Sandbox Code Playgroud)
Rya*_*ndy 38
当你开始一个新项目时,这是一种避免这个棘手问题的方法:
git init
.git reset
如果你没有任何提交,Git会很难做到.如果你创建一个微小的初始提交只是为了拥有一个,之后你可以git add -A
和git reset
你想要的一样多次,以使一切正确.
这种方法的另一个优点是,如果您以后遇到线路结束的问题并需要刷新所有文件,这很容易:
小智 34
也许自你发布问题以来Git已经发展了.
$> git --version
git version 1.6.2.1
Run Code Online (Sandbox Code Playgroud)
现在,您可以尝试:
git reset HEAD .
Run Code Online (Sandbox Code Playgroud)
这应该是你正在寻找的.
pow*_*wlo 34
请注意,如果您未能指定修订版,则必须包含分隔符.我的控制台示例:
git reset <path_to_file>
fatal: ambiguous argument '<path_to_file>': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions
git reset -- <path_to_file>
Unstaged changes after reset:
M <path_to_file>
Run Code Online (Sandbox Code Playgroud)
(git版本1.7.5.4)
Ran*_*Ran 31
要从暂存区域中删除新文件(仅在新文件的情况下),如上所述:
git rm --cached FILE
Run Code Online (Sandbox Code Playgroud)
仅将rm --cached用于意外添加的新文件.
Zor*_*ayr 25
要重置特定文件夹(及其子文件夹)中的每个文件,可以使用以下命令:
git reset *
Run Code Online (Sandbox Code Playgroud)
bou*_*uby 25
使用该*
命令一次处理多个文件
git reset HEAD *.prj
git reset HEAD *.bmp
git reset HEAD *gdb*
Run Code Online (Sandbox Code Playgroud)
等等
pro*_*tos 24
正如其他人在相关问题中指出的那样(参见此处、此处、此处、此处、此处、此处和此处),您现在可以使用以下命令取消暂存单个文件:
git restore --staged <file>
Run Code Online (Sandbox Code Playgroud)
并使用以下命令取消暂存所有文件(来自 repo 的根目录):
git restore --staged .
Run Code Online (Sandbox Code Playgroud)
git restore
于2019 年 7 月推出,并在 2.23 版中发布。
使用该--staged
标志,它会恢复索引的内容(此处询问的内容)。
当git status
使用暂存的未提交文件运行时,这现在是 Git 建议git reset HEAD <file>
用来取消暂存文件的(而不是像 v2.23 之前那样)。
Vid*_*ige 20
假设我创建了一个新文件newFile.txt
.
假设我意外地添加了文件, git add newFile.txt
现在我要在提交之前撤消此添加 git reset newFile.txt
Has*_*mal 19
对于特定文件:
- git reset my_file.txt
- git checkout my_file.txt
对于所有添加的文件:
- git重置.
- git checkout.
注意:checkout更改文件中的代码并移至上次更新(已提交)状态.重置不会改变代码; 它只是重置标题.
wal*_*ake 14
此命令将取消暂停您的更改:
git reset HEAD filename.txt
Run Code Online (Sandbox Code Playgroud)
你也可以使用
git add -p
Run Code Online (Sandbox Code Playgroud)
添加部分文件.
Jon*_*han 14
我很惊讶没有人提到交互模式:
git add -i
Run Code Online (Sandbox Code Playgroud)
选择选项3以取消添加文件.在我的情况下,我经常想要添加多个文件,使用交互模式,您可以使用这样的数字来添加文件.这将采取除4:1,2,3,5之外的所有
要选择一个序列,只需输入1-5即可从1到5.
小智 10
git reset filename.txt
Run Code Online (Sandbox Code Playgroud)
将从当前索引"即将被提交"区域中删除名为filename.txt的文件,而不更改任何其他内容.
Moh*_*med 10
git add myfile.txt
#这将把你的文件添加到提交列表中
与此命令完全相反的是,
git reset HEAD myfile.txt # This will undo it.
Run Code Online (Sandbox Code Playgroud)
所以,你将处于以前的状态.指定将再次处于未跟踪列表(先前状态).
它将使用指定的文件重置您的头部.所以,如果你的头没有它的意思,它只会重置它
Ger*_*ser 10
如果您想恢复上次提交,但仍想在本地保留提交中所做的更改,请使用以下命令:
git reset HEAD~1 --mixed
Run Code Online (Sandbox Code Playgroud)
在SourceTree中,您可以通过gui轻松完成此操作.您可以检查sourcetree用于取消暂存文件的命令.
我创建了一个新文件并将其添加到git中.然后我使用SourceTree gui取消了它.这是结果:
取消暂停文件[08/12/15 10:43]
git -c diff.mnemonicprefix = false -c core.quotepath = false -c credential.helper = sourcetree reset -q - path/to/file/filename.java
SourceTree用于取消暂存reset
新文件.
小智 8
git reset filename.txt
Run Code Online (Sandbox Code Playgroud)
将从当前索引"即将被提交"区域中删除名为filename.txt的文件,而不更改任何其他内容.
您可以在 git version 2.23 之后使用此命令:
git restore --staged <filename>
Run Code Online (Sandbox Code Playgroud)
或者,您可以使用以下命令:
git reset HEAD <filename>
Run Code Online (Sandbox Code Playgroud)
我会使用git restore --staged .
或git restore --staged <filename>
您也可以使用git rm --cached
,但是,该git rm
命令最适合用于已跟踪的文件。
该git reset
命令可帮助您修改暂存区或暂存区和工作树。Git 能够完全按照您的意愿进行提交,这意味着您有时需要撤消对使用git add
.
你可以通过调用来做到这一点git reset HEAD <file to change>
。您有两种选择可以完全消除更改。git checkout HEAD <file(s) or path(s)>
是撤消对暂存区和工作树所做更改的快速方法。
但是,请小心使用此命令,因为它会删除对工作树的所有更改。Git 不知道这些更改,因为它们从未被提交。一旦您运行此命令,就无法恢复这些更改。
您可以使用的另一个命令是git reset --hard
. 它对您的工作树同样具有破坏性 - 任何未提交的更改或暂存的更改在运行后都会丢失。运行git reset -hard HEAD
与git checkout HEAD
. 它只是不需要文件或路径即可工作。
您可以--soft
与git reset
. 它将存储库重置为您指定的提交并暂存所有这些更改。您已经暂存的任何更改都不会受到影响,工作树中的更改也不会受到影响。
最后,您可以使用--mixed
重置工作树而无需暂存任何更改。这也会取消暂存任何已暂存的更改。
我第一次遇到这个问题时,我在这里找到了这篇文章,从第一个答案中我了解到我应该这样做git reset <filename>
。效果很好。
最终,我的主 git 文件夹中碰巧有一些子文件夹。我发现很容易将git add .
所有文件添加到子文件夹中,然后git reset
添加我不想添加的几个文件。
现在我有很多文件和子文件夹。git reset
逐一比较乏味,但还是比较容易git add .
,但先重置一些重/不需要但有用的文件和文件夹仍然更容易。
我找到了以下方法(这里或这里没有记录))相对简单。我希望这会有所帮助:
假设您有以下情况:
Folder/SubFolder1/file1.txt
Folder/SubFolder2/fig1.png
Folder/SubFolderX/fig.svg
Folder/SubFolder3/<manyfiles>
Folder/SubFolder4/<file1.py, file2.py, ..., file60.py, ...>
Run Code Online (Sandbox Code Playgroud)
您想要添加所有文件夹和文件,但不是fig1.png
、不是SubFolderX
、不是file60.py
并且列表不断增长......
首先,制作/创建一个bash shell script
并为其命名。说,git_add.sh
:
git reset
然后添加您想要在其前面添加的所有文件夹和文件的所有路径git reset --
。git_add.sh
随着文件列表的增长,您可以轻松地将路径复制粘贴到脚本中。该git_add.sh
脚本应如下所示:
Folder/SubFolder1/file1.txt
Folder/SubFolder2/fig1.png
Folder/SubFolderX/fig.svg
Folder/SubFolder3/<manyfiles>
Folder/SubFolder4/<file1.py, file2.py, ..., file60.py, ...>
Run Code Online (Sandbox Code Playgroud)
#!/bin/bash
很重要。然后source git_add.sh
运行它。之后,你可以这样做git commit -m "some comment"
,然后git push -u origin master
如果您已经设置了 Bitbucket/Github。
免责声明:我只在 Linux 中对此进行了测试。
如果您始终在本地 git 存储库中保留大量文件和文件夹,但您不希望 git 跟踪您所做的更改(git add .
例如视频和数据文件),那么您必须学习如何使用.gitignore
. 也许从这里开始。
您可以使用 git 命令或 GUI git 取消暂存/撤消。
单个文件
git reset File.txt
Run Code Online (Sandbox Code Playgroud)
多个文件
git reset File1.txt File2.txt File3.txt
Run Code Online (Sandbox Code Playgroud)
示例- 假设您错误地
添加了Home.js、ListItem.js、Update.js
并想要撤消/重置 =>
git reset src/components/home/Home.js src/components/listItem/ListItem.js src/components/update/Update.js
Run Code Online (Sandbox Code Playgroud)
使用git GUI 的相同示例
git gui
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2854202 次 |
最近记录: |