如何从git push -force中恢复?

Bri*_*ian 33 git github

这是发生了什么:

我有两个远程git分支:masterfeature1.出于某种原因,我必须使用git push --forcefeature1分支,但我不知道,当我使用git push --force它也将推动master分支.然后,当我将本地master分支推送到远程存储库时发生了灾难.

幸运的是,我当地的分支机构离遥控器不太远.基本上,我的遥控器master有两个拉出请求在我的本地之前合并master.

所以我的问题是:我可以重新打开拉取请求并重新合并吗?我注意到有合并请求的提交版本,所以我担心如果我只是提出新的拉请求它会搞砸什么?理想情况下,我只想重做两个请求的合并.

还有其他方法可以从这场灾难中恢复过来吗?我知道这--force是一个非常非常糟糕的选择.:(

更新,发生了什么的例子:

我有以下分支:

master
feature1
origin/master
origin/feature1
Run Code Online (Sandbox Code Playgroud)

我使用GitHub集成了两个pull请求Auto merge pull requests.然后,我没有master在我的本地机器上获取分支.因此,我认为我origin/master是远程主人背后的两个版本.

然后我意外地使用了git -f push,它覆盖了远程分支,现在我从远程存储库上的pull请求中丢失了提交.

如何在不搞乱其他贡献者历史的情况下从中恢复?

use*_*342 80

您始终可以master通过重置为旧提交并发出另一个提交来恢复先前观察到的状态push -f.涉及的步骤通常如下所示:

# work on local master
git checkout master

# reset to the previous state of origin/master, as recorded by reflog
git reset --hard origin/master@{1}

# at this point verify that this is indeed the desired commit.
# (if necessary, use git reflog to find the right one, and
# git reset --hard to that one)

# finally, push the master branch (and only the master branch) to the server
git push -f origin master
Run Code Online (Sandbox Code Playgroud)

但请注意,这会将远程恢复master到最近检索的状态git fetch或等效状态.在您最后一次获取之后由其他人推送的任何提交都将丢失.但是,这些提交仍然可以在他们的 reflog中使用,因此他们可以使用上述步骤恢复它们.

  • `git reset --hard origin/master@{1}` 拯救了我的夜晚!谢谢。:) (2认同)

GHu*_*ugo 22

请注意,使用Github,即使您没有在本地克隆存储库(即,当您没有reflog时),也可以使用API​​来恢复强制推送.

首先,您必须获得之前的提交sha,即强制推送之前的提交:

curl -u <username> https://api.github.com/repos/:owner/:repo/events
Run Code Online (Sandbox Code Playgroud)

然后你可以从这个sha创建一个分支:

curl -u <github-username> -X POST -d '{"ref":"refs/heads/<new-branch-name>", "sha":"<sha-from-step-1>"}' https://api.github.com/repos/:owner/:repo/git/refs
Run Code Online (Sandbox Code Playgroud)

最后,您可以在本地克隆存储库,并再次强制推送到master:

git clone repo@github
git checkout master
git reset --hard origin/<new-branch-name>
git push -f origin master
Run Code Online (Sandbox Code Playgroud)

请注意,使用双因素身份验证时,您需要提供令牌(有关详细信息,请参阅此处).

图片来源:Sankara Rameswaran

  • 你应该得到超过 1 的赞成票!!!多么英雄啊,1.5天的工作不会永远失去! (2认同)
  • 要添加到这个救生答案的一件事是,github 现在在使用“curl -u &lt;username&gt;:&lt;token&gt;”访问 api 时需要一个令牌。请参阅 https://docs.github.com/en/github/authenticating-to-github/creating-a-personal-access-token (2认同)