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

Posted

技术标签:

【中文标题】git:撤消所有工作目录更改,包括新文件【英文标题】:git: undo all working dir changes including new files 【发布时间】:2010-11-08 14:03:04 【问题描述】:

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

有人知道怎么做吗?

【问题讨论】:

@Joel & Wayfarer:你为什么不试试git help resetgit help clean 在你的 git config 中为此创建一个别名是个好主意 ;) 【参考方案1】:
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

【讨论】:

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

查看git clean 命令。

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

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

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

【讨论】:

我尝试了git clean -i 并从菜单中选择了“干净” - 这最终删除了新文件。【参考方案3】:

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

git clean -fd

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

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

如 cmets 中所述,最好使用 git clean -nd 进行试运行,并在实际删除之前告诉您要删除的内容。

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

【讨论】:

在实际使用git clean -fd .删除文件之前,我总是git clean -nd . 为什么?请详细说明一下。 Per git clean -n 选项实际上是一个试运行,它不会删除任何东西,它只是告诉你将要做什么。 @tbear,你总是可以在git clean之前先做一个空白add -A + commit -a + revert head。审查每一个删除根本不适合主要场景。此外,空跑也不是灵丹妙药:如果您错过了什么或在审核过程中犯了错误怎么办? 这会删除文件,但不会撤消修改。【参考方案4】:

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

git checkout -- .

末尾的. 很重要。

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

【讨论】:

@Vincent: -- 通过告诉 checkout 命令不再指定更多参数来避免输入错误。没有它们,您可以以新分支结束而不是重置当前分支! 这是最安全的方法,但不会删除未跟踪的文件(新添加的文件)。 这不会恢复已删除但未提交的文件。 初学者可能会发现知道双破折号 (--) 在那里做了什么很有用:虽然 git checkout filegit checkout . 可以恢复对某个文件所做的所有更改(在前一个文件中)或对所有文件进行的更改(在后一个文件中),但通常它们不会那样使用,并且在它们之前有一个双破折号,以完全明确它不会成为“分支结帐”。所以即使分支名和文件名相同,也不会有名字冲突的问题。 这对我不起作用。我有未暂存的更改(未暂存以提交),但 git checkout -- . 什么也没做。【参考方案5】:

以下作品:

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

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

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

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

【讨论】:

您为什么引用 stash@0 而不仅仅是 git stash drop 老实说,我不记得了:) 这个有效。请注意,请确保您位于主目录(git add -A .)中。由于没有文件匹配,我丢失了 30m。谢谢! 我曾经使用过这种方法,它有优点。但是,我后来发现 jfountain 和 Heath Dutton 提出的解决方案更适合原始问题,恕我直言。 git stash drop stash@0 如果你做了 git stash 会丢弃最新的 stash 它会丢弃你所做的所有 stash【参考方案6】:

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

【讨论】:

【参考方案7】:

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

git checkout -- FolderToClean/*

【讨论】:

这不会删除未跟踪的文件,如 OP 所述。【参考方案8】:

您可以分两步完成:

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

【讨论】:

+1 因为简单。也因为它可以正常工作并且完全按照 OP 的要求执行,而不会被 omg 吓跑,这将删除所有内容。【参考方案9】:

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

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

reset 撤消更改。 clean 删除任何未跟踪的f文件和d目录。

【讨论】:

这不起作用,我在之后执行git pull 时仍然收到冲突警告:CONFLICT (content): Merge conflict in... 我只通过git pull --strategy=ours 解决了这个问题【参考方案10】:

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

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

【讨论】:

【参考方案11】:

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

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

用法:git discard

【讨论】:

这个别名我很喜欢【参考方案12】:
git reset --hard origin/branchName

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

【讨论】:

【参考方案13】:

这可能是一个菜鸟的答案,但是: 我在 windows 上使用 TortoiseGit,它有一个很好的功能,叫做 REVERT。 因此,您要恢复本地非暂存的非推送更改的方法是:

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

【讨论】:

以上是关于git:撤消所有工作目录更改,包括新文件的主要内容,如果未能解决你的问题,请参考以下文章

git 工作目录 vs 暂存区 vs 本地仓库 vs .git 文件夹

所有git本地分支都共享同一个工作目录吗?

Git 撤消操作

git:通过命令行执行本地 Git 工作流

Git Book 中文版 - Git的撤消操作 - 重置, 签出 和 撤消

[转]git操作指南