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

Rea*_*nly 775 git

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

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

我需要解析git配置输出,还是有一个命令会为我做这个?

jds*_*ion 932

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

$ git branch -vv
  main   aaf02f0 [main/master: ahead 25] Some other commit
* master add0a03 [jdsumsion/master] Some commit
Run Code Online (Sandbox Code Playgroud)

你必须浏览SHA和任何长包装提交消息,但是它可以快速输入,并且我会在第3列中垂直对齐跟踪分支.

如果您需要有关每个分支的"拉"和"推"配置的信息,请参阅另一个答案git remote show origin.


更新

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

  • BTW,最新版本的git(1.8.5.x)现在也在`git status`和`git status -sb`中显示上游分支 - 所以一旦你升级到1.8.5.x,这个问题(和答案) )无关紧要. (55认同)
  • 虽然这可以为您提供所需的信息,但我不同意这是正确的答案.这是一个答案,就像给某人一本字典回答"你怎么拼写XYZ"一样.例如,您希望使用结果答案(分支名称)进行某些操作.这个答案只能帮助我在视觉上看到它...不会在后续命令中提供可用的东西. (9认同)
  • 这个输出比`git branch -av`或`git remote show origin`更直接,它给你很多数据,而不仅仅是跟踪的遥控器 (6认同)

cdu*_*001 355

两种选择:

% git rev-parse --abbrev-ref --symbolic-full-name @{u}
origin/mainline
Run Code Online (Sandbox Code Playgroud)

要么

% git for-each-ref --format='%(upstream:short)' "$(git symbolic-ref -q HEAD)"
origin/mainline
Run Code Online (Sandbox Code Playgroud)

  • 这个答案比上面的两个答案要好得多,特别是如果你想做一些像`git diff \`git rev-parse --abbrev-ref --symbolic-full-name @ {upstream} \`` (14认同)
  • 太好了!如果没有跟踪任何内容,第一个给出了丑陋的错误,而第二个对脚本特别有帮助.BTW`%(refname:short)`是`--format`中当前ref的名称. (12认同)
  • `git help revisions`(文档中鲜为人知但最有用的部分之一)并搜索`upstream`. (9认同)
  • 如果你想找到其他分支的上游,第二种选择的变体是:`git for-each-ref --format ='%(upstream:short)'$(git rev-parse --symbolic-全名SOMEBRANCH)`用分支名称替换SOMEBRANCH,或用当前分支替换"HEAD" (5认同)
  • 这非常有用`echo'git for-each-ref --format = \'%(refname:short) - >%(上游:短)\'refs/heads/$ 1'>〜/ bin/git-show-上游; chmod + x~/bin/git-show-upstream` (2认同)
  • 要记住的一件重要的事情是跟踪分支不一定是远程分支。 (2认同)

Aji*_*rge 211

我想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
Run Code Online (Sandbox Code Playgroud)

$ 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)
Run Code Online (Sandbox Code Playgroud)

  • 我需要一个*发现*上游分支的命令,因此使用'origin'作为输入正在做出假设,所以这对我不起作用 (3认同)
  • 但这确实回答了 OP。命令 `git remote show origin` 向您显示本地分支以及它们对推和拉的跟踪。 (2认同)
  • @dudewad我认为重点是这个命令假设遥控器被称为“origin”,而它实际上可以是任何东西(例如多个遥控器,具有不同的分支跟踪来自不同遥控器的分支)。 (2认同)

Aar*_*lls 68

