我知道我可以做git branch --all,这向我展示了本地和远程分支,但它在向我展示它们之间的关系方面没有那么有用。
git branch --all
如何以显示哪个本地分支正在跟踪哪个远程的方式列出分支?
git remote show origin
将“起源”替换为您遥控器的名称。
kubi答案的另一种选择是查看.git/config文件,该文件显示了本地存储库配置:
.git/config
cat .git/config
非常瓷器命令,如果你想用它来编写脚本,那就不好了:
git branch -vv # doubly verbose!
请注意,在git 1.8.3中,上游分支显示在蓝色中(参见“git中的这个分支跟踪(如果有的话)是什么?”)
如果你想要干净的输出,请参阅卡尔·苏斯特的回答——它使用了一个我认为在我最初编写这个答案时不存在的瓷命令,所以它更简洁一些,并且适用于配置为rebase的分支,而不仅仅是合并。
我用这个化名
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
基于奥利维尔·雷法罗的回答
if [ $# -eq 2 ]thenecho "Setting tracking for branch " $1 " -> " $2git branch --set-upstream $1 $2elseecho "-- Local --"git for-each-ref --shell --format="[ %(upstream:short) != '' ] && echo -e '\t%(refname:short) <--> %(upstream:short)'" refs/heads | shecho "-- Remote --"REMOTES=$(git remote -v)if [ "$REMOTES" != '' ]thenecho $REMOTESfifi
它只显示本地与轨道配置。
将其写在路径上名为git轨道的脚本上,您将获得git轨道命令
更详细的版本https://github.com/albfan/git-showupstream
如果您查看git-rev-parse的手册页,您将看到以下语法描述:
git-rev-parse
<branchname>@{upstream},例如master@{upstream},@{u} 分支名称的后缀@{upstream}(简写形式)<branchname>@{u})引用分支指定的分支分支名称设置为构建在.之上。缺少的分支名称默认值到目前为止
<branchname>@{upstream},例如master@{upstream},@{u}
<branchname>@{upstream}
master@{upstream}
@{u}
分支名称的后缀@{upstream}(简写形式)<branchname>@{u})引用分支指定的分支分支名称设置为构建在.之上。缺少的分支名称默认值到目前为止
@{upstream}
<branchname>@{u}
因此,要找到分支master的上游,您需要:
master
git rev-parse --abbrev-ref master@{upstream}# => origin/master
要打印每个分支的信息,您可以执行以下操作:
while read branch; doupstream=$(git rev-parse --abbrev-ref $branch@{upstream} 2>/dev/null)if [[ $? == 0 ]]; thenecho $branch tracks $upstreamelseecho $branch has no upstream configuredfidone < <(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
或
% git for-each-ref --format='%(upstream:short)' $(git symbolic-ref -q HEAD)origin/mainline
这个答案也是这里,一个稍微不同的问题被(错误地)标记为重复。
对于当前分支,您也可以说git checkout(没有任何分支)。这是一个带有副作用的无操作,用于显示当前分支的跟踪信息(如果存在)。
git checkout
$ git checkoutYour branch is up-to-date with 'origin/master'.
git for-each-ref --format='%(refname:short) <- %(upstream:short)' refs/heads
将为每个本地分支显示一条线。跟踪分支如下所示:
master <- origin/master
一个非跟踪的看起来像:
test <-
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 rev-parse --abbrev-ref HEAD
下面的迷你脚本结合了这些东西。将其粘贴在名为git-tracking的文件中,使其可执行,并确保它在您的路径中。
git-tracking
那你就可以说
$ git tracking<current_branch_name>-><remote_repo_name>/<remote_branch_name>
请注意,远程分支名称可以与本地分支名称不同(尽管通常不是)。例如:
$git trackingxxx_xls_xslx_thing -> origin/totally_bogus
正如您在代码中看到的那样,关键是从git配置中提取数据。我只是使用ed清除无关数据。
#!/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 remote -v,它显示了当前分支的所有原点和上游。
git remote -v