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

时间:2009-07-07 04:07:40

标签: git

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

有人知道该怎么做吗?

12 个答案:

答案 0 :(得分:1557)

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)

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

git clean -nfd

答案 1 :(得分:264)

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

git clean -fd

根据/docs/git-clean页面的语法说明:

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

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

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

答案 2 :(得分:188)

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

git checkout -- .

最后.很重要。

您可以将.替换为子目录名,以仅清除项目的特定子目录。该问题专门针对here

答案 3 :(得分:56)

查看git clean命令。

  

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

     

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

     

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

答案 4 :(得分:39)

以下作品:

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

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

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

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

答案 5 :(得分:35)

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

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

答案 6 :(得分:26)

我认为是(警告:消灭所有

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

reset撤消更改。 clean删除任何未跟踪的 f iles和 d irectories。

答案 7 :(得分:7)

git reset --hard origin/{branchName}

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

答案 8 :(得分:4)

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

有关详情,请参阅git help clean,包括其他一些有用选项。

答案 9 :(得分:3)

另一种解决方案是提交更改,然后删除这些提交。这首先没有直接的好处,但它开启了提交块的可能性,并为备份创建了一个git标记。

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

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

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

git checkout --detach HEAD
git add (-A) .
git commit -m"DISCARD: Temporary local changes"
git tag archive/local-changes-2015-08-01  # optional
git 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-01
git rebase -i (commit id)  # rebase on the commit id before the changes.
  # Remove the commits that say "DISCARD".

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

git lol and git lola快捷方式对此工作流程非常有帮助。

答案 10 :(得分:2)

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

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

用法:git discard

答案 11 :(得分:0)

这可能是一个菜鸟答案,但是: 我在Windows上使用TortoiseGit,它具有一个很好的功能,称为REVERT。 因此,要还原本地未分段的非推送更改,您需要执行以下操作:

  1. 打开所需文件夹的上下文菜单,然后选择还原, 它显示了一个还原弹出窗口,您可以在其中选择更改的文件以还原/恢复。
  2. 如果您还想删除添加的文件(不在git中),请单击“提交”(来自相同上下文) 菜单),它会弹出“提交”弹出窗口,并向您显示添加的文件,然后 右键单击每个,然后选择删除。但是不要按Commit btn在此弹出窗口中,因为您不想提交,但仅看到已添加 文件并从此处删除它们。