撤消推送到裸git仓库

时间:2013-02-26 16:49:55

标签: git

我只是推了一大堆提交,我不应该使用一个简单的回购,它会将收到的所有已更改文件复制到我们的网络根目录

GIT_WORK_TREE=/var/www git checkout -f

post-receive挂钩中。

因为一次性推送了一大堆提交,所以我不知道repo收到的上一次健康提交的id是什么。

有什么办法可以撤消这种推动吗?

2 个答案:

答案 0 :(得分:1)

这不可能真的完成。

https://msdn.microsoft.com/en-us/library/ms252587.aspx,它显示了您已经检查过的提交内容的完整历史记录以及它们之间的操作,通常是使用Git repos从无能造成的灾难中恢复的正确工具;你只需要查看历史,直到你看到你做了什么提交,然后你做了你所做的任何愚蠢和破坏性的事情,并检查那个提交。

不幸的是,reflog是git reflog。除非您在repo的配置中明确启用了core.logAllRefUpdates,否则git reflog将只返回没有输出。如果您觉得有必要阅读此问题,则可能未明确启用core.logAllRefUpdates

您可能仍然可以通过查看开发计算机上远程跟踪分支的reflog(或者您推送到您的裸仓库的任何存储库)disabled by default for bare repos来获取所需的信息。但是,如果您无法访问上次健康推动的任何开发机器,那么即使您可能无法使用该选项。

如果那是你的情况,我恐怕你性交。您拥有的唯一办法 - 假设您有关于应该检查哪些提交的知识 - 是通过眼睛查看完整的git log提交历史记录并尝试检查您提交的内容估计可能是你想要的那个。启用reflog或下次更加小心。

答案 1 :(得分:1)

正如Mark Amery所说,很可能在服务器上禁用了reflog。 但是,如果你有一个你推送的存储库的副本,仍然有希望。当您进行推送时,Git更新了远程跟踪分支(如refs/remotes/origin/master),并可能更新了此远程跟踪分支的reflog。

git reflog show origin/master的输出中,您应找到与您的推送相对应的update by push条目。之前的条目对应于推送之前的位置。

您还可以直接查看日志文件(例如.git/logs/refs/remotes/origin/master)并查找类似

的条目
acb60f2759717796f807197f6997708528260255 59dbeca4120db70db34144ee14d05cc526b1f5ab Your Self <Your.Self@example.com> 1427137007 +0100  update by push

第一个sha1是你以前的位置,第二个是你追求的位置。

但是没有魔法:这只会给你这个存储库看到的远程跟踪的历史记录,而不是详细的历史记录。