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
没有跟踪任何远程分支:
- 推送到任何远程时,您会收到一条错误消息,提示您应该设置上游分支
在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
没有跟踪任何远程分支:- 推送到任何远程时,您会收到一条错误消息,提示您应该设置上游分支