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

Posted

技术标签:

【中文标题】git reset --hard HEAD 留下未跟踪的文件【英文标题】:git reset --hard HEAD leaves untracked files behind 【发布时间】:2011-05-18 16:21:59 【问题描述】:

当我运行git reset --hard HEAD 时,它应该重置为您所提取的原始版本,据我所知。不幸的是,它会留下文件,因为git status 会显示一大堆未跟踪的文件。

你如何告诉 git“只要把它恢复到最后一次拉取时的样子,仅此而已”?

【问题讨论】:

git reset --hard 重置您的索引并将跟踪的文件恢复到它们在 HEAD 中的状态。它只留下未跟踪的文件。 【参考方案1】:

您必须使用git clean -f -d 来删除工作副本中未跟踪的文件和目录。 您可以添加-x 来删除被忽略的文件,更多信息请参见this excellent SO answer。

如果您需要将包含子模块的整个存储库重置为 master 上的状态,请运行此脚本:

git fetch origin master
git checkout --force -B master origin/master
git reset --hard
git clean -fdx
git submodule update --init --recursive --force
git submodule foreach git fetch
git submodule foreach git checkout --force -B master origin/master
git submodule foreach git reset --hard
git submodule foreach git clean -fdx

【讨论】:

如果你想删除你的 .gitignored 文件并恢复到原始状态,也可以-x -n 添加到测试将首先被删除。将所有这些组合在一个参数中:-dfn 这里我常用的命令是git clean -qfdx。删除所有内容并静默进行。 -d -f 可以为-dff 贴花两次-d -f -f,这将删除所有未跟踪的目录,包括受保护的未跟踪目录。 @BKSpureon:是的,它会删除文件。 “我想要以前的未跟踪文件”是什么意思? Git 对未跟踪的文件一无所知,除非它们存在。它不会跟踪这些文件的多个版本(因为它们未跟踪)。【参考方案2】:

如果您还有想要保留的文件:

git clean -di 将进行交互式清理,只允许您删除不再需要的文件/目录。

【讨论】:

【参考方案3】:
git reset --hard && git clean -df

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

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

这真的很方便。

可选:

git clean 命令还有一个-x 选项。这也将删除 'git 忽略' 文件,所以如果它是你想要的,也可以添加这个选项。

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

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

【讨论】:

抱歉,如果这不是一个安全的命令 - 我并没有试图保证安全,我试图回答这个问题。您能否评论一下这是否回答了这个问题? 这很好用,应该内置到 git 恕我直言(虽然我不确定我是否会经常使用 -x)。很多次我都在做一个本地项目,还没有同步到 github 等,一个混乱的重构超出了 IDE 的“撤消”状态。我的直觉是恢复到最后一次提交,但谷歌搜索通常需要倒数第二次提交的答案,而不是最后一次提交。我只想回到最近的提交。这是这样做的。不过应该是更简单的方法。谢谢莱纳斯! ;-) 这很危险,因为它还会使用-x 删除被忽略的文件,就像您刚刚克隆了存储库一样。如果这就是你想要的,那就完美了。如果您只想删除 未跟踪的 文件,删除 -x 选项效果很好。 感谢上帝gpristine 并删除 intellij 设置 ;)【参考方案4】:

用户交互方式:

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 只是检查它会做什么。

【讨论】:

【参考方案5】:

您可以使用git stash。你必须指定--include-untracked,否则你会遇到原来的问题。

git stash --include-untracked

然后只删除存储中的最后一个条目

git stash drop

您可以为它创建一个方便的别名,并称之为git discard,例如:

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

【讨论】:

git clean 选项更简单直观。 很棒的解决方案,谢谢。这是唯一对我有用的东西 别名是很好的补充!谢谢,以后会用的。【参考方案6】:

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

-d 在未指定路径时使用。所以 git 递归到未跟踪的目录中删除它们。

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

-i/--interactive 显示将要做什么并以交互方式清理文件。

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

-x忽略文件

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

【讨论】:

【参考方案7】:

您要查找的命令是git clean

【讨论】:

下次请添加更多描述/示例等。无论什么有助于用户理解它的作用,以及在这种情况下使用什么参数。【参考方案8】:

您可以添加这个有用的别名来硬重置所有文件(已跟踪和未跟踪)并返回到之前的提交版本:

git config --global alias.reset-hard '!f()  git reset --hard; git clean -df ; ; f'

然后你可以这样重置:

git reset-hard

【讨论】:

【参考方案9】:

删除除.git 文件夹之外的所有内容,然后运行 git reset --hard

【讨论】:

【参考方案10】:

你可能在某个时候做了软重置,你可以通过这样做来解决这个问题

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

【讨论】:

我认为这不是 OP 想要的。其他任何一个答案都可以更好地实际展示如何解决这个问题。 如果您要添加很多文件,这也可能会很慢。 完全不相关。 这样做,未跟踪的文件将被删除。但作为程序员,每个人都应该努力为问题找到正确的解决方案,而不是使用变通方法和微笑。 伙计们,这个答案还不错(-16)。它解决了 OP 的问题——一个干净的状态。 Git初学者可以理解这些命令。 SO 有很多变通方法,把它当作一种选择。

以上是关于git reset --hard HEAD 留下未跟踪的文件的主要内容,如果未能解决你的问题,请参考以下文章

git reset --soft,--hard的区别

如何撤消 git reset --hard HEAD~1?

git 找回 git reset --hard HEAD 后的代码

git reset 命令详解

git reset --hard HEAD^后显示more?的解决方案

git reset --hard HEAD^后显示more?的解决方案