找出本地分支正在跟踪哪个远程分支


842

另请参阅:
如何查看哪些Git分支正在跟踪哪个远程/上游分支?

如何找出本地分支正在跟踪哪个远程分支?

我是否需要解析git config输出,或者是否有命令可以为我执行此操作?


18
嘘。这不是完全相同的副本。这是另一个的子集,但是还有其他方法可以解决问题,例如git remote show origin。另一个问题的主要答案是bash脚本,它围绕此处的简单答案进行包装,这可能对某些人有用。希望这个问题不会完全解决。
cdunn2001

5
同意,这绝对不应该是骗子。它提出的问题与链接的问题完全不同
Adam Batkin

Answers:


1002

是一个为您提供所有跟踪分支(配置为“拉”)的命令,请参见:

$ git branch -vv
  main   aaf02f0 [main/master: ahead 25] Some other commit
* master add0a03 [jdsumsion/master] Some commit

您必须仔细阅读SHA和所有长时间包装的提交消息,但是键入起来很快,我在第三列中将跟踪分支垂直对齐。

如果您需要有关每个分支“拉”和“推”配置的信息,请参见上的其他答案git remote show origin


更新资料

从git版本1.8.5开始,您可以使用git status和显示上游分支git status -sb


6
此输出比git branch -av或更为直接git remote show origin,它为您提供了大量数据,而不仅仅是跟踪的远程设备
SimplGy 2013年

60
顺便说一句,最新版本的git(1.8.5.x)还在git status和期间显示了上游分支git status -sb-因此,一旦升级到1.8.5.x,此问题(和答案)就不相关了。
jdsumsion 2013年

11
尽管这可以为您提供所需的信息,但我认为这是正确的答案,因此我会不同意。这是一个答案,就像给某人一个字典回答“您如何拼写XYZ”一样。例如,您想将结果答案(分支名称)用于某些操作。.此答案只能帮助我直观地看到它...不能为您提供在后续命令中可用的功能。
UpAndAdam

该命令的输出可能会引起误解,因为提交消息可能很容易以例如“ [my-feature] ...”开头。请参阅@ cdunn2001的答案,该答案仅显示上游分支(如果有),而没有其他显示。
乔纳斯·柏林

1
我同意@ jonas-berlin-如果您想解析结果,cdunn2001的答案会更好-如果您正在寻找一个简单的命令并且愿意以可视方式扫描输出,则我的答案很好
jdsumsion

372

两种选择:

% 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

12
真好!万一没有追踪到任何东西,第一个会带来丑陋的错误,而第二个对于编写脚本特别有用。BTW %(refname:short)是中当前引用的名称--format
蒂诺2012年

9
git help revisions(文档中鲜为人知但最有用的部分之一)并搜索upstream
cdunn2001

15
这个答案是更好的比两个答案上面,特别是如果你想要做这样的事情git diff `git rev-parse --abbrev-ref --symbolic-full-name @{upstream}`

2
这真的很有用echo 'git for-each-ref --format=\'%(refname:short) -> %(upstream:short)\' refs/heads/$1' > ~/bin/git-show-upstream; chmod +x ~/bin/git-show-upstream
albfan 2014年

6
如果要查找其他分支的上游,则第二种选择是:git for-each-ref --format='%(upstream:short)' $(git rev-parse --symbolic-full-name SOMEBRANCH)用分支名称替换SOMEBRANCH,或将“ HEAD”替换为当前分支
Jonas Berlin

220

我想git branch -av只告诉您拥有哪些分支以及它们处于哪个提交状态,从而让您推断本地分支正在跟踪哪个远程分支。

git remote show origin明确告诉您哪些分支正在跟踪哪些远程分支。这是一个具有单个提交和一个远程分支的存储库的示例输出abranch

$ git branch -av
* abranch                d875bf4 initial commit
  master                 d875bf4 initial commit
  remotes/origin/HEAD    -> origin/master
  remotes/origin/abranch d875bf4 initial commit
  remotes/origin/master  d875bf4 initial commit

$ git remote show origin
* remote origin
  Fetch URL: /home/ageorge/tmp/d/../exrepo/
  Push  URL: /home/ageorge/tmp/d/../exrepo/
  HEAD branch (remote HEAD is ambiguous, may be one of the following):
    abranch
    master
  Remote branches:
    abranch tracked
    master  tracked
  Local branches configured for 'git pull':
    abranch merges with remote abranch
    master  merges with remote master
  Local refs configured for 'git push':
    abranch pushes to abranch (up to date)
    master  pushes to master  (up to date)

3
我需要一个用于发现上游分支的命令,因此使用“来源”作为输入是一个假设,因此这对我不起作用
Alexander Mills

