git reset --hard HEAD留下未跟踪的文件


584

git reset --hard HEAD据我所知,当我跑步时,应该将其重置为原始版本。不幸的是,它git status显示了一大堆未跟踪文件,从而使文件无处不在。

您如何告诉git“只需将其完全拉回上一次拉动中的内容,仅此而已”


44
git reset --hard重置您的索引,并将跟踪的文件恢复为与HEAD中相同的状态。它只留下未跟踪的文件。
fifigyuri 2010年

Answers:


903

您必须使用它git clean -f -d来消除工作副本中未跟踪的文件和目录。

如果需要将整个存储库重置为master(包括所有git子模块),请运行以下脚本:

git reset --hard HEAD
git clean -f -d
git checkout master
git fetch origin master
git reset --hard origin/master
git pull
git submodule update
git submodule update --init --recursive
git submodule foreach git reset --hard HEAD
git submodule foreach git clean -f -d
git submodule foreach git submodule update --init --recursive
git submodule foreach git fetch
git submodule foreach git pull
git status

56
另外,-x如果您要删除.gitignored文件并返回原始状态。
jtdubs 2010年

44
添加-n到测试将首先被删除。将所有这些参数合并为一个参数:-dfn
HyBRiD 2012年

31
我的常用命令在git clean -qfdx这里。删除所有内容并静默执行。
aragaer

3
-d -f可以decalred两次-dff-d -f -f,这将删除所有未经跟踪的目录,包括保护未被跟踪的目录。
ThorSummoner 2015年

3
@BKSpurgeon:是的,它删除文件。“我想要像以前一样的未跟踪文件”是什么意思?Git对未跟踪的文件一无所知,只是存在。它不会跟踪这些文件的多个版本(因为它们未跟踪)。
knittl

60

如果您有文件,仍要保留:

git clean -di 将进行交互式清理,使您仅可以删除不再需要的文件/目录。


48
git reset --hard && git clean -dfx

或者,zsh提供了“ gpristine”别名:

alias gpristine='git reset --hard && git clean -dfx'

这真的很方便。

如果要处理分叉的仓库,请确保从正确的仓库/分支获取并重置,例如:

git fetch upstream && git reset --hard upstream/master && git clean -df

8
抱歉,如果这不是安全的命令-我不是在试图确保安全,而是在试图回答问题。您能否评论这是否回答了问题?
jjnevis

3
这很好用,应该内置到git IMHO中(尽管我不确定我是否会常规使用-x)。很多次我在本地项目上工作,但尚未同步到github等,混乱的重构使IDE的“撤消”状态陷入了混乱。我的本能是恢复到上一次提交,但是谷歌搜索通常需要回答倒数第二次提交,而不是最后一次提交。我要做的就是回到最近的提交。做到这一点。应该是一个更简单的方法。谢谢莱纳斯!;-)
戴尔·安德森

5
这样做很危险,因为-x如果您刚刚克隆了存储库它还会使用删除类似的文件。如果那是您想要的,那就完美了。如果您只想删除未跟踪的文件,则删除该-x选项效果很好。
Emile Bergeron

2
感谢上帝gpristine
Snowcrash

2
并删除intellij设置;)
Kalpesh Soni,

17

用户互动方式:

git clean -i -fd

Remove .classpath [y/N]? N
Remove .gitignore [y/N]? N
Remove .project [y/N]? N
Remove .settings/ [y/N]? N
Remove src/com/amazon/arsdumpgenerator/inspector/ [y/N]? y
Remove src/com/amazon/arsdumpgenerator/manifest/ [y/N]? y
Remove src/com/amazon/arsdumpgenerator/s3/ [y/N]? y
Remove tst/com/amazon/arsdumpgenerator/manifest/ [y/N]? y
Remove tst/com/amazon/arsdumpgenerator/s3/ [y/N]? y

-i表示交互式
-f表示强制
-d表示目录
-x表示忽略的文件(如有需要,

添加注:添加-n--dry-run仅检查其作用。


4

您可以使用git stash。您必须指定--include-untracked,否则最终将遇到原始问题。

git stash --include-untracked

然后只需将最后一个条目放到存储中

git stash drop

您可以为此创建一个方便的别名,并称其git wipe为:

git config --global alias.wipe "! git stash -q --include-untracked && git stash drop -q"


1

git-clean 用于在工作树中删除未跟踪的文件。以下是一些可以与git clean命令一起使用的选项(简要)。

-d未指定路径时使用。因此git递归到未跟踪的目录中将其删除。

-f/--force 删除嵌套的未跟踪文件。

-i/--interactive 显示将要执行的操作并以交互方式清理文件。

-n/--dry-run 在不删除任何内容的情况下显示会发生的情况。

-x 忽略文件

示例:git clean -f -d->删除当前目录中所有子目录中所有未跟踪的文件。


-16

您可能在某个时候进行了软重置,可以通过执行以下操作解决此问题

git add .
git reset --hard HEAD~100
git pull

7
我认为这不是OP想要的。其他答案中的任何一个在实际显示如何解决此问题上都做得更好。
艾利(Avery)

1
如果要添加很多文件,这也可能很慢。
德文·罗德

4
完全无关。
Azeem Hassni '18年

1
这样做,将删除未跟踪的文件。但是,作为程序员,每个人都应该尝试找到正确的问题解决方案,而不使用变通办法和微笑。
Yuresh Karunanayake
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.