【问题标题】:How to recover from git push -f?如何从 git push -f 中恢复?
【发布时间】:2017-01-22 07:33:05
【问题描述】:

我在一个分支上做了一个git push -f,现在失去了其他人的工作。

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

【问题讨论】:

  • ...不要这样做push -f。如果 git 抱怨冲突,假设它最了解并修复冲突
  • @sashoalm:没有别的办法了吗?
  • 你知道丢失提交的哈希值吗?获取后,此提交是否仍然存在于您的本地存储库中?
  • 创建一个新克隆并运行git fsck --no-reflogs 以查找所有悬空提交。在强制推送之前,分支指向了这些悬空提交之一。如果未列出任何悬空提交,则该提交由其他分支或标签引用。你可以试着找出来。我没有使用 Github,但我想我听说有人说 Github 具有记录 reflogs 之类的功能。

标签: git github git-push data-recovery


【解决方案1】:

我不是一个 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

【讨论】:

  • 这不是问题所要求的解决方案,而是一种撤消本地提交的方法。
【解决方案2】:

在做任何其他事情之前,请先执行以下 3 个步骤 - 备份您的本地 repo,告诉其他人备份他的备份,并像现在一样备份远程 repo。没什么特别的,只需 Ctrl+C、Ctrl+V 即可。在您的整个项目上执行此操作,以便您也备份工作树。如果您没有直接访问远程服务器的权限,git clone 就足够了,不过我更喜欢真正的目录副本。

完成此操作后,其他人可以使用git push -f 重新上传他的分支。如果他有新的提交,你将不得不弄清楚他最后一次推送哪个提交,但我相当肯定不会丢失任何实际的提交。如果其他人已经完成了git pull -f,即使这样他也可以使用git reflog 来恢复他的本地分支。

由于您使用的是 Github,因此您可能还会看到 https://stackoverflow.com/a/35273807/492336。显然有一个 Github 的事件 API 可能有用。

【讨论】:

    【解决方案3】:

    您可以通过REST-API 访问 GitHub 的 reflog

    这将向您显示事件:

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

    找到损坏的提交后,只需添加对它的引用:

    POST /repos/<user>/<repo>/git/refs
    {
      "ref": "refs/heads/featureA",
      "sha": "aa218f56b14c9653891f9e74264a383fa43fefbd"
    }
    

    或使用卷曲:

    $ 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
    

    【讨论】:

      猜你喜欢
      • 2017-01-05
      • 2012-09-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多