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

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

有人知道怎么做吗?

790346 次浏览
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 untrackedgit 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)

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

git clean -nfd

看看#0命令。

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

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

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

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

git clean -fd

根据/docs/git-clean页面的语法解释:

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

正如注释中提到的,最好做一个git clean -nd,它执行一个空运行,并在实际删除它之前告诉您将删除什么。

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

对于所有跟踪的未上演文件使用:

git checkout -- .

最后的.很重要。

您可以将.替换为子目录名称,以仅清除项目的特定子目录。该问题已专门解决这里

以下作品:

git add -A .git stashgit stash drop stash@{0}

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

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

学分:https://stackoverflow.com/a/52719/246724

另一种解决方案是提交更改,然后删除这些提交。起初这并没有立即的好处,但它开辟了以块提交的可能性,并为备份创建了一个git标签。

您可以在当前分支上执行此操作,如下所示:

git add (-A) .git commit -m"DISCARD: Temporary local changes"git tag archive/local-changes-2015-08-01  # optionalgit revert HEADgit reset HEAD^^

或者您可以在分离的HEAD上执行此操作。(假设您从BRANCHNAME分支开始):

git checkout --detach HEADgit add (-A) .git commit -m"DISCARD: Temporary local changes"git tag archive/local-changes-2015-08-01  # optionalgit checkout BRANCHNAME

然而,我通常做的是以块的形式提交,然后将部分或全部提交命名为“DISCARD:…”。然后使用交互式rebase来删除坏的提交并保留好的提交。

git add -p  # Add changes in chunks.git commit -m"DISCARD: Some temporary changes for debugging"git add -p  # Add more stuff.git commit -m"Docblock improvements"git tag archive/local-changes-2015-08-01git rebase -i (commit id)  # rebase on the commit id before the changes.# Remove the commits that say "DISCARD".

这更冗长,但它允许您准确查看要丢弃的更改。

#0和#1快捷方式对这个工作流程非常有帮助。

对于我使用的特定文件夹:

git checkout -- FolderToClean/*

你可以分两步完成:

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

我以为是(警告:跟随消灭一切

$ git reset --hard HEAD$ git clean -fd

撤消更改的reset。删除任何未跟踪的files和directory的clean

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

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

如果您想放弃所有更改,您可以在.gitconfig中的别名中使用任何有效选项。例如:

[alias]discard = "!f() { git add . && git stash && git stash drop stash@{0}; }; f"

用法:git discard

git reset --hard origin/{branchName}

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

这可能是一个新手的答案,但是:我在Windows上使用TortoiseGit,它有一个很好的功能,叫做REVERT。因此,恢复本地非分阶段非推送更改的操作是:

  1. 调出所需文件夹的上下文菜单并选择恢复,它显示了一个恢复弹出窗口,您可以在其中选择更改的文件以恢复/恢复。
  2. 如果您还想删除添加的文件(尚未在git中),请单击提交(来自相同的上下文菜单)它会弹出提交弹出窗口并显示添加的文件,然后右键单击它们中的每一个并选择删除。但不要按提交btn在这个弹出窗口中,因为你不想提交,但只看到添加文件并从这里删除它们。