如何修复被覆盖的存储库?

时间:2016-04-21 18:20:48

标签: git github

我在GitHub上贡献的项目出了点问题。

有一个主要的回购和我的分支,其中包含各种改进,这些改进是WIP,尚未准备好合并回主回购。我也有贡献者访问主回购。但不知何故,Git似乎搞砸了整个事情:

  • 有人做了一个bug报告,我修复了这个bug,主要仓库的代码在我的工作副本中检出。
  • 我在本地提交了代码
  • 我将更改推送到主回购
    • 它给了我一些关于一些荒谬的Git事件的无意义错误,称为“独立头”,所以我查找了如何修复它的说明,并将更改推送到主回购。
  • 突然主回购的主分支与我的主分支相同。我没有在我的分支上工作,我没有告诉它合并我的分支,但这似乎已经发生,主要回购的历史记录中没有说我合并了我的主分支。就像它覆盖分支而不是合并它一样!

有没有人知道发生了什么,以及如何解决它?

1 个答案:

答案 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,你就可以回到它并重新开始。