我知道我可以做git分支——所有,它显示了本地和远程分支,但它在显示它们之间的关系时并不是那么有用。

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


当前回答

我用这个别名

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'

then

git track

其他回答

Git配置:get-regexp "branch\.$current_branch\.remote"

会告诉你被跟踪的遥控器的名字吗

Git配置: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"

Git远程显示来源

将“origin”替换为遥控器的任何名称。

kubi的另一个答案是看一下.git/config文件,它显示了本地存储库的配置:

油漆git -配置。

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

将为每个本地分支显示一行。一个跟踪分支看起来像这样:

master <- origin/master

一个非跟踪的是这样的:

test <- 

根据奥利维尔·雷法洛的回答

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上有更详细的版本