根据this answer,并由其他人指出,您应该在获取/更新后运行以下命令:
git fetch upstream
git reset --hard upstream/master
然而,更重要的是知道如何避免让自己陷入困境。
避免问题
为避免以后出现此问题,您应该始终使用单独的分支进行开发。您发布了:
$ git commit A
$ git push origin master
$ git commit B
$ git push origin master
从上面的示例中,您似乎正在使用 master 分支进行开发。这是一个很大的no-no,这似乎是您的问题的真正原因。相反,请执行以下操作:
git checkout -b changes-for-pull-request
# hack hack
git commit
git push origin changes-for-pull-request
# hack hack
git commit
git push origin changes-for-pull-request
您确实不将您的changes-for-pull-request 分支合并到您的master 分支中。相反,您发送拉取请求并将它们指向您单独的主题分支以从中提取。您甚至可以使用他们的最新版本重新调整您的工作,以使其更轻松。例如,当您准备发出拉取请求时,您可以 rebase 如下:
git checkout master
git pull upstream master # you never make changes here, so not a problem
git rebase master changes-for-pull-request # fix conflicts, if any
git push origin changes-for-pull-request
发送拉取请求并将它们指向您的changes-for-pull-request 分支。当他们将其合并到 他们的 master 中时,只需您再次执行 git pull upstream master 即可,您不会有任何问题。
自己打扫卫生
由于现在您的拉取请求已在上游合并并进入您自己的master 分支,您可以安全地在本地删除您的changes-for-pull-request 分支并在您自己的origin 中进行清理。
git push --delete origin changes-for-pull-request
git branch -d changes-for-pull-request # note lower-case "-d"