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 reset
和git 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 file
或 git 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 文件夹