2013-02-26 136 views
1

我刚刚被推提交的一大堆,我不应该是将所有修改过的文件接收使用撤消推到裸露的git回购

GIT_WORK_TREE=/var/www git checkout -f 

我们的Web根裸露的回购post-receive挂钩。

因为一次推送了整个提交负载,所以我不知道回购的前一个健康提交的ID是什么。

有没有什么办法可以解决这个问题?

+1

你可以使用git reflog来做到这一点,但我不知道如何使用这个命令... – blue112 2013-02-26 16:52:18

+0

你知道最后一次健康提交是什么时候吗(所以你可以根据'git log'进行猜测) ?或者它是否已被标记(这会简化)?我不认为reflog是你的答案,因为它基本上是一组临时移动标签,例如, HEAD @ {1}指向在当前提示之前完成的提交(尽管有修改提交)。您的老式备份可能是您的朋友... – Gavin 2013-02-26 17:37:22

+0

@Gavin我知道在几个小时内,但因为我们正在研究基于Web的东西,不能在本地轻松测试,所以我们依赖于提交和推送更改到我们的测试服务器进行测试,这意味着如果我们犯了一堆愚蠢的错误,我们可以在几分钟内轻松地进行一打提交(而且我们太懒惰,没有纪律,并且对使用git的正确方式一无所知这样做后通过并整理提交历史记录)。因此,通过眼睛找到稳定的承诺并不适合我们的情况。 – 2013-02-27 13:47:57

回答

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 <[email protected]> 1427137007 +0100 update by push 

第一SHA1是你在哪里之前,第二你在哪里了。

但是没有什么神奇的东西:这会让你只知道这个存储库看到的远程跟踪的历史,而不是详细记录谁推送的时间。

1

这不可能完成。

git reflog,它显示你已经检查了什么,以及你在它们之间移动什么操作的完整历史记录,通常是使用Git仓库恢复无能造成灾难的适当工具;你只要看看历史,直到你看到你做了什么,然后你做了任何愚蠢和破坏性的事情,然后结账。

不幸的是,推荐日志是disabled by default for bare repos。除非您已在您的仓库配置中明确启用core.logAllRefUpdates,否则git reflog将仅返回而不输出。如果你觉得有必要阅读这个问题,很可能你没有明确启用core.logAllRefUpdates

您可能仍然能够通过查看开发计算机上远程跟踪分支的推荐日志(或您推送给裸露回购的任何回购)获取所需信息,as described by Matthieu Moy。但是,如果您无法访问任何一台开发机器进行最后的健康推动,即使该选项可能也无法提供给您。

如果那是你的情况,恐怕你已经完蛋了。唯一的办法就是 - 假设你有一些关于什么提交应该被检出的知识 - 就是仔细查看完整的git log提交历史记录,并尝试检查你认为可能是你想要的提交。启用reflog或下次更加小心。