我在GitHub上贡献的项目出了点问题。
有一个主要的回购和我的分支,其中包含各种改进,这些改进是WIP,尚未准备好合并回主回购。我也有贡献者访问主回购。但不知何故,Git似乎搞砸了整个事情:
有没有人知道发生了什么,以及如何解决它?
答案 0 :(得分:3)
如果我不得不猜测,当你收到警报时需要修复错误时,你做了git checkout upstream/master
。
这让你处于分离的HEAD状态。这没有什么可笑的 - 它只是意味着你签出的提交(HEAD)没有任何本地分支指向它(因此HEAD被分离)。您可以继续在该状态下添加新提交,但在推送新提交之前,您需要为它们提供一个分支,以便以后可以引用它们。
接下来,您修复了错误并希望推送更改,因此您尝试了git push upstream
并收到有关如何进入分支的错误消息。你可能已经相信HEAD已经在掌握,因为某种方式git感到困惑,但这是不正确的。 HEAD是你刚刚创建的一个提交,其祖先是upstream/master
,但你的本地主人完全是另一回事,很可能是origin/master
的后代。
那时,可能会发生一些事情:
1)也许你曾想过,“我应该是主人,所以让我git checkout master
来理顺”。所以你检查了主人并将其推向了上游。
2)也许您认为“Git无法弄清楚我想向上游推送哪个分支,所以让我将其添加为可选参数:git push upstream master
。取决于您使用的git版本,以及git config push.default
的值,这可能推动了主人,而不是HEAD,甚至没有检查出来。
如果您仍然处于分离的HEAD状态(在您想要向上游推送的提交中),那么您需要执行以下步骤:
(这个例子假设项目的主要仓库被称为upstream
。通常,当使用github时,项目的主要仓库为upstream
,叉子为origin
。)
1)您需要暂时将当前的主人重命名为其他内容,以便您可以调用此主人:
git branch --force temp-branch master
2)调用当前的HEAD主人:
git branch --force master HEAD
git checkout master
3)强制推新主人:
git push upstream master --force
4)清理并恢复到以前的状态:
git checkout temp-branch
git branch --force master temp-branch
git checkout master
git branch -d temp-branch
如果您已经签出了另一个分支,那么在您按照上述步骤之前,您需要找到该提交。
查看.git/logs/HEAD
- 这是每次HEAD更改时的记录。 grep文件以获取您记住的提交消息的任何部分,在该行中,您将看到2个提交SHA。第一个是你提交之前的那个,第二个是新提交的SHA。结帐第二个回到原来的位置。你将回到独立的HEAD状态,但这一次,你知道它意味着什么。无论你多么糟糕,只要你知道这个SHA,你就可以回到它并重新开始。