问题描述
这是发生了什么:
我有两个远程 git 分支:master
和 feature1
.出于某种原因,我必须将 git push --force
用于 feature1
分支,但我不知道何时使用 git push --force
它也会推送 master
分支.然后,当我将本地 master
分支推送到远程存储库时,发生了灾难.
I have two remote git branches: master
and feature1
. For some reason I have to use git push --force
for the feature1
branch, but I didn't know when I use git push --force
it will also push the master
branch. Then, a disaster happened, as I pushed my local master
branch to the remote repository.
幸运的是,我的本地分支离远程不太远.基本上,我的远程 master
在我的本地 master
之前合并了两个拉取请求.
Luckily, my local branch is not too far away from the remote. Basically, my remote master
has two pull requests merged ahead of my local master
.
所以我的问题是:我可以重新打开拉取请求并重新合并吗?我注意到合并请求有提交版本,所以我担心如果我只是提出新的拉取请求,它会搞砸什么?理想情况下,我只想重做两个请求的合并.
So my problem is: can I reopen the pull request and remerge? I noticed that there is commit version for merge request, so I am worried if I simply make new pull request it will mess up something? Ideally I just want to redo the merging of the two requests.
有没有其他方法可以从这场灾难中恢复过来?我了解到 --force
是一个非常非常糟糕的选择.:(
Is there some other way to recover from this disaster? I learned the --force
is a really, really bad choice. :(
更新,发生的事情的例子:
Update, example of what happened:
我有以下分支:
master
feature1
origin/master
origin/feature1
我使用 GitHub 的 Auto merge pull requests
集成了两个拉取请求.然后,我没有在本地机器上获取 master
分支.因此,我认为我的 origin/master
是远程 master 后面的两个版本.
I integrate two pull requests by using the GitHub's Auto merge pull requests
. Then, I didn't fetch the master
branch on my local machine. Thus, I think my origin/master
is two versions behind the remote master.
然后我不小心使用了 git -f push
,它覆盖了远程分支,现在我丢失了远程存储库上拉取请求的提交.
Then I accidentally used git -f push
, which overwrote the remote branch and now I lost the commits from the pull requests on remote repository.
如何在不弄乱其他贡献者的历史记录的情况下从中恢复?
How can I recover from it without messing up other contributors' history?
推荐答案
使用github时,参考GHugo的回答这为 github 提供了一个万无一失的程序.如果您使用的是内部(或其他非 github)安装,请继续阅读.
When working with github, refer to GHugo's answer which gives a foolproof procedure with github. If you're on an in-house (or other non-github) installation, read on.
您始终可以通过重置为旧提交并发出另一个 push -f
来恢复之前观察到的 master
状态.所涉及的步骤通常如下所示:
You can always restore the previously observed state of master
, by resetting to the old commit and issuing another push -f
. The steps involved typically look like this:
# 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
但是请注意,这会将远程 master
恢复到最近由 git fetch
或等效项检索到的状态.在您上次获取之后由其他人推送的任何提交都将丢失.但是,这些提交仍将在他们的 reflog 中可用,因此他们可以使用上述步骤恢复它们.
Note, however, that this restores remote master
to the state most recently retrieved by git fetch
or equivalent. Any commits pushed by others after the last time you fetched will be lost. However, those commits will still be available in their reflogs, so they can restore them using steps like the above.
这篇关于如何从 git push -force 中恢复?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!