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

时间:2011-04-27 16:06:10

标签: git git-reset git-revert git-clean

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

14 个答案:

答案 0 :(得分:1625)

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

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

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

答案 1 :(得分:519)

如果要仅在当前工作目录中还原更改,请使用

git checkout -- .

在此之前,您可以列出将要还原的文件而不实际采取任何行动,只是为了检查会发生什么,用:

git checkout --

答案 2 :(得分:100)

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

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

git checkout -- *

删除对git status中的非分页文件所做的所有更改,例如

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

答案 3 :(得分:48)

一个非常重要的方法是运行这两个命令:

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

答案 4 :(得分:17)

git clean -fd

没有帮助,新文件仍然存在。我所做的是完全删除所有工作树然后

git reset --hard

有关将-x选项添加到clean:

的建议,请参阅“How do I clear my local working directory in git?
git clean -fdx

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

答案 5 :(得分:12)

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

答案 6 :(得分:5)

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

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

答案 7 :(得分:4)

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

git checkout filename

答案 8 :(得分:1)

Git 2.23引入了git restore命令来还原工作树文件。

https://git-scm.com/docs/git-restore

还原当前目录中的所有文件

  

git restore。

如果要还原所有C源文件以匹配索引中的版本,则可以

  

git restore'* .c'

答案 9 :(得分:1)

从Git帮助中:

 Changes to be committed:
      (use "git restore --staged <file>..." to unstage)

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

答案 10 :(得分:0)

您只需使用以下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

答案 11 :(得分:-2)

安全而漫长的道路:

  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

答案 12 :(得分:-2)

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

mv fold/file /tmp
git checkout fold/file

答案 13 :(得分:-3)

使用:

git reset HEAD filepath

例如:

git reset HEAD om211/src/META-INF/persistence.xml