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

有人知道怎么做吗?


当前回答

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

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

其他回答

对于所有被跟踪的非暂存文件使用:

git checkout -- .

的。结尾很重要。

你可以替换。子目录名,可仅清除项目的特定子目录。这里专门讨论了这个问题。

以下工作:

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

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

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

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

git reset --hard origin/{branchName}

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

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

git clean -fd

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

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

正如在评论中提到的,最好是执行一个git clean -nd,它会做一个演练,并在实际删除它之前告诉你将删除什么。

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

另一种解决方案是提交更改,然后删除这些提交。这在一开始并没有立即的好处,但它提供了以块提交的可能性,并为备份创建了一个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和git lola快捷键对这个工作流非常有帮助。