为什么拉取请求会导致分叉落后于上游?

Why does a pull request result in the fork being behind the upstream?

假设有一个名为 upstream/project 的 GitHub 存储库。假设我有一个名为 fork/project 的分支。我对 fork/project 进行了一些更改,并向 upstream/project 发起了拉取请求。接受拉取请求后,为什么 fork/project 变成 upstream/project 后面的 1 个提交?

上游存储库中的代码现在与我的分支中的代码匹配。为什么我必须再次从上游回购中拉取以结束相同的状态?上游存储库不能与分叉完全同步,而不是 "overshooting" 它吗?

我希望得到一个答案,解释该系统提供的优势或要求该工作流程的限制,无论哪种情况。谢谢!

正如 SLaks 在评论中所暗示的那样,不同之处在于 upstream/project 上的合并提交。

当您的拉取请求被接受时,分支被合并并在 upstream/project 上进行提交,但是 fork/project 在您再次从上游拉取之前不知道这一点。

当您拉取时,fork/project 首先获取新的提交,然后只是快进而不需要合并。只有 then 两棵树相同。

关于攻略:

非常广泛的情况是,由于所有合并提交,合并策略(此处讨论)在树结构方面更加嘈杂且有点笨拙。另一方面,变基策略更精简但也更棘手,如果人们不小心使用它,就会遇到令人讨厌的情况。

要进一步了解 "strategy" 部分,已经有很多比较优秀的答案,只需按照 "merge/rebase debate".

搜索即可

I'm hoping for an answer that explains either the advantage that this system provides or the limitation that demands this workflow, whichever the case may be.

如果您真正要问的是:

why did upstream not merge with fast-forward?

Merge-commit/no-fast-forward 策略对于合并 PR 非常有用,因为它允许 reverting 只需一步更改(因为只有一个提交,不管有多少提交原始分支)。仅此一项就足以使其成为首选策略。