有点像git newcomer,我想确保我没有对我的git存储库造成任何重大损害。基本上,我使用git reset --hard HEAD
恢复到我之前的提交,因为我搞砸了一些事情。然后我意识到我不想失去我所做的一切,所以我做了git reset HEAD@{1}
。哪个似乎没有任何帮助。然后我尝试了git reset --hard ORIG_HEAD
。
所以我想,无论如何,我会做一点点的工作。在我这样做之后,我去推它,我一直收到这个错误:
更新被拒绝,因为您当前分支的提示已落后
我试过了git pull origin
并且由于一些我无法完全记住的原因而不允许它。
最后,我刚刚做了一个git push -f
,它似乎工作正常,我的项目再次运作良好。
如果有帮助,这是我的git reflog
输出:
我只是好奇我是否真的搞砸了我推到的BitBucket存储库或我能够再次恢复的本地存储库。有没有办法检查我的git repo是否仍然正常运行?
编辑:BitBucket还说我“剥离”了提交......答案 0 :(得分:7)
放松。
为了减轻您的顾虑,请在另一个目录中克隆另一个副本。然后检查一下并引入您想要推送的新代码。一切都会成功。
根据您的文字,我认为您可能重新编写了主人的提交历史记录/树,因为git reset HEAD@{1}
后跟git reset --hard ORIG_HEAD
。完全按照你的说法运行,我也“丢失”了一次提交。
这可能是您看到的错误消息。
20:19:44 (master) ~/code/wat/so_test$ git push
To git@github.com:rgbkrk/so_test.git
! [rejected] master -> master (non-fast-forward)
error: failed to push some refs to 'git@github.com:rgbkrk/so_test.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
强制git push导致master分支占用你的新路径。
还记得我说过如何放松吗?好吧,那个提交并没有消失。如果您拥有正在使用的原始仓库,它应该仍在git reflog
,但不在git log
。它就在那里晃来晃去。
2b47149 HEAD@{2}: commit: The bad commit
01346b9 HEAD@{3}: reset: moving to ORIG_HEAD
42af608 HEAD@{4}: reset: moving to HEAD@{3}
01346b9 HEAD@{5}: reset: moving to HEAD@{1}
2f2d2ce HEAD@{6}: commit: More junk text
01346b9 HEAD@{7}: commit: Text
42af608 HEAD@{8}: clone: from git@github.com:rgbkrk/so_test.git
如果您确实需要提交,则可以在该提交和当前主服务器的HEAD上执行diff。 git diff 2f2d2ce..HEAD
就我为此问题创建的回购而言。您也可以将它合并到master中。
查找“无法访问”提交的简便方法是使用git fsck
,确保启用--no-reflogs
。
20:48:02 (master) ~/code/wat/so_test$ git fsck --unreachable --no-reflogs
Checking object directories: 100% (256/256), done.
Checking objects: 100% (5/5), done.
unreachable tree 0ca2f12b74de7a33f6dc62374a85d982a96531ce
unreachable commit 2f2d2ce1b6591f0e7a5f67af81a125231ee2e9a1
unreachable blob bcb7bae71bbdfb79ba31ee41e4aa3a11b1ad2f7f
有关恢复丢失提交的更多信息,请查看git ready's article。
要指出一些事情:git reset --hard
可能很危险,因为它会丢弃所有未提交的更改。如果您想要保留一些工作,但不想在此提交中使用它,请使用git stash
。