git:撤消所有工作目录更改,包括新文件

Ale*_*ler 1108 git

如何删除工作目录中的所有更改,包括新的未跟踪文件.我知道这样git checkout -f做,但它不会删除自上次提交后创建的新的未跟踪文件.

有人知道怎么做吗?

小智 1639

git reset --hard # removes staged and working directory changes

## !! be very careful with these !!
## you may end up deleting what you don't want to
## read comments and manual.
git clean -f -d # remove untracked
git clean -f -x -d # CAUTION: as above but removes ignored files like config.
git clean -fxd :/ # CAUTION: as above, but cleans untracked and ignored files through the entire repo (without :/, the operation affects only the current directory)
Run Code Online (Sandbox Code Playgroud)

要查看之前将删除的内容,而不实际删除它,请使用该-n标志(这基本上是一个测试运行).当您准备好实际删除时,请删除该-n标志:

git clean -nfd

  • 如果你不知道你在做什么,那么`git clean -fxd`实际上可能真的很危险.您最终可能会永久删除一些非常重要的未跟踪文件,例如您的数据库等.请谨慎使用. (66认同)
  • 注意:git reset --hard会删除暂存的更改以及工作目录更改.另外,git clean -f -d可能与添加新的未跟踪文件相反.从问题来看,提问者可能对他当前被忽略的文件集非常满意. (16认同)
  • 请注意,`git clean -f -d`也会从被忽略的文件夹中删除文件.所以你所有的本地日志和类似的东西都将消失.通常这不是一个大问题,但最好知道. (10认同)
  • 在这种情况下,-x开关是不必要的并且有些危险. (9认同)
  • 阅读下一个答案并注意-x开关.(它也可能会删除您的本地配置,例如password/db-settings文件.例如database.yml) (7认同)
  • 您还可以使用`git clean -n`来查看使用`git clean -f`会发生什么. (5认同)
  • 只是fyi,如果你忘记添加--hard你需要做一个git clean -fxd :)并且一切顺利 (2认同)
  • 也许这会帮助别人..我使用助记符git clean -f***ing -die来记住标志 (2认同)

小智 286

我经常使用的最安全的方法:

git clean -fd
Run Code Online (Sandbox Code Playgroud)

/docs/git-clean每页语法说明:

  • -f(别名:) --force.如果Git配置变量clean.requireForce未设置为false,则git clean将拒绝删除文件或目录,除非给定-f,-n或-i.除非给出第二个-f,否则Git将拒绝使用.git子目录或文件删除目录.
  • -d.除了未跟踪的文件之外,删除未跟踪的目录.如果未跟踪的目录由不同的Git存储库管理,则默认情况下不会删除它.如果您确实要删除此类目录,请使用-f选项两次.

正如评论中所提到的,最好做git clean -nd一个干运行并告诉你在实际删除它之前会删除什么.

链接到git cleandoc页面:https: //git-scm.com/docs/git-clean

  • 在使用`git clean -fd .`实际删除文件之前,我总是`git clean -nd .` (122认同)
  • 每[git clean](https://www.kernel.org/pub/software/scm/git/docs/git-clean.html#_options)-n选项实际上是一个不会删除任何东西的干运行,它只是告诉你将要做什么. (30认同)
  • 为什么?你能解释一下细节吗? (14认同)
  • @tbear,你可以在`git clean`之前先做一个空白`add -A` +`commit -a` +`revert head`.对于主要方案,仅查看每次删除都不会缩放.此外,干跑不是一颗银弹:**如果你错过了什么**或在审查期间犯了错误怎么办? (2认同)
  • 这会删除文件,但不会撤消修改。 (2认同)

jfo*_*ain 197

对于所有未暂存的文件,请使用:

git checkout -- .
Run Code Online (Sandbox Code Playgroud)

.在年底非常重要.

您可以.使用子目录名替换以仅清除项目的特定子目录.这里特别提到了这个问题.

  • @Vincent: - 通过告诉checkout命令不再指定参数来避免输入错误.如果没有它们,您可以以新分支结束,而不是重置当前分支! (7认同)
  • 这不会还原已删除但未提交的文件. (5认同)
  • 这是最安全的路径,但它不会删除未跟踪的文件(新添加的文件)。 (2认同)
  • 这对我不起作用。我有未暂存的更改(未暂存提交),但 `git checkout -- .` 没有执行任何操作。 (2认同)

Gre*_*ill 57

看看git clean命令.

git-clean - 从工作树中删除未跟踪的文件

通过从当前目录开始递归删除不受版本控制的文件来清除工作树.

通常,只删除git未知的文件,但如果指定了-x选项,则也会删除被忽略的文件.例如,这可以用于删除所有构建产品.


don*_*ote 41

以下作品:

git add -A .
git stash
git stash drop stash@{0}
Run Code Online (Sandbox Code Playgroud)

请注意,这将丢弃您的未分阶段和分阶段的本地更改.因此,在运行这些命令之前,您应该提交任何想要保留的内容.

一个典型的用例:您移动了很多文件或目录,然后想要恢复到原始状态.

致谢:https://stackoverflow.com/a/52719/246724

  • git stash drop stash @ {0}删除最新存储如果你做了git stash它会丢弃你做的所有存储 (2认同)

Ger*_*ser 39

您可以分两步完成此操作:

  1. 还原已修改的文件: git checkout -f
  2. 删除未跟踪的文件: git clean -fd

  • +1是因为很简单。另外,因为它可以正常运行,并且可以完全按照OP的要求运行,而不会被omg吓跑,这将删除所有内容。 (3认同)

sku*_*ube 26

我以为是(警告:以下消灭一切)

$ git reset --hard HEAD
$ git clean -fd
Run Code Online (Sandbox Code Playgroud)

reset撤消更改.的clean以除去任何未跟踪˚F尔斯和d irectories.


小智 7

git reset --hard origin/{branchName}
Run Code Online (Sandbox Code Playgroud)

它将删除所有未跟踪的文件.


Tai*_*iga 5

git clean -i将首先向您显示要删除的项目,并在您确认后继续。我发现这在处理不应被意外删除的重要文件时很有用。

有关git help clean更多信息,包括一些其他有用的选项,请参阅。