1

Git-config中,您可以看到:

简单 - 在集中式工作流程中,如果上游分支的名称与本地分支的名称不同,则可以像上游一样工作,并增加安全性以拒绝推送。

当推送到与您通常从中拉出的遥控器不同的遥控器时,作为当前工作。

所以Git必须在喜欢upstream或工作之间做出决定current。但是如何Git检测工作流的类型?如果理解我们想要与存储库通信,是否Git认为工作流是?centralizedbare

4

1 回答 1

6

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

仅当您推送到您通常会从中提取的同一存储库(即中央工作流程)时,此模式才有意义。

因此,在这种情况下,“中央工作流程”被定义为“您推送到通常从中获取最新上游更改的同一个仓库”,无论您使用 rebase 还是 merge。(pull = fetch+merge 或 fetch+rebase,取决于配置和参数)

无论您是否有“中央工作流程”,在这种情况下,每个推送调用都可能不同。如果您为要推送的本地分支设置了远程跟踪分支(上游分支),那么此跟踪分支是您通常从中获取更新的地方(它是您跟踪的分支),因此如果您执行变基或合并(或者当然是拉,因为它是 fetch+merge 或 fetch+pull)而不指定要重新定位到什么或要合并到什么,然后使用远程跟踪分支。

现在,如果您推送,Git 会知道您是否推送到同一远程的同一分支,该远程已设置为跟踪分支,用于将要推送的本地分支。如果匹配,则在此上下文中定义为“中央工作流”并upstream使用,如果没有或没有设置跟踪分支(也是“不”的情况),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不跟踪任何远程分支:
    • 在推送到任何远程时,您会收到一条错误消息,提示您应该设置上游分支
于 2016-05-09T18:32:47.887 回答