如何查看哪些git分支正在跟踪哪个远程/上游分支?

joa*_*him 771 git

我知道我可以这样做git branch --all,这向我展示了本地和远程分支,但是向我展示它们之间的关系并没有那么有用.

如何以显示哪个本地分支正在跟踪哪个远程的方式列出分支?

Cas*_*bel 1057

非常多的瓷器命令,如果你想要这个脚本,那就不好了:

git branch -vv   # doubly verbose!
Run Code Online (Sandbox Code Playgroud)

请注意,对于git 1.8.3,该上游分支以蓝色显示(请参阅git中的 " 这个分支跟踪(如果有的话)是什么? ")


如果你想要干净的输出,请参阅arcresu的答案 - 它使用了我最初写这个答案时我不相信的瓷器命令,所以它更简洁,适用于为rebase配置的分支,而不仅仅是合并.

  • 上面的第一种方法并没有为我提供所需的信息.第二个...似乎有点矫枉过正,尤其是因为Kubi的回答有效.我错过了什么吗? (3认同)
  • @garyp你不是那个问这个问题的人.第一个提供了OP需要的内容,第二个提供了*正确*他需要的内容,以防他想要以干净的形式编写脚本,或者只想将其保存为别名.("矫枉过正"如果能得到你想要的东西就好了,你不必重复它.)从这个问题的角度来看,kubi的答案提供了一些无关的信息,如果有多个遥控器,它就不会不显示一切,但如果它满足您的需求,一定要使用它. (3认同)
  • 我很抱歉。当我最初运行第一种方法时,我没有得到关于跟踪什么的信息,我应该明确指出。但是现在我看到了跟踪信息,因此我的设置一定有问题。所以我*缺少了一些东西。 (2认同)
  • FWIW我很困惑,因为-v和-vv显示了类似的输出。跟踪的分支在散列之后和最近一次提交之前(在我的默认OSX Homebrew安装中)显示在方括号中。 (2认同)
  • 对我来说,这一切都是打印出每个分支的最后提交哈希和注释。 (2认同)
  • `git branch -vv` 还在 git 2.16 上工作吗?当我运行该命令时,它只列出分支名称,后跟一个简短的 SHA1 及其最后一次提交的注释 (2认同)

kub*_*ubi 239

git remote show origin

将"原点"替换为遥控器的名称.

  • @pvandenberk即使离线,您也可以使用`git remote show -n origin`来获取一些信息.从[git remote documentation](http://git-scm.com/docs/git-remote):"使用-n选项,首先不使用git ls-remote <name>查询远程磁头;缓存的信息是用来代替." (16认同)
  • 即使这个瓷器命令对人类有用(对于脚本来说不是那么多,因为它必须解析瓷器输出),我不喜欢这种方法是`git remote show`命令实际连接到远程回购...因此,如果您碰巧离线或因任何原因无法连接到回购,它就会失败... (10认同)
  • 这个命令有一个奇怪的事情:它将远程分支列为"跟踪",即使没有为拉/推配置本地分支.我总觉得这令人困惑.我实际上并不清楚"跟踪"在这个输出中应该是什么意思.[关于这个问题的git文档](http://git-scm.com/book/en/v2/Git-Branching-Remote-Branches#Tracking-Branches)使它听起来像只有当远程分支被"跟踪"时它被链接/绑定到本地分支以进行推/拉... (5认同)
  • @jolvi您可以运行`git remote show |。xargs git remote show -n`查看所有遥控器的组合跟踪信息。 (2认同)

Car*_*ter 96

如果您查看手册页git-rev-parse,您将看到描述以下语法:

<branchname>@{upstream},例如master@{upstream},@{u}

@{upstream}branchname(简短形式 <branchname>@{u})的后缀是指由branchname指定的分支设置为在其上构建的分支.缺少的branchname默认为当前的.

因此,要找到分支的上游master,您可以:

git rev-parse --abbrev-ref master@{upstream}
# => origin/master
Run Code Online (Sandbox Code Playgroud)

要打印出每个分支的信息,您可以执行以下操作:

while read branch; do
  upstream=$(git rev-parse --abbrev-ref $branch@{upstream} 2>/dev/null)
  if [[ $? == 0 ]]; then
    echo $branch tracks $upstream
  else
    echo $branch has no upstream configured
  fi
done < <(git for-each-ref --format='%(refname:short)' refs/heads/*)

# Output:
# master tracks origin/master
# ...
Run Code Online (Sandbox Code Playgroud)

这比手动解析refs和config更干净.

  • 对于我们这些使用git-flow的人,使用名为"feature/blahblah"的分支,while循环的结束语句应为:`done <<(git for-each-ref --format ='%(refname:short) 'refs/heads/**)`注意在glob模式末尾的**两个**星号. (2认同)
  • git rev-parse --abbrev-ref HEAD @ {upstream}`对于当前分支似乎工作得很好。它还为git提供了一个很好的别名。 (2认同)

Abi*_*ern 78

kubi回答的另一种方法是查看.git/config显示本地存储库配置的文件:

cat .git/config

  • 还有`git config --get-regex branch` (5认同)
  • 或者,更具体地说,'git config --get-regexp branch.*merge' (5认同)

cdu*_*001 37

对于当前的分支,这里有两个不错的选择:

% git rev-parse --abbrev-ref --symbolic-full-name @{u}
origin/mainline
Run Code Online (Sandbox Code Playgroud)

要么

% git for-each-ref --format='%(upstream:short)' $(git symbolic-ref -q HEAD)
origin/mainline
Run Code Online (Sandbox Code Playgroud)

这个答案也在这里,一个稍微不同的问题被错误地标记为重复.

  • 基于此,所有分支都可以以脚本友好的方式列出:`git for-each-ref --shell --format ='%(refname:short)%(upstream:short)'refs/heads`. (5认同)

Aur*_*ien 36

git for-each-ref --format='%(refname:short) <- %(upstream:short)' refs/heads
Run Code Online (Sandbox Code Playgroud)

将为每个本地分支显示一行.跟踪分支将如下所示:

master <- origin/master
Run Code Online (Sandbox Code Playgroud)

非跟踪的看起来像:

test <- 
Run Code Online (Sandbox Code Playgroud)


Eug*_*ash 15

对于当前分支,您也可以说git checkout(没有任何分支).这是一个带有副作用的无操作,用于显示当前分支的跟踪信息(如果存在).

$ git checkout 
Your branch is up-to-date with 'origin/master'.
Run Code Online (Sandbox Code Playgroud)

  • 你可能会不小心输入任何内容,真的。 (4认同)

MJe*_*emy 7

这是一个整洁而简单的。可以检查git remote -v,它会显示当前分支的所有来源和上游。


Oli*_*alo 6

我用这个别名

git config --global alias.track '!f() { ([ $# -eq 2 ] && ( echo "Setting tracking for branch " $1 " -> " $2;git branch --set-upstream $1 $2; ) || ( git for-each-ref --format="local: %(refname:short) <--sync--> remote: %(upstream:short)" refs/heads && echo --Remotes && git remote -v)); }; f'
Run Code Online (Sandbox Code Playgroud)

然后

git track
Run Code Online (Sandbox Code Playgroud)

  • 我认为值得注意的是,使用两个参数,您的命令会配置一个轨道分支. (5认同)
  • 请添加该命令的作用以及如何使用它的说明。 (2认同)