如何删除工作目录中的所有更改,包括新的未跟踪文件。我知道git checkout -f
会这样做,但它不会删除自上次提交以来创建的新的未跟踪文件。
有人知道该怎么做吗?
答案 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)
答案 3 :(得分:56)
查看git clean
命令。
git-clean - 从工作树中删除未跟踪的文件
通过从当前目录开始递归删除不受版本控制的文件来清理工作树。
通常,只删除git未知的文件,但如果指定了-x选项,则也会删除被忽略的文件。例如,这可以用于删除所有构建产品。
答案 4 :(得分:39)
以下作品:
git add -A .
git stash
git stash drop stash@{0}
请注意,这会丢弃您的非暂停和暂存的本地更改。因此,在运行这些命令之前,您应该提交任何想要保留的内容。
一个典型的用例:您移动了很多文件或目录,然后想要恢复到原始状态。
答案 5 :(得分:35)
您可以分两步完成此操作:
git checkout -f
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。 因此,要还原本地未分段的非推送更改,您需要执行以下操作: