有没有办法设置我的分支,以便默认情况下发生这种情况?
否:每个分支您只能获得一个“上游”或 @{u} 设置(如果您愿意,您可以设置一个带有 no 上游设置的分支,但您的另一个选项是 one 上游)。 git fetch 从这个上游的远程获取,git merge 与这个上游命名的分支合并(和往常一样,git pull 本质上等于 fetch + merge); git push 推...好吧,现在事情变得复杂了。
有没有办法设置我的存储库,以便默认情况下发生这种情况?
是的,但有一个缺陷。这个缺陷有多大取决于您的使用和需求。使用(和配置)这个缺陷非常复杂。让我们来看看这些项目。
每个本地分支只能有一个上游,但是:
- 上游命名两个部分。一个是远程,例如
origin 或upstream;另一个是 merge,例如 refs/heads/master。
例如,这些组合起来形成origin/master。因此,无论 anything 是否为 origin,我们都无法将默认上游设置为 origin/master 和 <em>anything</em>/my-new-branch。
但是:
- 您可以将 Git 配置为“三角工作流”,通过为任何一个给定的远程设置 两个 URL,您可以从一个 URL 获取但推送到另一个 URL。
这意味着您可以制作一些遥控器,我们将其命名为tri 用于三角形,从您拥有的origin 的URL 获取并推送到您拥有的upstream 的URL。如果分支B 有tri 作为它的远程,并且tri 从与origin 相同的URL 中获取,但推送到与upstream 相同的URL,那么您实际上将获取从origin 推送到upstream。
不过,对于 refs/remotes/tri/master 的含义,您的 Git 会有些困惑。。如果是表单的推送:
git push tri somebranch:master
成功了,您的 Git 现在认为 refs/remotes/tri/master 具有您刚刚推送的相同哈希值。你的 Git 认为:好吧,当然!我在tri 下打电话的那个人说他接受了! 一旦你运行git fetch tri,你会得到一些其他的哈希值,你的Git 会修复它以再次记住与origin 相同的URL 上的内容.你的 Git 认为:嗯,这很有趣,我打电话给 tri 的那个人说他已经重置了他的 master。哦,好吧,那是你的另一个 Git,一直在重置他的 master...
此外,当您运行 git push tri 或 git push 并隐含 tri,但在命令行上没有 refspec 参数时......嗯,这来自 the git push documentation:
如果 git push [<repository>] 没有任何 <refspec> 参数
设置为使用<src> 更新目的地的一些参考
remote.<repository>.push配置变量,:<dst>部分可以
省略——这样的推送将更新<src> 通常更新的引用
在命令行上没有任何<refspec>。否则,失踪
:<dst> 表示更新与<src> 相同的引用。
这意味着您可以设置一个特殊的remote.tri.push 配置,以便git push tri 不命名源,或git push tri somebranch 不命名:<dst>,您可以在此处使somebranch 映射到somebranch,即使你被允许为somebranch 说master 的一个上游设置。
把这些放在一起
- 你只会得到一个
@{u}。
- 但是
@{u} 有两部分,remote 和 merge。
- 您的
@{u} 可以命名一个具有两个 URL 的特殊遥控器:一个用于获取,另一个用于推送。
- 这个遥控器还可以有一个
remote.<em>remote</em>.pushdefault,它会强制推送:dst 部分使用与提取的merge 设置不同的名称。 (最后一点我们称之为 pushtarget。)
- 副作用是远程跟踪分支
<em>specialremote/pushtarget</em> 会出错,直到您运行git fetch <em>specialremote</em>。这会让事情变得混乱,就好像它们还没有因为上述所有原因而变得混乱。
如果你问我这样做是否是一个好主意,我会说:绝对不是。