为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用'git reset --hard HEAD'恢复到先前的提交?

如何使用'git reset --hard HEAD'恢复到先前的提交?

Git
慕虎7371278 2019-12-07 13:18:38
我知道Git会跟踪我对应用程序所做的更改,它会一直保留到它们,直到我提交更改为止,但这是我挂断的地方:当我想恢复到以前的提交时,我使用:git reset --hard HEADGit返回:HEAD is now at 820f417 micro然后,如何将硬盘驱动器上的文件还原到先前的提交?我的下一步是:git add .git commit -m "revert"但是我的硬盘上没有任何文件已更改...我在做什么对/错?
查看完整描述

2 回答

?
函数式编程

TA贡献1807条经验 获得超9个赞

首先,始终要注意这git reset --hard是一个潜在的危险命令,因为它会丢弃所有未提交的更改。为了安全起见,git status在使用前,请务必检查其输出是否干净(即为空)。


最初,您说以下内容:


因此,我知道Git会跟踪我对应用程序所做的更改,它会一直保留到它们,直到我提交更改为止,但这是我挂断的地方:


不对 Git仅在暂存文件(带有git add)或创建提交时记录文件的状态。一旦创建了一个使项目文件处于特定状态的提交,它们就非常安全,但是直到那时Git才真正对文件进行“跟踪”。(例如,即使您git add要暂存文件的新版本,也会覆盖暂存区域中该文件先前已暂存的版本。)


在您的问题中,然后继续询问以下内容:


当我想恢复到以前的提交时,我使用:git reset --hard HEAD git返回:HEAD现在位于820f417 micro


然后,如何将硬盘驱动器上的文件还原到先前的提交?


如果您这样做,git reset --hard <SOME-COMMIT>那么Git将:


使您当前的分支(通常master)回到<SOME-COMMIT>。

然后,使工作树中的文件和索引(“暂存区”)与中提交的版本相同<SOME-COMMIT>。

HEAD指向您当前的分支(或当前的提交),因此所有git reset --hard HEAD要做的就是丢弃您具有的所有未提交的更改。


因此,假设您要返回的良好提交是f414f31。(您可以通过git log或任何历史记录浏览器找到它。)然后,根据实际要执行的操作,您可以有几个不同的选择:


更改您当前的分支以指向较早的提交。您可以使用git reset --hard f414f31。但是,这是在重写分支的历史记录,因此,如果您已与任何人共享此分支,则应避免使用它。另外,您之后所做的提交f414f31将不再位于master分支的历史记录中。

创建一个新提交,该提交表示与项目完全相同的项目状态f414f31,但是只需将其添加到历史记录中,这样就不会丢失任何历史记录。您可以使用此答案中建议的步骤进行操作,例如:


git reset --hard f414f31

git reset --soft HEAD@{1}

git commit -m "Reverting to the state of the project at f414f31"


查看完整回答
1 反对 回复 2019-12-07
?
白板的微信

TA贡献1883条经验 获得超3个赞

警告:git clean -f将删除未跟踪的文件,这意味着它们永久消失了,因为它们没有存储在存储库中。在执行此操作之前,请确保您确实要删除所有未跟踪的文件。


试试看,看看git clean -f。


git reset --hard不会删除未跟踪的文件,而git-clean将从根目录中删除所有不在Git跟踪下的文件。


或者,就像@Paul Betts所说的,您可以执行此操作(请注意-也会删除所有忽略的文件)


git clean -df

git clean -xdf 警告!这也会删除忽略的文件


查看完整回答
反对 回复 2019-12-07
  • 2 回答
  • 0 关注
  • 4905 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信