如何在 git 别名中引用远程存储库?

How to reference remote repositories in a git alias?

如何引用 git 别名来对名为 "origin" 的远程存储库上的等效跟踪分支执行操作?例如,如果我在本地仓库的 "foo" 分支上,并且我想 运行 一个通常默认为我的 "origin/foo" 分支的命令,我该怎么做?

这是一个具体的例子:

我想查看来自我的 "origin/foo" 分支的传入提交,我在本地 "foo" 分支上。为此,我会 运行 git fetch && git log --pretty=oneline --abbrev-commit ..origin/foo。因此,我设置了一个 git incoming 别名,如下所示:

[alias]
    incoming = !git fetch && git log --pretty=oneline --abbrev-commit ..@{u}

但是,此别名被解释为 git fetch && git log --pretty=oneline --abbrev-commit ..upstream/foo,其中 @{u} 是上游远程上等效分支的替代。我想执行相同的命令,但在 origin 远程的等效分支上。我怎样才能做到这一点?我尝试了 @{o},但这不起作用,而且我在 git 别名文档中的任何地方都找不到此语法。我从@sschuberth 在 this answer 中的评论中得出我的答案,但我没有找到其他文档。

更新 我找到了一个接近的解决方案,但它使用 bash 参数而不是 git 别名:

incoming = !git fetch && git log --pretty=oneline --abbrev-commit ..

这里的缺点是我无法利用 git 提供的自动完成功能,它不会自动将我的本地分支与远程 origin 存储库的分支进行比较。

请注意,据我所知 Git still does not properly support a "triangular" workflow 你从 "upstream" 远程拉取,应用你的更改,然后推送到 "origin" 远程(这是你的分支上游项目)。 Git 的维护者 Junio 说

Note that even in a triangular workflow,  <at> {u} should still refer to
the place you integrate with, i.e. your "upstream", not to the place
you push to publish the result of your work.

每个本地分支只能有一个远程跟踪分支,并且要么是 upstream 中的相应分支,要么是 origin 中的相应分支。 @{u} 指向配置为远程跟踪分支的任何内容,与语义上这是您的上游项目还是分叉项目无关。令人困惑的是,Git 文档将 @{u} 称为 "upstream" 的 shorthand,但实际上它大部分时间指向的通常是 "origin"。

长话短说,要让 @{u} 像您希望的那样工作,您需要将本地分支 foo 的远程跟踪分支从 upstream/foo 更改为 origin/foo 使用git branch --set-upstream-to origin/foo.

编辑: 如果您喜欢冒险,您也可以尝试使用 Felipe Contreras' fork of Git which adds the concept of a "publish" tracking branch.