1
但这确实回答了OP。该命令git remote show origin向您显示本地分支以及它们对推和拉跟踪的内容。
dudewad

1
@dudewad我认为关键是该命令假定远程对象被称为origin,而实际上它可以是任何东西(例如,多个远程对象,具有不同分支的跟踪来自不同远程对象的分支)。
罗斯兰

74

更新:嗯,自我发布此消息已有好几年了!为了将HEAD与上游进行比较,我现在使用@{u},这是引用上游跟踪分支的HEAD的快捷方式。(请参阅https://git-scm.com/docs/gitrevisions#gitrevisions-emltbranchnamegtupstreamemegemmastermasterupstreamememuem)。

原始答案:我也遇到了这个问题。我经常在单个存储库中使用多个远程服务器,很容易忘记当前分支跟踪的是哪个远程服务器。有时很容易知道这一点,例如,当您想通过查看本地提交时git log remotename/branchname..HEAD

所有这些东西都存储在git config变量中,但是您不必解析git config输出。如果调用git config后接变量名,它将只显示该变量的值,而无需进行解析。考虑到这一点,下面是一些命令来获取有关当前分支的跟踪设置的信息:

LOCAL_BRANCH=`git name-rev --name-only HEAD`
TRACKING_BRANCH=`git config branch.$LOCAL_BRANCH.merge`
TRACKING_REMOTE=`git config branch.$LOCAL_BRANCH.remote`
REMOTE_URL=`git config remote.$TRACKING_REMOTE.url`

就我而言,由于我只想找出当前遥控器的名称,所以我这样做:

git config branch.`git name-rev --name-only HEAD`.remote

2
这对于创建别名以重新构建当前分支的位置非常有用。谢谢!
贾斯汀·斯帕夏

同样适用于我们的“快进”别名,只要操作是快进的,别名就会将本地跟踪分支前进到远程。
Altreus 2012年

4
实际上,我发现这git name-rev --name-only HEAD不会告诉您您实际在哪个分支上。为此我使用了git branch | grep '^\*' | cut -d' ' -f2
Altreus

1
谢谢!其他类似问题的答案都没有提到@{u}别名/快捷方式,而这正是我在寻找的东西!如果只想确定是否需要拉,则没有理由与master分支进行比较。
Dan M.

1
@{u}是炸弹。自1.7.0起就存在,这意味着如果某人在2018年使用的git中无法使用它,那么他们可能应该进行升级。
克里斯·克莱兰

48

本地分支机构及其远程站点。

git branch -vv 

所有分支机构和跟踪遥控器。

git branch -a -vv

查看本地分支在哪里显式配置用于推和拉。

git remote show {remote_name}

21

这将向您显示您所在的分支:

$ git branch -vv

这将显示您所在的当前分支:

$ git for-each-ref --format='%(upstream:short)' $(git symbolic-ref -q HEAD)

例如:

myremote/mybranch

您可以找到所在的当前分支所使用的远程服务器的URL :

$ git remote get-url $(git for-each-ref --format='%(upstream:short)' $(git symbolic-ref -q HEAD)|cut -d/ -f1)

例如:

https://github.com/someone/somerepo.git

19

您可以使用git checkout,即“签出当前分支”。这是一个没有副作用的操作,可以显示当前分支的跟踪信息(如果存在)。

$ git checkout 
Your branch is up-to-date with 'origin/master'.

17

我不知道这是否可以解析git config的输出,但这将确定master跟踪的远程URL:

$ git config remote。$(git config branch.master.remote).url

或者,git config branch.$(git symbolic-ref -q HEAD).remote如果您只想跟踪当前分支的远程名称,git config remote.$(git config branch.$(git symbolic-ref -q HEAD).remote).url则为URL。
Anakhand

我需要添加--short选项,以便工作。因此,要获取当前分支的远程名称:git config branch.$(git symbolic-ref -q --short HEAD).remote和要获取当前分支的远程URL:git config remote.$(git config branch.$(git symbolic-ref -q --short HEAD).remote).url
Nelson

13

另一种方式

git status -b --porcelain

这会给你

## BRANCH(...REMOTE)
modified and untracked files

10

另一种简单的方法是使用

cat .git/config 在git仓库中

这将列出本地分支机构的详细信息


在Linux上运行良好。除非在类似Unix的提示符下(例如cygwin或git bash),否则在Windows上将不起作用。
Contango

在Windows中,只需简单地使用它即可,type .git/config而不是cat .git/config在普通命令行上使用
。– khmarbaise

9

如果您只想知道它是否存在,则可以使用另一种方法(感谢osse):

if git rev-parse @{u} > /dev/null 2>&1
then
  printf "has an upstream\n"
else
  printf "has no upstream\n"
fi

什么语言?这看起来像Linux Shell脚本,但没有提供其他信息或上下文。
Suncat2000

8

git branch -vv | grep 'BRANCH_NAME'

git branch -vv :此部分将显示所有本地分支及其上游分支。

grep 'BRANCH_NAME' :它将从分支列表中过滤当前分支。



5

列出本地和远程分支:

$ git branch -ra

输出:

  feature/feature1
  feature/feature2
  hotfix/hotfix1
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/develop
  remotes/origin/master

3

git-status ceramic(机器可读)v2输出看起来像这样:

$ git status -b --porcelain=v2
# branch.oid d0de00da833720abb1cefe7356493d773140b460
# branch.head the-branch-name
# branch.upstream gitlab/the-branch-name
# branch.ab +2 -2

并使分支仅上游:

$ git status -b --porcelain=v2 | grep -m 1 "^# branch.upstream " | cut -d " " -f 3-
gitlab/the-branch-name

如果分支没有上游,则上述命令将产生一个空输出(或失败set -o pipefail)。


2

如果您想找到任何分支的上游(而不是您所在的分支),请对@ cdunn2001的答案进行一下修改:

git rev-parse --abbrev-ref --symbolic-full-name YOUR_LOCAL_BRANCH_NAME@{upstream}

这将为您提供名为的本地分支的远程分支名称YOUR_LOCAL_BRANCH_NAME


2

您可以尝试以下方法:

git remote show origin | grep "branch_name"

branch_name 需要替换为您的分支


如果您的分支机构名称也与其他分支机构匹配怎么办?会发生什么你的分支名其他一些文本的输出相匹配git remote show origin-如果这就是所谓的merges还是configure
汤姆·史威利

没有得到你。您是说多个分支具有相同的名称

1

我用这个别名

git config --global alias.track '!sh -c "
if [ \$# -eq 2 ]
 then
   echo \"Setting tracking for branch \" \$1 \" -> \" \$2;
   git branch --set-upstream \$1 \$2;
 else
   git for-each-ref --format=\"local: %(refname:short) <--sync--> remote: %(upstream:short)\" refs/heads && echo --URLs && git remote -v;
fi  
" -'

然后

git track

请注意,该脚本还可以用于设置跟踪。

更多出色的别名,访问https://github.com/orefalo/bash-profiles


0

我将EasyGit(又名“ eg”)用作Git顶部(或侧面)的超轻量级包装。EasyGit有一个“ info”子命令,该命令可为您提供各种超级有用的信息,包括当前分支,远程跟踪分支。下面是一个示例(当前分支名称为“ foo”):

pknotz @ s883422:(foo)〜/ workspace / bd
$例如信息
提交总数:175
本地存储库:.git
命名的远程存储库:(名称->位置)
  来源-> git://sahp7577/home/pknotz/bd.git
当前分支:foo
  加密校验和(sha1sum):bd248d1de7d759eb48e8b5ff3bfb3bb0eca4c5bf
  默认拉/推存储库:起源
  默认的拉/推选项:
    branch.foo.remote =起源
    branch.foo.merge = refs / heads / aal_devel_1
  贡献人数:3
  文件数:28
  目录数:20
  最大文件大小,以字节为单位:32473(pygooglechart-0.2.0 / COPYING)
  提交的:62

0

为了改善这个答案,我想到了以下.gitconfig别名:

branch-name = "symbolic-ref --short HEAD"
branch-remote-fetch = !"branch=$(git branch-name) && git config branch.\"$branch\".remote || echo origin #"
branch-remote-push  = !"branch=$(git branch-name) && git config branch.\"$branch\".pushRemote || git config remote.pushDefault || git branch-remote-fetch #"
branch-url-fetch = !"remote=$(git branch-remote-fetch) && git remote get-url        \"$remote\" #"  # cognizant of insteadOf
branch-url-push  = !"remote=$(git branch-remote-push ) && git remote get-url --push \"$remote\" #"  # cognizant of pushInsteadOf

那是什么语言?
Daniel Farrell

3
@丹·法瑞尔:壳。别名以!开头 使用/ bin / sh。git的配置文件用双引号引起来。
汤姆·黑尔'18

0

如果您使用Gradle,

def gitHash = new ByteArrayOutputStream()
    project.exec {
        commandLine 'git', 'rev-parse', '--short', 'HEAD'
        standardOutput = gitHash
    }

def gitBranch = new ByteArrayOutputStream()
    project.exec {
        def gitCmd = "git symbolic-ref --short -q HEAD || git branch -rq --contains "+getGitHash()+" | sed -e '2,\$d'  -e 's/\\(.*\\)\\/\\(.*\\)\$/\\2/' || echo 'master'"
        commandLine "bash", "-c", "${gitCmd}"
        standardOutput = gitBranch
    }

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.