我知道我可以做 git branch --all ,它向我展示了本地和远程分支,但是向我展示它们之间的关系并没有那么有用 .
git branch --all
如何以显示哪个本地分支正在跟踪哪个远程的方式列出分支?
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 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 checkout (没有任何分支) . 这是一个带有副作用的无操作,用于显示当前分支的跟踪信息(如果存在) .
git checkout
$ git checkout Your branch is up-to-date with 'origin/master'.
很多瓷器命令,如果你想要这个脚本,那就不好了:
git branch -vv # doubly verbose!
请注意,使用git 1.8.3,该上游分支显示在 blue 中(参见“What is this branch tracking (if anything) in git?”)
如果你想要干净的输出,请参阅arcresu's answer - 它使用了一个瓷器命令,我更加简洁,并且可以使用为rebase配置的分支,而不仅仅是合并 .
git remote show origin
用您遥控器的名称替换“origin” .
如果查看 git-rev-parse 的手册页,您将看到描述了以下语法:
git-rev-parse
<branchname> @ ,例如master @ ,@ 后缀@ 到一个branchname(简短形式<branchname> @ )指的是由branchname指定的分支设置为在其上构建的分支 . 缺少的branchname默认为当前的 .
因此,要找到分支 master 的上游,您可以:
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更干净 .
我用这个别名
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
git for-each-ref --format='%(refname:short) <- %(upstream:short)' refs/heads
将为每个本地分支显示一行 . 跟踪分支将如下所示:
master <- origin/master
非跟踪的看起来像:
test <-
基于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的更详细的版本
对于当前的分支,这里有两个不错的选择:
% 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,这是一个略有不同的问题,被错误地标记为重复 .
kubi回答的另一种方法是查看显示本地存储库配置的 .git/config 文件:
.git/config
cat .git/config
10 回答
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配置中提取数据 . 我只是使用sed来清除无关的数据 .
对于当前分支,您也可以说
git checkout
(没有任何分支) . 这是一个带有副作用的无操作,用于显示当前分支的跟踪信息(如果存在) .很多瓷器命令,如果你想要这个脚本,那就不好了:
请注意,使用git 1.8.3,该上游分支显示在 blue 中(参见“What is this branch tracking (if anything) in git?”)
如果你想要干净的输出,请参阅arcresu's answer - 它使用了一个瓷器命令,我更加简洁,并且可以使用为rebase配置的分支,而不仅仅是合并 .
git remote show origin
用您遥控器的名称替换“origin” .
如果查看
git-rev-parse
的手册页,您将看到描述了以下语法:因此,要找到分支
master
的上游,您可以:要打印出每个分支的信息,您可以执行以下操作:
这比手动解析refs和config更干净 .
我用这个别名
然后
将为每个本地分支显示一行 . 跟踪分支将如下所示:
非跟踪的看起来像:
基于Olivier Refalo's answer
它仅显示已配置轨道的本地 .
将它写在路径上名为git-track的脚本上,您将获得 git track 命令
关于https://github.com/albfan/git-showupstream的更详细的版本
对于当前的分支,这里有两个不错的选择:
要么
这个答案也是here,这是一个略有不同的问题,被错误地标记为重复 .
kubi回答的另一种方法是查看显示本地存储库配置的
.git/config
文件:cat .git/config