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 找回 git reset --hard HEAD 后的代码