2017-08-03 76 views
0

昨天,当我在工作时,我正在开发我的家用计算机上的项目。问题是,当我试图克隆回购日食会崩溃。所以相反,我手动下载并初始化回购,然后强制推送到我的家用电脑。这删除了回购中的所有历史和文件。我做了一些搜索,并尝试恢复提交,但它的推动抹去了提交历史,所以我只能回到强制推送提交。获得之前在git存储库上被删除的提交

我有一台电脑在家里,因为这个错误还没有拉动更新,我能够得到它的提交SHA。我在网络上使用它,发现它的最后一个版本仍然存在,但我无法提交该提交,因为它被“删除”并且不会显示在回购记录中。有没有一种方法可以使用最后一次良好提交中的SHA并使主分支恢复我的历史记录?

回答

2

更改HEAD(git存储库中的工作位置)时,它会在reflog中跟踪您的历史记录。在命令行中执行git reflog将显示完整的历史记录。你可以阅读更多关于它git-scm.com

当你有所需的提交SHA,你可以做一个与它的git签出。执行git checkout [SHA1]将带您到git历史中的所需位置。从那里,你可以通过运行git checkout -b "new_branchname"来创建一个新的分支。

如果要将当前分支设置为提交,则可以运行git reset --hard [SHA1]。这将重置当前分支,但是前一个状态可以在reflog中找到。

+0

当我做git checkout [我的好sha1想要恢复]它说参考不是树 – ProgrammingCuber

+0

它也没有显示出来,当我做了git reflog。 – ProgrammingCuber

+0

如果您无法签出提交SHA,则表明提交未存储在本地git存储库中。因此,您可以从其他计算机上将其上传到中央存储库(我假设您使用的是类似github的东西)。当你在机器上签出提交/分支时,你通过'git checkout -b“backup_branch”'创建一个新的分支。然后通过git push将它推送到中央存储库。 在另一台计算机上,然后运行'git pull',以获取新的更改。然后'git checkout“backup_branch”'。您现在应该已经检出了所需的提交。 –

0

我不建议这样做,因为一般的做法,但...你应该能够强制从其他计算机推动,从而重置回到其原来的状态。假设你不希望在昨天对你的git repo进行巨大的混乱的时候做任何事情。

+0

是啊我不在乎我昨天做的工作,我可以很容易地重写它。你认为推力会带回我在git回购上的历史吗? – ProgrammingCuber

+0

一个简单的说法是:如果您强制从存储库中以您想要传播的状态推送,它基本上会“抛弃”存储库中的任何内容,并将其替换为本地存在的内容。 ...是的。 – azyth

+0

你认为如果我在我的家用计算机上的版本上创建了一个分支(好的提交),那么我把它推到那个分支上,我只是从我的工作计算机上拉出来,并删除分支,我不需要任何东西没事吧? – ProgrammingCuber

0

既然你知道你想恢复的正确版本,它会让事情变得更容易。

在你的本地仓库,使用下面的命令:

git reset --hard <commit sha value> 
git push -f 

注:如果在执行该命令在本地未初始化(而不是从远程克隆),你应该git fetch --all第一次提取,然后执行这两个命令。

现在该版本将回到最新状态,因为您需要本地和远程两者。

+0

我确实尝试过,但它并没有结束工作,因为该沙在力推中被删除。我能够修复它,但是我的答案我所接受的建议是 – ProgrammingCuber

+0

它可以工作。即使是在强制推送的提交历史中也不存在,但它仍然存在于git/objects中。如果你在本地执行了未初始化的命令(不是从远程克隆的),你应该首先通过'git fetch --all'获取命令,然后执行命令,你的分支将重置最新版本。 –

相关问题