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


Answers:


1142

非常像瓷器命令,如果您希望使用它来编写脚本,则不好用:

git branch -vv   # doubly verbose!

请注意,在git 1.8.3中,该上游分支显示为蓝色(请参阅“ git中的该分支跟踪是什么(如果有)? ”)


如果您想要干净的输出,请参阅arcresu的答案 -它使用的瓷器命令在我最初编写此答案时不存在,因此它更为简洁,可与配置用于重新设置基准的分支一起使用,而不仅仅是合并。


3
上面的第一种方法没有为我提供所需的信息。第二个...似乎有点过分,尤其是自从Kubi的答案起作用以来。我想念什么吗?
加里普

3
@garyp你不是问这个问题的人。首先需要提供什么OP,第二提供准确,他需要什么,如果他想在一个干净的形式编写脚本,或想只是将它保存为一个别名。(“ Overkill”可以让您得到想要的东西,而不必重复。)从这个问题的角度来看,kubi的答案提供了一些无关的信息,并且如果有多个遥控器,它不会不会显示所有内容,但是如果满足您的需求,则一定要使用它。
卡斯卡贝尔2012年

2
我很抱歉。当我最初运行第一种方法时,我没有任何信息跟踪什么,我应该明确指出。但是现在我看到了跟踪信息,因此我的设置一定有问题。所以,我失去了一些东西。
加里普

2
FWIW我很困惑,因为-v和-vv显示了类似的输出。跟踪的分支在哈希表之后和最近一次提交之前(在我的默认OSX Homebrew安装中)显示在方括号中。
jerclarke 2012年

3
对我来说,这一切都是打印出每个分支的最后提交哈希和注释。
capybaralet 2015年

263

git remote show origin

用您的遥控器名称替换“ origin”。


11
即使这个瓷器命令有点对人类有用(对于脚本来说并没有那么多,因为它必须解析瓷器输出),但我对这种方法不满意的是该git remote show命令实际上连接到远程仓库...因此,如果您由于任何原因而脱机或无法连接到回购协议,则它将失败……
pvandenberk

17
@pvandenberk git remote show -n origin即使离线也可以用来获取一些信息。从git远程文档中:“使用-n选项,首先不使用git ls-remote <name>查询远程头;而是使用缓存的信息。”
Cerran 2014年

5
关于此命令的一件奇怪的事:即使没有为拉/推配置本地分支,它也将远程分支列为“已跟踪”。我总是觉得这很混乱。我实际上不清楚在此输出中“跟踪”的含义。关于这个主题的git docs听起来只有在链接/绑定到本地分支以进行推/拉时才听起来像“跟踪”了远程分支……
Hawkeye Parker

问题是,我需要为所有远程名称调用此名称,直到看到我真正想要的东西为止。
jolvi '16

2
@jolvi您可以运行git remote show | xargs git remote show -n以查看所有遥控器的组合跟踪信息。
Synoli

107

如果查看的手册页git-rev-parse,将会看到以下语法说明:

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

分支名称的后缀@{upstream}(缩写形式 <branchname>@{u})是指由分支名称指定的分支设置为在其顶部构建的分支。缺少的分支名称默认为当前分支名称。

因此,要找到分支的上游master,您可以执行以下操作:

git rev-parse --abbrev-ref master@{upstream}
# => origin/master

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

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
# ...

这比手动解析引用和配置干净。


尽管找到它,我还是无法理解rev-parse中的内容,因此感谢您的明确解释!
爱丽丝·珀赛尔

3
对于那些使用git-flow且分支名为“ feature / blahblah”的用户,while循环的关闭语句应显示为:done < <(git for-each-ref --format='%(refname:short)' refs/heads/**)注意glob模式末尾的两个星号。
markeissler

2
git rev-parse --abbrev-ref HEAD@{upstream}对于当前分支似乎运行良好。它还为git提供了一个很好的别名。
Digikata '17

while循环语法看起来有点怪我。您可以使用git for-each-ref ... | while read branch; do ...不需要FIFO并以与编写命令相同的顺序运行的方法。
丹尼尔·伯默(DanielBöhmer)'18年

至少从git 2.5.1开始,您有了git for-each-ref --format='%(refname:short) tracks %(upstream:short)' refs/heads/*
Mat M的

81

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

cat .git/config


6
git config --get-regex branch
塔米尔丹妮

6
或者,更具体地讲,“混帐配置--get-正则表达式的分支合并*”
YOYO

41
git for-each-ref --format='%(refname:short) <- %(upstream:short)' refs/heads

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

master <- origin/master

非跟踪的代码如下所示:

test <- 

不错,添加一些排序和TAB床输出:git for-each-ref --sort上游--format ='%(refname:short)%09 <-%(upstream:short)'refs / heads
dimir

简洁精美,输出实际上比接受的可读性高git branch -vv。🙏
条既纳

唯一的问题是我不记得了,所以我用了git config --global alias.track 'for-each-ref --format='\''%(refname:short) <- %(upstream:short)'\'' refs/heads'
joki

38

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

% git rev-parse --abbrev-ref --symbolic-full-name @{u}
origin/mainline

要么

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

这个答案也在这里,是一个稍有不同的问题(被错误地标记为重复)。


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

15

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

$ git checkout 
Your branch is up-to-date with 'origin/master'.

足够公平,但是您可能会偶然键入git checkout .,这不是禁忌。
Tomasz Gandor

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'

然后

git track

5
我认为值得注意的是,您的命令使用两个参数配置了一个跟踪分支。
albfan 2012年

3

基于Olivier Refalo的回答

if [ $# -eq 2 ] 
then
    echo "Setting tracking for branch " $1 " -> " $2
    git branch --set-upstream $1 $2
else
    echo "-- Local --" 
    git for-each-ref --shell --format="[ %(upstream:short) != '' ] && echo -e '\t%(refname:short) <--> %(upstream:short)'" refs/heads | sh
    echo "-- Remote --" 
    REMOTES=$(git remote -v) 
    if [ "$REMOTES" != '' ]
    then
        echo $REMOTES
    fi  
fi

它仅显示配置了轨道的本地。

将其写在路径上名为git-track的脚本上,您将获得git track命令

https://github.com/albfan/git-showupstream上的详细版本


1

git config --get-regexp "branch\.$current_branch\.remote"

将为您提供被跟踪的遥控器的名称

git config --get-regexp "branch\.$current_branch\.merge"

将为您提供被跟踪的远程分支的名称。

您需要将$ current_branch替换为当前分支的名称。您可以通过以下方式动态获取git rev-parse --abbrev-ref HEAD

以下迷你脚本结合了这些内容。将其粘贴到名为的文件中git-tracking,使其可执行,并确保它在您的路径中。

那你可以说

$ git  tracking
<current_branch_name>-><remote_repo_name>/<remote_branch_name>

请注意,远程分支名称可以与本地分支名称不同(尽管通常没有)。例如:

$git tracking 
xxx_xls_xslx_thing -> origin/totally_bogus

如您在代码中看到的那样,关键是从git配置中提取数据。我只是使用sed清除了多余的数据。

#!/bin/sh

current_branch=$(git rev-parse --abbrev-ref HEAD)
remote=$(git config --get-regexp "branch\.$current_branch\.remote" | sed -e "s/^.* //")
remote_branch=$(git config --get-regexp "branch\.$current_branch\.merge" | \
  sed -e "s/^.* //" -e "s/refs\/.*\///")

echo "$current_branch -> $remote/$remote_branch"

1

这是一个简洁明了的。可以检查git remote -v,显示您当前分支的所有来源和上游。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.