繁体   English   中英

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

[英]How can I see which Git branches are tracking which remote / upstream branch?

我知道我可以执行git branch --all ,这会向我显示本地和远程分支,但是在向我显示它们之间的关系时并没有那么有用。

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

非常像瓷器命令,如果你想用它来编写脚本就不好:

git branch -vv   # doubly verbose!

请注意,在 git 1.8.3 中,上游分支显示为蓝色(请参阅“ git 中的此分支跟踪(如果有的话)是什么? ”)


如果您想要干净的输出,请参阅arcresu 的答案- 它使用了一个瓷器命令,我认为在我最初编写此答案时不存在该命令,因此它更简洁一些并且适用于为 rebase 配置的分支,而不仅仅是合并。

git remote show origin

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

如果您查看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
# ...

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

kubi 答案的替代方法是查看.git/config文件,其中显示了本地存储库配置:

cat .git/config

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

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

master <- origin/master

一个非跟踪的看起来像:

test <- 

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

% 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 
Your branch is up-to-date with 'origin/master'.

这是一个整洁而简单的。 可以检查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'

那么

git track

基于Olivier Refalo 的回答

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

我知道我可以做git branch --all ,这向我显示了本地和远程分支,但是对我来说它们之间的关系并不是那么有用。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM