如何从git push -f中恢复?

4

我在一个分支上执行了git push -f,现在丢失了另一个人的工作。

我能在github上看到另一个人的工作(显示在活动中),但不在远程分支(我推送我的更改的地方)。不幸的是,我没有将本地存储库与远程同步。所以我没有其他人的代码在本地。有没有办法让我把它取到本地并恢复?


1
不要使用push -f。如果Git提示有冲突,请假设它知道最好的,然后解决冲突。 - Panagiotis Kanavos
@sashoalm:没有其他办法吗? - Ant's
你知道丢失提交的哈希值吗?在拉取(fetch)后,这个提交在你的本地仓库中是否存在? - Denys Kurochkin
1
创建一个新的克隆并运行 git fsck --no-reflogs 命令来查找所有悬空的提交。这些悬空的提交中有一个是在强制推送前由分支指向的。如果没有列出任何悬空的提交,则该提交可能被其他分支或标签引用。你可以尝试去找到它。虽然我不使用Github,但我听说Github有一项记录reflogs之类东西的功能。 - ElpieKay
@ElpieKay 显然,悬挂提交无法克隆。而且由于他在GitHub上,他没有直接访问文件系统级别的裸仓库的权限,因此无法直接运行git fsck --no-reflogs - sashoalm
显示剩余5条评论
3个回答

4
在做任何其他事情之前,请完成以下三个步骤:备份您的本地存储库,告诉其他人备份他的存储库,并将远程存储库按原样备份。不需要花哨的操作,只需使用 Ctrl+C、Ctrl+V 即可。在整个项目上执行此操作,以备份工作树。如果您没有直接访问远程服务器的权限,则必须使用 "git clone" 命令,但我更喜欢实际目录复制。

完成上述步骤后,另一个人可以使用 "git push -f" 命令重新上传他的分支。如果他有新提交,则您将不得不确定他上次推送的提交是哪个,但我相当确定不会丢失任何实际提交。如果另一个人使用了 "git pull -f" 命令,则即使如此,他也可以使用 "git reflog" 命令恢复其本地分支。

由于您正在使用 Github,您还可以查看 https://dev59.com/Xmkw5IYBdhLWcg3wJXQh#35273807。显然,Github 的事件 API 可能很有用。


3

您可以通过REST-API访问GitHub的引用日志。

这将展示给您事件:

$ curl https://api.github.com/repos/<user>/<repo>/events

在找到有问题的提交后,只需向其添加引用即可:
POST /repos/<user>/<repo>/git/refs
{
  "ref": "refs/heads/featureA",
  "sha": "aa218f56b14c9653891f9e74264a383fa43fefbd"
}

或者使用curl命令:

$ curl -i -H "Accept: application/json" -H "Content-Type: application/json" \
    -X POST -d '{"ref":"refs/heads/featureA", \
                 "sha":"aa218f56b14c9653891f9e74264a383fa43fefbd"}' \
    https://api.github.com/repos/<user>/<repo>/git/refs

-6

我不是Git的用户,但几天前我偶然看到了这篇文章,我猜这个也有解决你问题的方法。

http://ohshitgit.com/

# undo the last commit, but leave the changes available
git reset HEAD~ --soft
git stash
# move to the correct branch
git checkout name-of-the-correct-branch
git stash pop
git add . # or add individual files
git commit -m "your message here"
# now your changes are on the correct branch

这不是解决问题的方法,而是撤销本地提交的一种方式。 - berkes

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