如何将我的远程git仓库还原到某个特定的提交?

9

我不小心运行了:

git push origin +master

在尝试将文件推送到我的Github存储库时,这个命令重置了所有提交历史并删除了一些文件。

我想知道是否有一种方法可以将我的存储库重置为具有哈希值94b90dc1121ce477131fa60ffdc234591554b6c8特定提交


1
我以前从未了解过 + 修改符。我认为使用 refspec 推送会导致远程提交未引用,需要在应用之前加上 -f 选项。 - Michael Burr
2个回答

12
git checkout master
git reset --hard 94b90dc1121ce477131fa60ffdc234591554b6c8
git push -f origin master

以下是有关命令的说明...

首先,确保你在主分支上,所以使用checkout命令使你的HEAD指向主分支。

HEAD是什么? 实际上,它是Git维护的指针,指向你当前在Git树中的位置。

事实上,大多数概念,如HEAD和分支,只是指向树中不同点的指针。 在命令行中运行gitk以以漂亮的图形格式查看树。

接下来,让我们将你的HEAD指针reset到你在原问题中使用的确切提交。这将使你文件系统上的文件与该提交匹配。

要小心reset --hard...如果你有未完成的工作或者还没有推送到服务器的提交,这可能会使它们“不可达”(再想想那个树)... 如果因为这个命令而“失去”了提交,通常可以通过使用reflog找回它们。

最后,将你的主分支本地状态推送到GitHub的主分支。-f在这里是因为你正在重写分支的历史记录,所以你需要告诉Git“强制”它。


非常感谢您的帮助! - user2821370
这是一个有效的解决方案,但如果您能详细说明这些命令的作用以帮助理解git的功能,那就更好了。 - k0pernikus

3

Jonathan的回答是正确的。实现同样功能的另一种方法是:

git push -f origin 94b90dc1121ce477131fa60ffdc234591554b6c8:master

这是对Jonathan答案的语法糖,还是在内部工作方式上有所不同呢? - k0pernikus
抱歉,我没有尝试你的方法,因为Jonathan的方法已经起作用了,无论如何还是非常感谢你! - user2821370
1
@k0pernikus:这主要是语法糖。Jonathan 首先将本地的“master”设置为正确的提交,然后强制将其推送到 origin/master,而这个强行推送将引用直接推送到 origin/master,而不需要先设置本地的“master”分支。 - Ayush
从微观优化的角度来看,这样做会稍微快一点,因为它不会切换到本地 git 仓库。(这有什么用可能是另一回事,因为我猜想人们总是希望本地仓库反映出源头。)使用这种方法进行 git pull 不会尝试合并提交吗? - k0pernikus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接