更新:嗯,我发布这个已经好几年了!为了我将HEAD与上游进行比较的具体目的,我现在使用@{u},这是一个引用上游跟踪分支的HEAD的快捷方式.(参见https://git-scm.com/docs/gitrevisions#gitrevisions-emltbranchnamegtupstreamemegemmasterupstreamememuem).

原始答案:我也遇到过这个问题.我经常在一个存储库中使用多个遥控器,很容易忘记当前分支跟踪的是哪一个.有时候知道这一点很方便,例如当你想看看你的本地提交时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`
Run Code Online (Sandbox Code Playgroud)

在我的情况下,因为我只想找到我当前遥控器的名称,我这样做:

git config branch.`git name-rev --name-only HEAD`.remote
Run Code Online (Sandbox Code Playgroud)

  • 实际上我发现这个'git name-rev -name-only HEAD`不会告诉你你实际上是哪个分支.为此我只使用了`git branch | grep'^\*'| cut -d'' - f2` (4认同)
  • 这对于为任何我当前的分支进行rebase的别名非常有用.谢谢! (2认同)
  • 谢谢!类似问题的其他答案没有提到“@{u}”别名/快捷方式,而这正是我正在寻找的!如果您只想确定是否需要拉取,则没有理由与 master 分支进行比较。 (2认同)
  • `@{u}` 是炸弹。自 1.7.0 以来一直存在,这意味着如果有人在 2018 年使用的 git 中不可用,他们可能需要升级。 (2认同)
  • 使用“symbolic-ref --short HEAD”作为单个单词来描述当前分支。 (2认同)

nik*_*ypx 47

当地的分支机构和他们的遥控器.

git branch -vv 
Run Code Online (Sandbox Code Playgroud)

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

git branch -a -vv
Run Code Online (Sandbox Code Playgroud)

查看为推送和拉取显式配置本地分支的位置.

git remote show {remote_name}
Run Code Online (Sandbox Code Playgroud)


Sab*_*osh 24

git branch -vv | grep 'BRANCH_NAME'

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

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


rub*_*o77 19

这将显示您所在的分支:

$ git branch -vv
Run Code Online (Sandbox Code Playgroud)

这将显示您当前的分支:

$ git for-each-ref --format='%(upstream:short)' $(git symbolic-ref -q HEAD)
Run Code Online (Sandbox Code Playgroud)

例如:

myremote/mybranch
Run Code Online (Sandbox Code Playgroud)

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

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

例如:

https://github.com/someone/somerepo.git
Run Code Online (Sandbox Code Playgroud)


Eug*_*ash 18

您可以使用git checkout,即"检查当前分支".这是一个带有副作用的无操作,用于显示当前分支的跟踪信息(如果存在).

$ git checkout 
Your branch is up-to-date with 'origin/master'.
Run Code Online (Sandbox Code Playgroud)


Wil*_*ell 16

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

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

  • 或者`git configbranch.$(git symbolic-ref -q HEAD).remote`如果您只想跟踪*当前*分支的远程名称 -`git config remote.$(git configbranch.$( git symbolic-ref -q HEAD).remote).url` 作为 URL。 (2认同)

小智 11

还有另一种方式

git status -b --porcelain
Run Code Online (Sandbox Code Playgroud)

这会给你

## BRANCH(...REMOTE)
modified and untracked files
Run Code Online (Sandbox Code Playgroud)


Tri*_*ter 10

另一种简单的方法是使用

cat .git/config 在一个git仓库

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


Phi*_*bin 10

仅显示当前分支信息而不使用grep

git branch -vv --contains
Run Code Online (Sandbox Code Playgroud)

这是以下的缩写:

git branch -vv --contains HEAD
Run Code Online (Sandbox Code Playgroud)

如果您当前的 HEAD 提交 ID 在其他分支中,这些分支也会显示。


Way*_*ker 9

另一种方法(谢谢osse),如果你只是想知道它是否存在:

if git rev-parse @{u} > /dev/null 2>&1
then
  printf "has an upstream\n"
else
  printf "has no upstream\n"
fi
Run Code Online (Sandbox Code Playgroud)


小智 7

git branch -r -vv
Run Code Online (Sandbox Code Playgroud)

将列出所有分支,包括远程.


And*_*Dog 7

git-status 瓷器(机器可读)v2 输出如下所示:

$ git status -b --porcelain=v2
# branch.oid d0de00da833720abb1cefe7356493d773140b460
# branch.head the-branch-name
# branch.upstream gitlab/the-branch-name
# branch.ab +2 -2
Run Code Online (Sandbox Code Playgroud)

并且只让分支上游:

$ git status -b --porcelain=v2 | grep -m 1 "^# branch.upstream " | cut -d " " -f 3-
gitlab/the-branch-name
Run Code Online (Sandbox Code Playgroud)

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


jos*_*isq 6

列出本地和远程分支:

$ git branch -ra
Run Code Online (Sandbox Code Playgroud)

输出:

  feature/feature1
  feature/feature2
  hotfix/hotfix1
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/develop
  remotes/origin/master
Run Code Online (Sandbox Code Playgroud)


Jer*_*son 5

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

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

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


xpi*_*eer 5

你可以试试这个:

git remote show origin | grep "branch_name"
Run Code Online (Sandbox Code Playgroud)

branch_name 需要用你的分支替换


Pat*_*otz -5

我使用EasyGit(又名“eg”)作为 Git 之上(或旁边)的超轻量级包装器。EasyGit 有一个“info”子命令,可以为您提供各种超级有用的信息,包括当前分支远程跟踪分支。这是一个示例(其中当前分支名称是“foo”):

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