如何还原未提交的更改,包括文件和文件夹?


1070

是否有git命令来还原工作树和索引中所有未提交的更改,并还删除新创建的文件和文件夹?



1
好吧,我已经阅读了下面所有各种各样且难以记住的答案,包括它们的警告和边缘情况以及“如果您有xxx,则可能需要做的工作”,并且坚持删除整个存储库,将其克隆以删除所有已编辑和添加的文件。也是只有两个命令。rm -r projectdir; git clone xxx。对我来说,这是一项经常性的操作-签出一个仓库回购,然后想回到干净的签出状态,以便我可以开始对其进行修改。不太好,但可以100%工作。希望有一天他们会为此添加一个简单的命令。
John Little

Answers:


1770

您可以运行以下两个命令:

# Revert changes to modified files.
git reset --hard

# Remove all untracked files and directories.
# '-f' is force, '-d' is remove directories.
git clean -fd

147
在运行git clean之前运行'git clean -nd'预览更改的一个好主意,以确保您没有担心的未跟踪文件或目录将被删除。
jpw

79
为某人省去文档之旅:-f是强制操作,-d是删除目录,-n是空运行(也--dry-run;不执行任何操作就显示输出)
Aaron Campbell

12
git clean -i用于交互模式。
galath 2015年

它没有重置未暂存的文件,我必须首先暂存它们。
阿隆·洛林兹

4
@IgorGanapolsky您可能正在合并冲突中。尝试跑步git merge --abort
htanata

555

如果只想还原当前工作目录中的更改,请使用

git checkout -- .

在此之前,您可以列出将要还原的文件,而无需实际执行任何操作,仅需检查将发生的情况,即可:

git checkout --

1
当我尝试这个时,我得到“错误:pathspec'。” 与git已知的任何文件都不匹配
Mike K

34
和之间有什么区别git reset --hard
Felipe Almeida 2014年

104
'git reset --hard'将撤消暂存和未暂存的更改,而'git checkout-'。只会撤消未分段的更改
DivyByZero 2014年

但是,如果您使用checkout并修改了文件,则即使我只需要还原此更改,cmd也会返回我需要进行的合并
Vinicius Monteiro

7
git checkout-将仅列出将要还原的文件(不执行任何操作,仅列出)。如果您想在执行git checkout-之前查看哪些文件将受到影响,这将非常有用。
克里希·斯里尼瓦桑

107

使用“ git checkout-...”放弃工作目录中的更改

git checkout -- app/views/posts/index.html.erb

要么

git checkout -- *

删除所有在git状态下对暂存文件所做的更改,例如

modified:    app/controllers/posts.rb
modified:    app/views/posts/index.html.erb

5
git checkout -- *除非我位于更改后的文件所在的目录中,否则它对我不起作用。要签出整个存储库中的所有文件,您必须执行git checkout -- :/
waldyrious

在中git checkout -- *,星号由Shell替换,所有文件和目录都位于当前目录中。因此,它应该放在子目录中。这个对我有用。但是,感谢突出显示语法“:/”,该语法在我看来更加清晰。
mcoolive '16

53

一种简单的方法是运行以下两个命令:

  1. git stash 这会将您的更改移到隐藏处,使您回到HEAD状态
  2. git stash drop 这将删除在最后一条命令中创建的最新存储。

3
这不适用于未提交的更改,仅适用于已提交的更改。
b0xxed1n

4
我已经将其用于未提交的更改,并且可以正常工作。
Paul D. Eden

7
@ b0xxed1n隐藏是所有未提交的更改,显然它确实适用于它们。
TJ

git stash可以保存未提交的更改,因此您可以..保存它们而无需提交。
罗布

git stash导致以下错误:fatal: git-write-tree: error building trees Cannot save the current index state
IgorGanapolsky

19
git clean -fd

没有帮助,保留了新文件。我所做的就是完全删除所有工作树,然后

git reset --hard

有关添加清理选项的建议,请参见“ 如何在git中清除本地工作目录? ”。-x

git clean -fdx

注意 -x flag将删除Git忽略的所有文件,因此请小心(请参阅我所指答案中的讨论)。


什么是-fdx?“力,目录和x是?
Adi Prasetyo

@AdiPrasetyo -x标志也删除所有忽略的文件;这可能是不希望有的效果,所以我更新了答案。
Fr0sT

我仍然无法调整基准。我收到错误消息:错误:无法合并更改。修补程序在0003失败创建回叫。在以下位置找到失败的修补程序的副本:
IgorGanapolsky

13

我认为您可以使用以下命令: git reset --hard


嗯...我做到了,但我的文件仍然在那里。之后我应该做点什么?
MEM

1
git reset仅还原工作树中未提交的更改。它不会删除新文件和文件夹。我不确定如何使用git
Josnidhin 2011年

1
因此,如果我们通过添加新文件和文件夹来更改系统目录,然后又想将该目录恢复到以前的状态(不包含那些文件和文件夹),则不能使用git来做到这一点?因此,我们最好的办法就是还原文件状态?但是一旦创建文件,就无法删除该文件,除非我们手动进行处理?
MEM

6

请注意,仍有一些文件似乎不会消失-它们可能未编辑,但是git可能由于CRLF / LF更改而将其标记为已编辑。查看您是否在中进行了一些更改.gitattributes

就我而言,我已将CRLF设置添加到.gitattributes文件中,因此,所有文件都保留在“已修改的文件”列表中。更改.gitattributes设置会使它们消失。


6

如果您有一个未提交的更改(仅在您的工作副本中)希望在最近一次提交中还原为该副本,请执行以下操作:

git checkout filename

我在未提交的情况下正在尝试此操作git rm filename,但它不起作用。error: pathspec 'filename' did not match any file(s) known to git.
falsePockets

撤消的解决方案git rmgit checkout master -- filename
falsePockets


2

您可以只使用以下git命令,该命令可以还原存储库中所有未提交的更改:

git checkout .

例:

ABC@ABC-PC MINGW64 /c/xampp/htdocs/pod_admin (master)
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   application/controllers/Drivers.php
        modified:   application/views/drivers/add.php
        modified:   application/views/drivers/load_driver_info.php
        modified:   uploads/drivers/drivers.xlsx

no changes added to commit (use "git add" and/or "git commit -a")

ABC@ABC-PC MINGW64 /c/xampp/htdocs/pod_admin (master)
$ git checkout .

ABC@ABC-PC MINGW64 /c/xampp/htdocs/pod_admin (master)
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.

nothing to commit, working tree clean

-2

我通常使用这种方式效果很好:

mv fold/file /tmp
git checkout fold/file

这与有357个“喜欢”的人提出的建议完全相同。只有这样,您才可以创建新签出文件的备份。
马赛厄斯

-3

安全而漫长的路:

  1. git branch todelete
  2. git checkout todelete
  3. git add .
  4. git commit -m "I did a bad thing, sorry"
  5. git checkout develop
  6. git branch -D todelete

-3

采用:

git reset HEAD filepath

例如:

git reset HEAD om211/src/META-INF/persistence.xml
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.