GitHub一直显示“此分支超前X次提交,落后Y次提交”

105
假设有一个GitHub仓库,我想要做出贡献,因此将该仓库fork到我的GitHub账户中,并从我的PC上通过我的账户克隆该分支。在处理问题之前,我首先希望将我的分支与“原始”仓库同步。我转到我的账户分支,点击“新的拉取请求”,确保我选择我的账户作为基础和原始主分支作为头部分支,然后查看差异(所有人在原始仓库中进行的提交,而这些提交不在我的仓库中)。 然后我在我的分支中创建拉取请求,并将这些更改合并到我的分支中。接着我回到本地的repo并执行git pull,实现了所有内容的同步。 但是现在问题来了,在我的GitHub账户中,总是显示“This branch is X commits ahead”,其中'X'是我执行上述同步过程的次数。因此,每当我向原始仓库(而不是我的分支)发起拉取请求时,都会显示我正在提交我的代码以及 X个以上的提交,这些提交是我在我的分支中执行的用于同步原始仓库的合并操作。 当然,我不想将这些更改推送到原始仓库中,因为它们已经存在于那里,所以我不明白为什么GitHub仍然告诉我需要提交更改。 我认为这是需要在我的GitHub账户上解决的问题,因为在我的本地仓库中没有任何更改或问题,实际上我甚至将其删除并重新克隆了一遍。 您有什么想法吗?

要了解 ahead/behind 数字的来处并在本地 git 中如何复制它们,请参见 github - git ahead/behind info between master and branch? - Stack Overflow - nealmcb
3个回答

166

就像你猜的那样,这些额外的提交很可能是由你创建的拉取请求的合并提交。

在未来,有一种更简单的方法可以将你的派生库与原始仓库同步。在本地仓库中,在初始克隆之后执行以下操作:

git remote add upstream https://github.com/upstream/repo.git

然后,每当您想要同步上游的更改时,请执行:

git pull --rebase upstream master
git push --force-with-lease origin master

如果您有尚未合并到上游存储库中的提交,那么只有使用--rebase--force-with-lease选项才是必要的。

必要的警告:由于变基会重写历史记录,因此这可能对其他人在该分支上工作造成危险/干扰。确保您清楚地向任何正在与您协作的人说明您已经完成了什么。由于这是个人派生版本,我假设这对您不是问题。


现在来解决您当前的问题。

  1. 按上述方法添加上游远程分支。
  2. 将您的本地分支重置为与upstream匹配:

    git checkout master
    git reset --hard upstream/master
    
  3. 如果您在分支中创建了任何提交,可以将它们 cherry-pick 到更新版本的 master 中。如果您不记得或需要帮助查找它们,可以使用以下命令:

    git log --oneline master origin/master
    

    如果您并未使用多个分支,请注意以下假设我只考虑了一个名为 master 的分支。如果您还没有这样做,我强烈建议您为每个功能 / Bug 修复创建一个新的分支。这样做有很多好处之一是,即使等待先前的 pull request 合并,也可以开始其他功能 / Bug 修复的工作。如果您从不直接提交到 master,则可以在不使用 --rebase--force-with-lease 的情况下同步:

    应该向您显示任何不在上游的提交。

    git checkout master
    git pull upstream master
    git push origin master
    

    如果您在更新了 master 后需要更新功能分支,请执行以下操作:

    git checkout myfeature
    git rebase master
    git push --force-with-lease origin myfeature # if you have already pushed
    

5
哇,这正是我所需要的。特别是你提到的最后一行:git push --force-with-lease origin master # if you have already pushed救了我一命。谢谢! - Fernando Garcia
4
最佳答案。第三部分是我寻找的,以便更改能够在其他分支中体现出来。 - Ishan Srivastava
我遇到了这个问题,我尝试了上面的步骤,但它们没有帮助。似乎我的代码已经更新,但由于某种原因它认为它落后了。https://github.com/OpenPCM/openpcm-server - GSUgambit
@GSUgambit,您还遇到这个问题吗?如果是的话,您可能需要提出一个新问题,并添加有关您特定情况的更多详细信息。(随时在此处发布链接,以便我能看到它。) - Scott Weldon
3
为什么这个“更容易的同步方式”需要这么多步骤,包括从本地仓库拉取和推送内容? - user7860670
显示剩余4条评论

2
在解决问题之前,我首先想要将我的fork与“原始”存储库同步。我进入我的账户fork,点击“New Pull request”[...] 如果您想要更新/同步github forks,不应该使用Pull Request。 Pull Requests会引入合并提交,这是您的错误消息的来源。(默认情况下,Pull Requests不是fast-forward)。合并提交存在于您的fork中,但不存在于源存储库中。 你不想用他们的分支来合并你的分支……你想要将你的分支更新到指向与他们的分支相同的提交。你希望fork之间的分支相同。 您可以以多种方式实现此目标,最好在其他答案中进行解释:

1

我和你一样遇到了同样的问题,并且已经解决了这个问题。

解决方法如下:

  1. 将本地仓库“重置”到多余提交之前的时刻

  2. 使用这个更改过的本地仓库创建一个新的分支

  3. 将这个更改过的本地仓库“发布”到您的github仓库

  4. 在更改后要向github请求合并的本地仓库中进行更改

  5. “提交”这个本地仓库

  6. 将提交拉取到您的github仓库中

  7. 在您的github仓库新分支上,向上游仓库提交拉取请求

希望这个答案能够帮到您。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接