How do I use 'git reset --hard HEAD' to revert to a previous commit?
我知道Git会跟踪我对我的应用程序所做的更改,在我提交这些更改之前,它会一直保存这些更改,但这里是我挂断的地方:
当我想要恢复到以前的提交时,我使用:
Git返回:
1
| HEAD is now at 820f417 micro |
然后如何将硬盘上的文件还原回以前的提交?
我接下来的步骤是:
1 2
| git add .
git commit -m"revert" |
但是我的硬盘上没有任何文件被更改…
我在做什么对/错?
- 将硬盘上的文件还原回以前的提交是什么意思?如果您希望提交820F417,那么文件现在应该具有该提交中的确切内容。
- 如果要撤消所有更改,则在git reset --hard之后,应该撤消git checkout 的更改。
- 我真的不明白[复制]的意思,当答案不令人满意时,再问一个新问题。从更多的复制品来看,这是灾难的秘诀……
首先,值得注意的是,git reset --hard是一个潜在的危险命令,因为它会丢弃所有未提交的更改。为了安全起见,在使用git status之前,应始终检查其输出是否干净(即为空)。
最初你会说:
So I know that Git tracks changes I make to my application, and it holds on to them until I commit the changes, but here's where I'm hung up:
不正确。Git只在您准备文件(使用git add)或创建提交时记录文件的状态。一旦您创建了一个提交,它使您的项目文件处于特定的状态,它们就非常安全了,但是在此之前,Git并没有真正"跟踪"您的文件的更改。(例如,即使执行git add以准备文件的新版本,也会覆盖临时区域中该文件的先前阶段版本。)
在您的问题中,然后继续问以下问题:
When I want to revert to a previous commit I use: git reset --hard HEAD And git returns: HEAD is now at 820f417 micro
How do I then revert the files on my hard drive back to that previous commit?
如果您执行git reset --hard ,那么git将:
- 使您当前的分支(通常为master)返回到处。
- 然后使工作树和索引("临时区域")中的文件与中提交的版本相同。
HEAD指向您当前的分支(或当前提交),所以git reset --hard HEAD所要做的就是丢弃您所拥有的任何未提交的更改。
所以,假设你想回到的好承诺是f414f31。(您可以通过git log或任何历史浏览器找到这一点。)然后,您可以根据具体需要选择几个不同的选项:
- Git重置——软头@1真的弄乱了我的本地存储库。它认为所有的文件现在都在。我现在该怎么办?
- @马克·朗格:你最后指出的答案并不是用户——很难,而是简单的git重置。
- @MiniQuark:我使用的是我在链接答案的评论中建议的等价和略短的变体。
- 谢谢你给我关于git reset --soft HEAD@{1}的提示。尽管我在Git方面经验丰富,但我还没有想到这种恢复承诺的方法。
- 如果git log没有立即显示您希望恢复的相关承诺,您也可以咨询git reflog。
- 我不明白。当我想撤消上一次提交时,我只需执行git reset --hard HEAD操作,这将撤消我取消提交的操作,即它不会删除它,它将保留代码,但将其置于跟踪状态。然而,您说它所要做的只是丢弃您所拥有的任何未提交的更改。你能澄清一下吗?
- 我用Git重置解决了我的问题——硬XXXXXX!
- 只是要明确一点,当你说"放弃所有未提交的更改"时,这是指编辑或删除现有文件,还是指新的未跟踪文件?我不确定向存储库添加新文件是否是"未提交的更改",我想可能是这样。
- 另一种安全方法是恢复上一次提交,但在本地保留这些更改。用途:git reset HEAD^-stackoverflow.com/a/15772171/2510591
WARNING: git clean -f will remove untracked files, meaning they're gone for good since they aren't stored in the repository. Make sure you really want to remove all untracked files before doing this.
试试看git clean -f。
git reset --hard不会删除未跟踪的文件,因为git-clean会从跟踪根目录中删除不在git跟踪下的任何文件。
或者,正如@paul betts所说,您可以这样做(但请注意,这也会删除所有被忽略的文件)
- git clean -df
- git clean -xdf小心!这还将删除被忽略的文件
- 这就是我从终端得到的:不删除应用程序/视图/关系/不删除tmp/会话/不删除tmp/套接字/不更改。隐马尔可夫模型。。。我做的每件事似乎都不起作用。不是你的错。
- git clean-xdf是您想要的:)
- 经过多次尝试和大部分错误之后,我最终创建了一个新的应用程序,并从备份手动加载了所有文件。我做了很多备份,但我真的需要学会依赖git,也就是说我需要学会更好地使用git。
- @布莱恩·麦克多诺——这句话太常见了。我在Git上犯了很多错误,只是因为我不理解它,而且它需要的时间超出了我的承受能力。我使用它的时候,尽量靠近SVN,有很多个人备份。上帝禁止一个Git专家上我的电脑去"修复那个烂摊子"。
- 这是迄今为止我遇到的第一个git命令,它是不可逆的…添加了一个警告,这样其他人就不会太高兴了…
- 先用n而不是f来查看要删除的内容的列表,例如:git clean -xdn。
- 记住要小心清理,因为git clean-f将删除任何环境/gui项目文件夹(例如IDEA(phpsorm)或.vagrant(vagrant))。
- 该死的,git clean -xdf甚至删除了所有被忽略的文件!!!!
- 记住以后要安装NPM,因为git clean-xdf会删除被忽略的文件,即任何节点模块。这就是为什么运行命令后所有东西看起来都已损坏的原因:)
- git clean -df就足够了。-x标志忽略.gitignore文件。
- 这个问题提到了git clean,但意味着git clean。由于糟糕的设计决策,我无法修复它,但也许答案者可以。
- @用户1406043手册页(和一些shell)支持这两种功能。你可以说man git-clean,shell将显示命令git clean的文档。