首页 文章

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

提问于
浏览
649

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

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

10 回答

  • 893

    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"
    
  • 33

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

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

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

    git branch -vv   # doubly verbose!
    

    请注意,使用git 1.8.3,该上游分支显示在 blue 中(参见“What is this branch tracking (if anything) in git?”)


    如果你想要干净的输出,请参阅arcresu's answer - 它使用了一个瓷器命令,我更加简洁,并且可以使用为rebase配置的分支,而不仅仅是合并 .

  • 73

    git remote show origin

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

  • 1

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

    <branchname> @ ,例如master @ ,@ 后缀@ 到一个branchname(简短形式<branchname> @ )指的是由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
    # ...
    

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

  • 30

    我用这个别名

    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
    
  • 78
    git for-each-ref --format='%(refname:short) <- %(upstream:short)' refs/heads
    

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

    master <- origin/master
    

    非跟踪的看起来像:

    test <-
    
  • 14

    基于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的更详细的版本

  • 6

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

    % 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,这是一个略有不同的问题,被错误地标记为重复 .

  • 197

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

    cat .git/config

相关问题