Git 如何检测工作流类型:集中或非集中

How does Git detect type of workflows: central or non-central

Git-config中可以看到:

simple - in centralized workflow, work like upstream with an added safety to refuse to push if the upstream branch’s name is different from the local one.

When pushing to a remote that is different from the remote you normally pull from, work as current.

所以 Git 必须决定是像 upstream 还是像 current 那样工作。但是 Git 如何检测工作流类型?如果理解我们想要与 bare 存储库通信,Git 是否认为工作流是 centralized

您链接的同一文档中对 upstream 的描述为您提供了问题的答案。

This mode only makes sense if you are pushing to the same repository you would normally pull from (i.e. central workflow).

所以这里的"central workflow"定义为"you push to the same repo you get your latest upstream changes from usually",不管你是用rebase还是merge。 (pull = fetch+merge 或 fetch+rebase,取决于配置和参数)

无论您是否有 "central workflow",在此上下文中对于每个推送调用都可能不同。如果您为要推送的本地分支设置了远程跟踪分支(上游分支),那么此跟踪分支通常是您从中获取更新的地方(它是您跟踪的分支),因此如果您进行变基或合并(或者当然是拉,因为它是 fetch+merge 或 fetch+pull)没有指定要变基的内容或要合并的内容,然后使用远程跟踪分支。

现在,如果您推送,Git 知道您是否推送到您已设置为要推送的本地分支的跟踪分支的同一远程分支。如果匹配,则在此上下文中定义为 "central workflow" 并使用 upstream,如果不匹配或未设置跟踪分支(也是 "not" 的情况),current 被使用。

区别是:

当前

  • 您的本地分支 foo 跟踪远程分支 bar/baz
    • 在推送到任何远程时,如果您不另行说明,则推送到分支 foo
  • 您的本地分支 foo 跟踪远程分支 bar/foo
    • 在推送到任何远程时,如果您不另行说明,则推送到分支 foo
  • 您的本地分支 foo 没有跟踪任何远程分支:
    • 在推送到任何远程时,如果您不另行说明,则推送到分支 foo

上游

  • 您的本地分支 foo 跟踪远程分支 bar/baz
    • 在推送到远程 bar 时,如果您不另行说明,则推送到分支 baz
    • 在推送到任何其他遥控器时,您会收到一条错误消息,提示您应该准确指定推送到的位置,因为遥控器不是上游遥控器
  • 您的本地分支 foo 跟踪远程分支 bar/foo
    • 在推送到远程 bar 时,如果您不另行说明,则推送到分支 foo
    • 在推送到任何其他遥控器时,您会收到一条错误消息,提示您应该准确指定推送到的位置,因为遥控器不是上游遥控器
  • 您的本地分支 foo 没有跟踪任何远程分支:
    • 推送到任何远程时,您会收到一条错误消息,提示您应该设置上游分支

简单:

  • 您的本地分支 foo 跟踪远程分支 bar/baz
    • 在推送到远程 bar 时,您会收到一条错误消息,提示您明确推送,因为名称不匹配
    • 在推送到任何其他远程时,您推送到分支 foo
  • 您的本地分支 foo 跟踪远程分支 bar/foo
    • 在推送到任何远程时,如果您不另行说明,则推送到分支 foo
  • 您的本地分支 foo 没有跟踪任何远程分支:
    • 推送到任何远程时,您会收到一条错误消息,提示您应该设置上游分支