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

时间:2011-02-09 21:30:46

标签: git

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

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

11 个答案:

答案 0 :(得分:969)

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

git branch -vv   # doubly verbose!

请注意,使用git 1.8.3,该上游分支以蓝色显示(请参阅“What is this branch tracking (if anything) in git?”)


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

答案 1 :(得分:214)

git remote show origin

将“原点”替换为遥控器的名称。

答案 2 :(得分:90)

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

  

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

     

后缀@{upstream}到分支机构(简称   <branchname>@{u})指的是分支指定的分支   branchname将建立在之上。缺少branchname默认值   到现在的。

因此,要找到分支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
# ...

这比手动解析引用和配置更简洁。

答案 3 :(得分:76)

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

cat .git/config

答案 4 :(得分:36)

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

% 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

答案也是here,这是一个稍微不同的问题,被错误地标记为重复。

答案 5 :(得分:34)

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

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

master <- origin/master

非追踪者将如下所示:

test <- 

答案 6 :(得分:14)

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

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

答案 7 :(得分: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

答案 8 :(得分:3)

基于Olivier Refalo's answer

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

上更详细的版本

答案 9 :(得分: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"

答案 10 :(得分:1)

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