【问题标题】:GitHub keeps saying "This branch is X commits ahead, Y commits behind"GitHub 一直说“这个分支是 X 提前提交,Y 提交落后”
【发布时间】:2017-05-08 03:02:58
【问题描述】:

假设有一个我想要贡献的 GitHub 存储库。 我将该存储库分叉到我的 GitHub 帐户中,然后从我的 PC 帐户中克隆该分叉。很好。

在处理问题之前,我首先想将我的 fork 与“原始”存储库同步。我转到我的帐户分支,单击 New Pull request,确保选择我的作为基础,选择原始主分支作为头叉,我看到了差异(人们在原始存储库中所做的所有提交都不在我的) . 然后我在我的 fork 上创建拉取请求,并将这些更改合并到我的 fork 中。 我去我当地的仓库做一个git pull,我把所有的东西都同步了。很好。

现在问题来了,现在在我的 GitHub 帐户中,它总是说“这个分支是 X 提前提交”,其中“X”是我执行上述同步过程的次数。因此,每次我向原始存储库(不是我的 fork)发出拉取请求时,都表明我正在提交我的代码 plus X 更多提交,这就是我在我的 fork 上所做的合并与原始存储库同步。

当然,我不想将这些更改推送到原始存储库中,因为它们已经有了这些更改,所以我不明白为什么 GitHub 一直对我说我有更改要提交。

我认为这是必须在我的 GitHub 帐户上解决的问题,因为在我的本地存储库中没有任何更改或问题,实际上我什至将其删除并重新克隆。

你有什么想法吗?

【问题讨论】:

标签: git github


【解决方案1】:

如您所料,这些额外的提交很可能是您创建的拉取请求中的合并提交。

将来,有一种更简单的方法可以将您的 fork 与原始存储库同步。在您的本地仓库中,在初始克隆后执行:

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 选项只有在您的提交尚未合并到上游存储库时才需要。)

强制性警告:由于 rebase 会重写历史,这对于在此分支上工作的其他人来说可能是危险/破坏性的。确保你清楚地与任何与你合作的人交流你所做的事情。由于这是个人分叉,我认为这对您来说不是问题。


现在在事后解决您当前的问题。

  1. 如上所述添加上游远程。
  2. 重置您的本地分支以匹配 upstream:

    git checkout master
    git reset --hard upstream/master
    
  3. 如果您在 fork 中创建了任何提交,您可以 cherry-pick 将它们添加到您的更新版本 master。如果您不记得或需要帮助找到它们,例如

    git log --oneline master origin/master
    

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


上面我假设您只使用一个分支master。如果您还没有,我强烈建议您为您处理的每个功能/错误修复创建一个新分支。除了其他好处之外,这还允许您在等待合并较早的 PR 时开始处理另一个功能/错误修复。如果您从不直接提交到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

【讨论】:

  • 哇,这正是我所需要的。特别是你提到的最后一行:git push --force-with-lease origin master # if you have already pushed救了我。谢谢!
  • 最佳答案。后半部分是我一直在寻找的,以使更改反映在其他分支中
  • 我遇到了这个问题,我的 repo 和我尝试了上述步骤,但它们没有帮助。似乎我的代码已更新,但由于某种原因它认为它落后了github.com/OpenPCM/openpcm-server
  • 如果您使用 BitBucket 而不是 Github,那么在创建分叉时它会为您提供同步分叉复选框。这是提供的开箱即用功能,其中所有分叉的分支都由原始存储库中的位桶保持更新。无需我们自己更新 fork 分支。只需使用本地分支方法,不要弄乱 fork 分支。
  • @GSUgambit 你还有这个问题吗?如果是这样,您可能想ask a new question,添加有关您的具体情况的更多详细信息。 (请随时在此处发布指向它的链接,以便我看到它。)
【解决方案2】:

我和你有同样的问题,刚刚解决了这个问题。

解决这个问题:

  1. 将你的本地仓库“重置”到大量提交之前的那一刻

  2. 使用修改后的本地 repo 创建一个新分支

  3. 将此修改后的本地仓库“发布”到您的 github 仓库

  4. 在修改后的本地 repo 中进行您想要 PR 到 github 的更改

  5. '提交'这个本地仓库

  6. '拉'提交到你的 github 仓库

  7. 在你的 github repo 新分支上,向上游 repo 提交 pull request

希望这个答案能有所帮助。

【讨论】:

    【解决方案3】:

    在处理问题之前,我首先想将我的 fork 与“原始”存储库同步。我转到我的帐户分支,点击 New Pull request [...]

    如果你想更新/同步 github 分叉,你应该使用拉取请求。

    拉取请求引入了合并提交,这是您的错误消息的来源。 (拉取请求默认不是fast-forward)。合并提交存在于您的 fork 中,但不存在于源代码库中。

    您不想将他们的分支与您的分支合并...您想更新您的分支以指向与他们的分支相同的提交。您希望分叉之间的分支相同

    您可以通过多种方式做到这一点,最好在其他答案中解释:

    【讨论】:

      猜你喜欢
      • 2021-10-13
      • 2019-10-27
      • 2021-10-20
      • 1970-01-01
      • 2021-06-18
      • 2021-07-05
      • 2014-07-14
      • 1970-01-01
      • 2012-03-02
      相关资源
      最近更新 更多