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


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

有人知道怎么做吗?


936
2017-07-07 04:07


起源


@Joel&Wayfarer:你为什么不试试 git help reset 和 git help clean - SHernandez
在你的git配置中为这个做一个别名是个好主意;) - anubina


答案:


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)

1402
2017-07-07 04:09



注意:git reset --hard删除分阶段更改以及工作目录更改。另外,git clean -f -d可能与添加新的未跟踪文件相反。从问题来看,提问者可能对他当前被忽略的文件集非常满意。 - CB Bailey
阅读下一个答案并注意-x开关。 (它也可能会删除您的本地配置,例如password / db-settings文件。例如database.yml) - Boris
在这种情况下,-x开关是不必要的并且有些危险。 - Tim Gautier
git clean -fxd 如果你不知道你在做什么,实际上可能真的很危险。您最终可能会永久删除一些非常重要的未跟踪文件,例如您的数据库等。请谨慎使用。 - Masondesu
注意 git clean -f -d 将删除被忽略文件夹中的文件。所以你所有的本地日志和类似的东西都将消失。通常这不是一个大问题,但最好知道。 - cyriel


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

git clean -fd

224
2018-04-18 16:15



我总是 git clean -nd . 在实际删除文件之前使用 git clean -fd . - tbear
为什么?你能解释一下细节吗? - Greg B
每 git干净 -n选项实际上是一个不会删除任何东西的干运行,它只是告诉你将要做什么。 - RNickMcCandless
@tbear,你总是可以做空白 add -A + commit -a + revert head 先是先 git clean。查看每个删除操作只是不会针对主要方案进行扩展。此外,干跑不是银弹: 如果你错过了什么怎么办? 或在审查期间犯了错误? - Pacerier


对全部 未分级 文件使用:

git checkout -- .

. 最后很重要。

你可以替换 . 使用子目录名称仅清除项目的特定子目录。问题是专门解决的 这里


162
2017-09-26 15:29



@Vincent: - 通过告诉checkout命令不再指定参数来避免输入错误。没有它们你可以用一个新的分支结束,而不是重新安装当前的分支! - Igor Rodriguez
这是最安全的路由,但它不会删除未跟踪的文件(新添加的文件)。 - TinkerTenorSoftwareGuy
git checkout。也有效〜 - normalUser
这不会还原已删除但未提交的文件。 - Cerin


看看吧 git clean 命令。

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

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

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


57
2017-07-07 04:09





以下作品:

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

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

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

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


36
2017-12-16 11:32



为什么要引用存储@ {0}而不仅仅是 git stash drop? - maikel
老实说,我不记得了:) - donquixote
这个工作。请注意,确保您位于主目录中( git add -A . )。因为没有文件匹配,我丢失了30米。谢谢! - xyz
我曾经使用这种方法,它有其优点。但是,我已经发现jfountain和Heath Dutton提出的解决方案更容易解决原始问题,恕我直言。 - HeyZiko
git stash drop stash @ {0}删除最新的存储如果你做了git stash它会丢弃你做的所有stashes - DonatasD


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

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

27
2017-12-14 15:14





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

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

reset 撤消更改。该 clean 删除任何未跟踪的 F艾尔斯和 directories。


24
2017-12-15 20:36



这不起作用,我在做一个时仍然会收到冲突警告 git pull 之后: CONFLICT (content): Merge conflict in... 我只用一个解决了这个问题 git pull --strategy=ours - rubo77


git reset --hard origin/{branchName}

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


6
2018-05-17 15:20





另一种解决方案是提交更改,然后删除这些提交。这首先没有直接的好处,但它开启了提交块的可能性,并为备份创建了一个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 快捷方式对此工作流程非常有帮助。


2
2017-08-01 20:12





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

看到 git help clean 了解更多信息,包括一些其他有用的选项。


2
2017-10-05 10:18