我知道我可以做git分支——所有,它显示了本地和远程分支,但它在显示它们之间的关系时并不是那么有用。
如何以显示哪个本地分支正在跟踪哪个远程的方式列出分支?
我知道我可以做git分支——所有,它显示了本地和远程分支,但它在显示它们之间的关系时并不是那么有用。
如何以显示哪个本地分支正在跟踪哪个远程的方式列出分支?
当前回答
如果你查看git-rev-parse的手册页,你会看到下面描述的语法:
<branchname>@{upstream},例如master@{upstream}, @{u} 分支名的后缀@{upstream} <branchname>@{u})指由指定的分支所指定的分支 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
# ...
这比手动解析引用和配置更简洁。
其他回答
对于当前的分支,这里有两个不错的选择:
% git rev-parse --abbrev-ref --symbolic-full-name @{u}
origin/mainline
or
% git for-each-ref --format='%(upstream:short)' $(git symbolic-ref -q HEAD)
origin/mainline
答案也在这里,对一个稍微不同的问题,被(错误地)标记为重复。
这里有一个简洁的例子。可以检查git remote -v,它会显示当前分支的所有起源和上游。
我用这个别名
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 checkout (w/o任何分支)。如果存在当前分支的跟踪信息,这是一个没有副作用的操作。
$ git checkout
Your branch is up-to-date with 'origin/master'.
如果你查看git-rev-parse的手册页,你会看到下面描述的语法:
<branchname>@{upstream},例如master@{upstream}, @{u} 分支名的后缀@{upstream} <branchname>@{u})指由指定的分支所指定的分支 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
# ...
这比手动解析引用和配置更简洁。