我使用以下命令错误地向Git添加了文件:
我还没有运行git commit。是否有一种方法可以撤消此操作,以便这些文件不会包含在提交中?
There are 48 answers so far (some deleted). Please don't add a new one unless you have some new information.
- 从Git v1.8.4开始,下面所有使用HEAD或HEAD的答案现在都可以使用@代替HEAD。请参阅此答案(最后一节),了解您为什么可以这样做。
- 我做了一个小小的暑假,展示了如何打开一个文件:stackoverflow.com/questions/6919121/…
- 为什么不签Git?
- @erikreppen git checkout不会从提交索引中删除阶段性更改。它只将未分级的更改还原为上一次提交的修订—顺便说一下,这也不是我想要的,我想要那些更改,我只是希望它们在以后的提交中。
- 如果您使用Eclipse,那么只需取消选中"提交"对话框中的文件即可。
- 这是直接从GitHub获得的一个很好的资源:如何撤消和Git有关的任何内容
- 在发布新答案之前,请考虑此问题已有25+个答案。确保你的答案贡献了现有答案中没有的内容。
- 我真希望每次我回来都能投反对票
- git删除myfile.txt
- 我总是通过运行git reset 来完成这项工作。有关更多信息,请务必阅读本文。
您可以在提交之前撤消git add。
它将从当前索引("即将提交"列表)中删除,而不更改任何其他内容。
你可以使用
没有任何文件名来取消所有应更改的标记。当有太多的文件需要在合理的时间内一个一个地列出时,这就非常有用了。
在Git的旧版本中,上述命令分别相当于git reset HEAD 和git reset HEAD,如果HEAD未定义(因为您尚未在回购中作出任何承诺)或不明确(因为您创建了一个名为HEAD的分支,这是您不应该做的愚蠢的事情),则上述命令将失败。不过,在Git 1.8.2中已经更改了这一点,所以在Git的现代版本中,您甚至可以在第一次提交之前使用上面的命令:
"git reset" (without options or parameters) used to error out when
you do not have any commits in your history, but it now gives you
an empty index (to match non-existent commit you are not even on).
- 当然,这不是真正的撤消操作,因为如果错误的git add重写了以前的阶段性非限制版本,我们就无法恢复它。我试图在下面的回答中澄清这一点。
- git reset HEAD *.ext,其中ext是要取消添加的给定扩展名的文件。对我来说,那是*.bmp和*.zip。
- Git Reset说它取消了更改,但是当我继续执行另一个Git状态时,它们仍然显示修改。
- 那么与"添加"相反的是"重置"?"删除"怎么样?
- @Jonny,索引(又称临时区域)包含所有文件,而不仅仅是更改过的文件。它"启动生命"(当您签出一个提交或克隆一个repo时)作为头指向的提交中所有文件的副本。因此,如果从索引(git rm --cached中删除一个文件,则意味着您正准备提交以删除该文件。另一方面,git reset HEAD 会将文件从head复制到索引,这样下一次提交就不会显示对该文件所做的任何更改。
- 如果已经承诺了呢?
- 我刚刚发现有一个git reset -p,就像git add -p。这太棒了!
- -p非常棒,它被用于很多git命令中(不仅仅是重置和添加)。但要回答@wedotdd.com和@johnny,git reset本身就清楚了git是否"知道"这些变化;它本身并不清楚这些变化。要做到这一点,您需要执行git checkout someFile.txt(针对单个文件)或git reset --hard(擦除所有内容)。不过,这两个命令都不会返回,所以在使用它们时要非常小心。
- 但"git reset file"也会删除为提交而准备的其他文件。不好的。
- 假设我甚至没有使用"git-add"。我刚刚修改了代码。很明显,文件将显示为红色。在这种情况下我能做什么?我希望本地文件更改消失。我想让它和主人同步。
- 实际上,您可以恢复先前已覆盖的阶段性但未限制的更改,但不能以用户友好的方式恢复,也不能100%安全(至少我找不到):goto.git/objects,搜索在git add时创建的文件,然后恢复(61/3AF3...->object id 613AF3...,然后恢复git cat-file -p (可能值得恢复服务)工作时间长,但同时也是一个更经常的教训…)
- @牢不可破:在使用git reset清除索引(临时区域)后,可以使用git checkout file来签出命名文件的最新版本(或仅使用git checkout来签出所有文件的最新版本),丢弃本地所做的任何更改。
- 另一种方法是通过git fsck --unreachable来恢复已阶段但未提交并随后被另一个git add覆盖的更改,该方法将列出所有不可访问的obj,然后您可以通过git show SHA-1_ID或git fsck --lost-found来检查这些对象,这些对象将>将悬空对象写入.git/lost-found/commit/或.git/lost-found/other/,具体取决于类型。另见git fsck --help。
你想要:
推理:
当我刚接触这个的时候,我第一次尝试
(要撤消整个初始添加操作),只会收到以下(不是这样)有用消息:
1
| fatal: Failed to resolve 'HEAD' as a valid ref. |
原来这是因为头参考(分支?)直到第一次提交之后才存在。也就是说,如果您的工作流程和我的工作流程类似,则会遇到与我相同的初学者问题:
CD到我伟大的新项目目录试用Git,新的热度
git init
git add .
git status
…很多垃圾卷轴…
=>该死,我不想把这些都加进去。
谷歌"撤销git添加"
=>查找堆栈溢出-yay
git reset .
=>致命:无法将"head"解析为有效引用。
进一步发现邮件列表中记录了一个针对这一点的错误。
在Git状态输出中,正确的解决方案就在那里(是的,我把它描述为"垃圾")。
1 2 3 4
| ...
# Changes to be committed:
# (use"git rm --cached <file>..." to unstage)
... |
而解决办法确实是使用git rm --cached FILE。
注意这里其他地方的警告-git rm会删除文件的本地工作副本,但如果使用--cached,则不会删除。这是git help rm的结果:
--cached
Use this option to unstage and remove paths only from the index.
Working tree files, whether modified or not, will be left.
我继续使用
删除所有内容并重新开始。但没有起作用,因为虽然add .是递归的,但结果rm需要-r来递归。叹息。
好了,现在我回到我开始的地方。下次我要用-n做一次干运行,看看会增加什么:
我把所有的东西都放在一个安全的地方,然后才相信git help rm关于--cached没有破坏任何东西(如果我拼错了怎么办)。
- 不只是"Git重置"没有。你想要什么,还是我错过了什么?
- 哈。这一过程在3年的随访。除了给后续的rm -rf .git说:因为我不信托,git initT git rm --cachedto我保持工作状态。EN说how is for Little Git仍然在一些地方overly复合体。git unstageshould只是好的股票标准的命令,我不关心,如果它可以add as an的别名。
- did this和EN -消去其他现有的文件备份- unchanged from the Git。他们让一切王增空气日期2010年1月17 destroys the proper和历史。Git是unfinished项目安全。
- (v1.7.1.1 versions of Git在最近结束git rm -r --cached .工厂测试)
- 如果你喜欢尝试git reset *instead of git reset .git reset,这一阶段的文件previously粘着你。
- 灿烂的回音,我确切的说因为是工作流描述的程序办理。needs to be the accepted它真的答案topmost as this is to be Q什么是"search results for Top of the unstage Git"。
- instead of the干式运行,步行一段git add -pwith the
- 我说git reset HEAD ...Git for
- 你也可以使用git stash/git stash popto avoid zipping /支持后续的一切
- Git文件高速缓存——> < is the correct真爱答案,if it is the initial into the of <文件>导入库。如果你想在文件unstage to the change is the correct复位,Git的回音。that this is wrong people are回答说在思考不同的问题。
- 这将真的工作,but only on the first提交的文件不存在,where the command or where the git add之前,新文件added to,but not changes文件存在。
- 我的certainly if this is a全新的库目录和除尘,再initialising the .gitis the Best Way。在案例中井used for added accidentally回购你在哪里,只是在单一文件,尽管得到最佳的git rm --cached 似乎可怕的delete mode 100644 file后我的承诺。
- 根据git statusversion of the correct 1.8.1.4 Git输出方式unstage新文件:git reset HEAD ...is to
- 我去给unintuitive and how is convoluted Git。instead of"Undo命令,并有"You have to find out how to Undo them。我想你的腿在快速无砂,然后让你让你迷住了,那么其他的ARM,ARM迷住了……每一行should be done with items下拉GUI,menus options for the…?生产力IU),我们会有收益,但我们有这个命令行接口混乱的后面。它不喜欢的任何更多的GUI项目让Git这直觉。
- barrykelly en is not the"不正确的答案。你真的想给你git resetis to Undo文件,或者在git reset 增值added to Undo在特异性或文件。工作表面可能git rm --cachedon the but什么真的发生removes EN EN is from the which is not as好跟踪历史会给你想要的,除非你的文件,在文件gitignore added to that have been where that文件不应该在的地方,然后在第一tracked茶恩会好,好房子。
- 工作@ joemoe1984 Git不复位(empty repos初在线交易)
- "我barrykelly编辑我的评论对你的reread but as我太晚。你错过的那部分wrote;)。我是你的权利,这将使用git rm --cachedto another instance
- 当intially populating在Git库"复位,Git不会回答"from the Top resolve failed to work:头。我们太多的单一文件added to the initial承诺。suggested by this和that的家园"的答案,在Git文件高速缓存——> <"为我厂。也许"Git的RM -高速缓存。"does is for some people超过intended(as,but by Git suggested状态高速缓存),Git——<文件>工程…………………
- 为什么不只是delete the folder隐.git LOL…Git的init和给你了……(使你assuming Git回购和have not for the first time做任何commits)
- if the have not yet在索引文件,使用git rm --cache ,if the index文件已在,但你不想在这承诺them to be,使用git reset
- 这可能在写作时就已经适用了,但现在似乎有效了。
- 这也是一个错误的答案。我不知道人们为什么发表答案,更不知道他们为什么反对错误的答案……
- 此命令清除/删除索引中的内容。OP和其他人真正想要的是撤消索引中的更改,而不是删除内容。重置。是正确的答案。
如果键入:
Git将告诉您什么是阶段性的,等等,包括关于如何取消固定的说明:
1
| use"git reset HEAD <file>..." to unstage |
我发现Git在这种情况下很好地督促我做正确的事情。
注意:最近的Git版本(1.8.4.x)已更改此消息:
1
| (use"git rm --cached <file>..." to unstage) |
- 根据added文件是否已被跟踪,消息将有所不同(add只将新版本保存到缓存中-此处将显示您的消息)。在其他地方,如果文件以前没有被转移,它将显示use"git rm --cached ..." to unstage。
- 伟大的!git reset HEAD 是唯一一个在您想取消文件删除时可以工作的文件。
- 我的Git版本2.14.3说git reset HEAD到unstage。
澄清:git add将更改从当前工作目录移动到临时区域(索引)。
此过程称为"分段"。因此,准备更改(更改的文件)的最自然的命令是显而易见的:
git add只是git stage的一个更容易键入的别名。
可惜没有git unstage或git unadd命令。相关的很难猜测或记忆,但很明显:
我们可以轻松为此创建别名:
1 2
| git config --global alias.unadd 'reset HEAD --'
git config --global alias.unstage 'reset HEAD --' |
最后,我们有了新的命令:
1 2 3 4
| git add file1
git stage file2
git unadd file2
git unstage file1 |
就我个人而言,我使用更短的别名:
1 2
| git a #for staging
git u #for unstaging |
- "移动"?这表明它已从工作目录中消失。事实并非如此。
- 为什么很明显?
- 实际上,git stage是git add的别名,它是git和其他scm上的历史命令。如果我能说的话,它是在2008年12月添加的,commit 11920d28da在"Git的Git存储库"中。
除了接受的答案之外,如果错误添加的文件很大,您可能会注意到,即使在使用"EDOCX1"(5)将其从索引中删除后,它仍会占用.git目录中的空间。这没什么好担心的,文件确实仍在存储库中,但只是作为一个"松散对象",它不会被复制到其他存储库(通过克隆、推送),空间最终会被回收——尽管可能不会很快。如果你焦虑,你可以跑:
更新(以下是我试图澄清大多数投票结果可能引起的一些混乱):
那么,哪个是git add的真正撤销?
git reset HEAD 号?
或
EDOCX1?11?
严格地说,如果我没弄错的话:没有。
一般来说,git add不能安全地撤销。
让我们首先回顾一下git add 实际做了什么:
如果之前没有跟踪,git add会将其添加到缓存中,并包含当前内容。
如果已跟踪,git add将当前内容(快照、版本)保存到缓存中。在Git中,此操作仍然称为添加(而不仅仅是更新它),因为文件的两个不同版本(快照)被视为两个不同的项:因此,我们确实在向缓存中添加一个新项,以便稍后提交。
鉴于此,问题有点模棱两可:
I mistakenly added files using the command...
OP的场景似乎是第一个(未跟踪的文件),我们希望"撤消"从跟踪的项目中删除该文件(而不仅仅是当前内容)。如果是这样,那么运行git rm --cached 就可以了。
我们也可以运行git reset HEAD 。一般来说,这是更好的选择,因为它在两种情况下都有效:当我们错误地添加了一个已跟踪项的版本时,它也会执行撤销操作。
但有两个警告。
第一:只有一种情况(如答案所指出的那样)git reset HEAD不起作用,而git rm --cached起作用:一个新的存储库(没有提交)。但是,事实上,这是一个几乎不相关的案例。
第二:要知道,git reset HEAD无法神奇地恢复先前缓存的文件内容,它只是从头部重新同步。如果我们的错误引导git add覆盖了以前的阶段性未提交版本,我们就无法恢复它。这就是为什么,严格来说,我们不能撤销[*]。
例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| $ 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 |
当然,如果我们只是遵循通常的懒散的工作流程,只为添加新文件(案例1)而执行"git-add",并通过commit、git commit -a命令更新新内容,这就不是很关键了。
*(编辑:上述内容实际上是正确的,但仍有一些稍微有点老套/复杂的方法来恢复已进行但未提交的更改,然后覆盖这些更改-请参阅Johannes Matokic和Iolsmit的评论)
- 严格来说,有一种方法可以恢复已经用git-add替换的分段文件。正如您提到的,git-add为该文件创建了一个git对象,它不仅在完全删除该文件时成为松散对象,而且在被新内容覆盖时也成为松散对象。但是没有命令来自动恢复它。相反,必须手动识别和提取该文件,或者使用仅针对这种情况编写的工具(libgit2将允许这样做)。但只有当文件非常重要且很大,并且无法通过编辑以前的版本重新生成时,这一点才会得到解决。
- 自我纠正:一旦找到松散的对象文件(使用诸如创建日期/时间之类的元数据),可以使用git cat-file恢复其内容。
- 另一种方法是通过git fsck --unreachable恢复已阶段但未提交并随后被另一个git add覆盖的更改,该方法将列出所有不可访问的obj,然后您可以通过git show SHA-1_ID或git fsck --lost-found检查这些对象,这些对象将>将悬空对象写入.git/lost-found/commit/或.git/lost-found/other/,具体取决于类型。另见git fsck --help。
将以递归方式"取消添加"当前目录中添加的所有内容
- 我不是想取消添加所有内容,只是一个特定的文件。
- 如果您以前没有任何提交,也会有所帮助。如果没有以前的承诺,git reset HEAD 会说fatal: Failed to resolve 'HEAD' as a valid ref.
- 不,这会删除当前目录中的所有内容。非常不同于只是不稳定的变化。
跑
并手动删除所有文件,或者选择所有文件并单击"取消从提交中保存"按钮。
- 是的,我明白。我只想暗示你的回答是"你可以使用git-gui……":)
- 上面写着"找不到命令"。我不确定这是否有效。
- 哇,这比做命令行要简单得多,你不懂。这绝对是推荐给像我这样的初学者的。谢谢你写这篇文章!
撤消已添加的文件很容易使用git,对于已添加的重置myfile.txt,请使用:
1
| git reset HEAD myfile.txt |
说明:
在您准备了不需要的文件之后,要撤消,可以执行git reset,Head是本地文件的头,最后一个参数是文件名。
我在下面的图中为您创建了更详细的步骤,包括在这些情况下可能发生的所有步骤:
- 太神了!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Git对每一个可以想象到的动作都有指令,但是需要广泛的知识来把事情做好,因此它充其量是反直觉的…
你以前所做的:
- 更改文件并使用git add .或git add 。
你想要什么:
从索引中删除该文件,但保持其版本化,并在工作副本中保留未提交的更改:
将文件从头重设为最后一个状态,撤消更改并将其从索引中删除:
1 2 3 4 5 6
| # 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不适用于单个文件。
从索引和版本控制中删除,将未版本控制的文件保留在工作副本中:
完全删除工作副本和版本控制中的:
- 我无法忍受"git reset head和"git rm--cached的区别。你能解释一下吗?
- @Jeswang文件要么是Git已知的(正在跟踪其中的更改),要么不是"版本化的"。reset head撤消您当前的更改,但该文件仍由git监视。rm --cached将文件从版本控制中删除,因此git不再检查文件是否有更改(并删除最终索引的当前更改,由先前的add通知git),但更改后的文件将保存在您的工作副本中,即硬盘上的文件文件夹中。
- 区别在于git reset HEAD 是临时的—该命令将只应用于下一次提交,但git rm --cached 将不稳定,直到它与git add 再次添加。另外,git rm --cached 意味着如果将该分支推到远程,任何拉该分支的人都将从其文件夹中实际删除该文件。
这个问题提出得不清楚。原因是git add有两种含义:
向临时区域添加新文件,然后使用git rm --cached file撤消。
将修改后的文件添加到临时区域,然后使用git reset HEAD file撤消。
如有疑问,请使用
因为在这两种情况下,它都能达到预期的效果。
警告:如果对已修改的文件(存储库中以前存在的文件)执行git rm --cached file,则将在git commit上删除该文件!它仍然存在于您的文件系统中,但是如果有其他人提取了您的提交,则该文件将从其工作树中删除。
git status将告诉您文件是新文件还是修改过的:
1 2 3 4 5 6
| 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 |
- + 1。在这一页上,非常多的高调回答和评论完全错误地反映了git rm --cached somefile的行为。我希望这个答案能登上这一页,到达一个突出的位置,在那里它可以保护新手不被所有错误的说法误导。
如果您在初始承诺中不能使用git reset,只需声明"git破产",删除.git文件夹并重新开始。
- 一个技巧是,在删除文件夹之前,如果添加了远程源站,则复制.git/config文件。
- @克里斯约翰森的评论很受欢迎。有时,您希望提交除一个文件以外的所有文件:git add -A && git rm --cached EXCLUDEFILE && git commit -m 'awesome commit'(这也适用于以前没有提交的情况,即Failed to resolve 'HEAD'问题)
根据许多其他答案,您可以使用git reset。
但是:
我发现了这个很棒的小帖子,它实际上为git unadd添加了git命令(很好的别名):有关详细信息,请参阅git unadd。
简单地说,
1
| git config --global alias.unadd"reset HEAD" |
现在你可以
1
| git unadd foo.txt bar.txt |
可以使用git remove或git rm进行此操作,并带有--cached标志。尝试:
- 这不是要全部删除文件吗?
- git rm --cached ...将从git repo中删除文件。它们仍然存在于您的计算机上,但这与取消对文件的更改非常不同。对于任何一个在这个问题上绊倒的人来说,这不是一个有效的答案。
使用git add -i从即将到来的提交中删除刚刚添加的文件。例子:
添加不需要的文件:
1 2 3 4 5 6 7 8 9 10 11
| $ 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)
# [...]# |
进入交互式添加以撤消添加(在git中键入的命令有"r"(还原)、"1"(列表中的第一个条目显示)、"return"退出还原模式和"q"(退出):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| $ 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"又回到了未跟踪的列表中:
1 2 3 4 5 6 7 8
| $ 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)
$ |
以下是一种避免新项目启动时出现这种令人烦恼的问题的方法:
- 为新项目创建主目录。
- 运行git init。
- 现在创建一个.gitignore文件(即使它是空的)。
- 提交.gitignore文件。
如果你没有任何承诺,git会让你很难做git reset。如果您只是为了拥有一个承诺而创建一个小小的初始承诺,那么之后,您可以根据自己的意愿多次执行git add -A和git reset,以使所有事情都正确。
此方法的另一个优点是,如果您稍后遇到行尾问题,需要刷新所有文件,则很容易:
- 查看初始提交。这将删除所有文件。
- 然后再次检查您最近的提交。这将使用当前行尾设置检索文件的新副本。
- 确认!在git添加后尝试了git重置。吉特在抱怨腐败的头颅。按照你的建议,我可以添加和重置来回没有问题:)
- 第二部分可以,但有点笨拙。如何处理行尾,取决于autocrlf值…这在每个项目中都不起作用,具体取决于设置。
- 这个答案在发布时是合理的,但现在已经过时了;git reset somefile和git reset都在第一次提交之前工作,现在。自从几次Git发布以来,情况就是这样。
- @Markamery,你可能是对的(如果你为你的断言发布了一个源代码,那就很酷了),但是用一两个干净的提交启动回购仍然有价值。
也许自从你发布你的问题后,Git已经发展了。
1 2
| $> git --version
git version 1.6.2.1 |
现在,您可以尝试:
这应该是你想要的。
- 当然,但是接下来的问题是,如何在添加的两个(或更多)文件中取消一个。然而,"git reset"手册确实提到"git reset"与"git add"相反。
请注意,如果未指定修订,则必须包含分隔符。我的控制台示例:
1 2 3 4 5 6 7
| 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> |
(Git版本1.7.5.4)
- 我试过使用git reset ,它在没有分离器的情况下工作得很好。我也在使用Git 1.9.0。也许它在旧版本中不起作用?
要从临时区域删除新文件(并且仅在有新文件的情况下),请按照上面的建议执行以下操作:
仅对意外添加的新文件使用rm--cached。
- 请记住,--cached在这里是一个非常重要的部分。
- -1;不,这不会取消对文件的暂存,而是对文件进行删除(而不会实际从工作树中删除)。
使用*命令一次处理多个文件
1 2 3
| git reset HEAD *.prj
git reset HEAD *.bmp
git reset HEAD *gdb* |
等
- 注意*通常不包括点文件或"点目录",除非您明确指定.*或.*.prj。
要重置特定文件夹(及其子文件夹)中的每个文件,可以使用以下命令:
- 实际上,这不会重置每个文件,因为*使用shell扩展,忽略点文件(和点目录)。
- 您可以运行git status查看剩余的内容并手动重置,即git reset file。
只需键入git reset,它就会恢复,就像上次提交以来从未键入git add .。确保你以前已经承诺过。
- 如果没有最后一次提交就不会工作。
- 碰巧,有最后一次承诺…但我特别要求从提交中删除单个文件,而不是从提交中删除每个文件。
假设我创建了一个新文件newFile.txt。
假设我不小心添加了文件,git add newFile.txt。
现在我想在提交之前撤消这个添加,EDOCX1[4]
- 假设我在第一张照片上,意思是我甚至没有做过"git.add"。而且,我一点也不想要这些改变。我的意思是当我做Git状态时,它不应该显示任何红色文件。我的意思是,它应该是同步的,就好像自从上次Git推送以来没有更改过一个文件一样。如何做到这一点。
- 所以假设你只是在第一步。你想摆脱你所做的所有改变,使"newfile.txt"变成红色。
- 当我做Git状态时。我根本看不到任何变化。所有的红色文件都应该被恢复。
- 嗨,我认为您的问题是如何从当前树中删除未跟踪的文件。为此,您可以使用"git clean-f-d"。这也将删除未跟踪的目录。
- 如果不想删除未跟踪的文件,只需忽略"-f"标志。
- 它不起作用。假设我推了一下。现在,如果我在代码中添加一行并检查git状态。它将显示一个红色的文件。假设我一点也不想换行。一种选择是我可以做cntrl+z,但我想让git帮我做。我希望我的本地项目与主回购同步。我的意思是,当我执行"git状态"时,我应该将消息视为"它与主服务器同步"。当我打开我的代码时,我应该会收到一条消息,比如"某个外部源正在进行更改",当我对这个提示说"是"时,我所做的一行更改就消失了。
- 基本上我需要一个git命令,它将恢复所有更改,使git状态显示为"红色文件"。
- 所以我修改了一个文件。我什么都没做。根本没有git命令(没有git push,甚至没有git add或git commit)。但现在我需要一个git命令,它将在本地repo中恢复这些更改。
- 在一个更技术的术语中,"如何恢复本地repo中所做的文件更改,而这些更改尚未放入临时区域"
- 你没试过"git checkout file_name"吗?此外,您可以使用"git stash"来存储更改。
- 是的,结账成功了。谢谢。:)
- 很高兴能帮助您:)
- 没有头的Git重置使用当前的分级文件。使用git reset head指定不同的提交。就像git重置head~2回到以前的提交。2是提交数
对于特定文件:
-
git reset my_file.txt
-
git checkout my_file.txt
对于所有添加的文件:
-
git reset .
-
git checkout .
注意:签出会更改文件中的代码并移动到上次更新(提交)状态。重置不会更改代码;它只是重置头段。
- 请说明git reset 和git checkout 的区别。
- 重置不会更改文件,只需将其放在远离阶段(=索引,Git Add将其放在其中)
- 签出更改文件中的代码并移动到上次更新的状态。重置不会更改代码,只会重置标题。例如,重置用于在推送和签出之前重置已添加或提交的文件,用于返回Git添加之前的最后一个更新/提交阶段。
- reset=从阶段中删除文件,但更改仍将存在。checkout=从存储库中获取更新的文件,并将覆盖当前文件
此命令将取消显示您的更改:
1
| git reset HEAD filename.txt |
您也可以使用
添加部分文件。
撤消Git添加使用
git reset filename
我很惊讶没有人提到交互模式:
选择选项3取消添加文件。在我的例子中,我经常想添加多个文件,通过交互模式,您可以使用这样的数字来添加文件。这只需要4:1、2、3、5
要选择一个序列,只需键入1-5就可以从1到5中选择所有序列。
Git临时文件
- "我很惊讶没有人提到交互模式"-他们这样做了:stackoverflow.com/a/10209776/1709587
将从当前索引"即将提交"区域中删除名为filename.txt的文件,而不更改任何其他内容。
git add myfile.txt这将把您的文件添加到待提交列表中。
与这个命令完全相反的是,
1
| git reset HEAD myfile.txt # this will undo it. |
所以,你将处于前一状态。指定的将再次出现在未跟踪列表中(以前的状态)。
它将用指定的文件重置您的头部。所以,如果你的头没有它的意思,它将简单地重置它
在sourcetree中,您可以通过GUI轻松地完成这项工作。您可以检查sourcetree使用哪个命令来取消文件的存储。
我创建了一个新文件并将其添加到Git。然后,我使用sourcetree gui取消了它的绑定。结果是:
Unstaging files [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取消对新文件的存储。
最直观的解决方案之一是使用sourcetree。
您只需从分阶段和未分阶段拖放文件即可。
Will remove a file named filename.txt from the current index, the"about to be committed" area, without changing anything else.
git reset命令帮助您修改临时区域或临时区域和工作树。Git能够完全按照您想要的方式处理提交,这意味着您有时需要撤消对Git Add所进行的更改。
你可以打电话给git reset HEAD 。有两个选项可以完全消除更改。git checkout HEAD 是一种撤消对临时区域和工作树的更改的快速方法。但是,请小心使用此命令,因为它会删除对工作树的所有更改。Git不知道这些更改,因为它们从未被提交过。运行此命令后,无法恢复这些更改。
另一个你可以使用的命令是git reset --hard。它对您的工作树具有同样的破坏性,任何未提交的更改或阶段性更改在运行后都会丢失。运行git reset -hard HEAD与git checkout HEAD的作用相同。它不需要文件或路径就可以工作。
您可以使用--soft和git reset。它将存储库重置为您指定的提交,并对所有这些更改进行阶段化。您已经进行的任何更改都不会受到影响,工作树中的更改也不会受到影响。
最后,您可以使用--mixed重置工作树,而不进行任何更改。这也会取消阶段性的任何更改。
我也面临同样的情况。我用这个命令解决了这个问题:--
- 这个答案不会在已经广泛的答案列表中添加新的信息,AFAICS。因此,这是没有帮助的。
1
| git stash && git stash pop |
会毁掉舞台的。
命令git reset --hard HEAD应该起作用。需要注意的一点是,您需要将目录(cd更改回正常工作目录。否则,如果从目录运行命令,则错误地执行了git add .……您将无法恢复,而是得到其他文章中提到的错误,这些错误涉及"未知修订或路径不在工作树中"。
- 警告:这不仅会从索引中取消文件的保存,还会从工作副本中完全删除文件的更改!我不建议任何人只使用硬重置来解除文件的存储…除非他们是完全失去工作的粉丝。