如何读取git分支的当前上游

时间:2017-10-01 17:13:30

标签: git git-branch upstream-branch

我正在搜索git命令以了解与现有分支相关联的上游(如果有) (与"写"命令{{1}}相关联的某种"读"命令)
原因是我使用了一个与几个远程回购连接的分支,并且我想在更改之前检查分支是否已经与右上游连接。

3 个答案:

答案 0 :(得分:4)

TL; DR:使用git rev-parse

$ git rev-parse --abbrev-ref master@{u}
weird/master

如果没有设置上游,你会得到:

fatal: no upstream configured for branch 'master'

(和非零退出代码)。如果您不想要,请将stderr重定向到/dev/null以丢弃错误消息:

if master_upstream=$(git rev-parse --abbrev-ref master@{u} 2>/dev/null); then
    master_has_upstream=true
else
    master_has_upstream=false
fi
例如

解释

Anthony Sottile's answer 通常为您提供正确的名称,但并非总是如此。特别要注意当remote.origin.fetch的{​​{1}}设置不是常态时会发生什么:

origin

请注意,虽然远程的名称为$ git init Initialized empty Git repository in .../tmp/tt/.git/ $ git remote add origin git://github.com/git/git $ git config remote.origin.fetch '+refs/heads/*:refs/remotes/weird/*' $ git fetch remote: Counting objects: 231294, done. remote: Compressing objects: 100% (663/663), done. remote: Total 231294 (delta 0), reused 662 (delta 0), pack-reused 230631 Receiving objects: 100% (231294/231294), 93.03 MiB | 3.54 MiB/s, done. Resolving deltas: 100% (170261/170261), done. From git://github.com/git/git * [new branch] maint -> weird/maint * [new branch] master -> weird/master * [new branch] next -> weird/next * [new branch] pu -> weird/pu * [new branch] todo -> weird/todo * [new tag] v2.14.2 -> v2.14.2 [lots more tags snipped] ,但远程跟踪分支的名称为originweird/master,等等。它确实有效:

weird/next

但如果远程跟踪分支名称为$ git checkout master Branch master set up to track remote branch master from origin. Already on 'master' $ git status On branch master Your branch is up-to-date with 'weird/master'. nothing to commit, working tree clean .git/config中的内容仍然如此:

origin/master

使用:

[branch "master"]
    remote = origin
    merge = refs/heads/master

运行良好(尽管应该经常使用 branch="$(git branch | grep '\*' | cut -d' ' -f2-)" 来获取当前分支名称:见下文)。

git symbolic-ref --short HEAD

此部分完美无缺 - 它获取遥控器的名称。

remote="$(git config "branch.${branch}.remote")"

这是我们出错的地方。我们需要的是使用remote_branch="$(git config "branch.${branch}.merge" | cut -d/ -f3-)" 加上gitrevisions语法"指定分支的上游",即将git rev-parse@{u}附加到分支名称。通常@{upstream}将其转换为哈希ID,但是使用git rev-parse,它会打印一个简短版本的名称,或者使用--abbrev-ref,它会打印长版本:

--symbolic-full-name

(我不知道为什么在一个案例中拼写为$ git rev-parse --symbolic-full-name master@{u} refs/remotes/weird/master ,在另一个案例中拼写--abbrev-ref

请注意,在--symbolic-full-name上使用git rev-parse时,如果HEAD已分离,则答案为符号HEAD。也就是说,在任何Git存储库中,HEAD总是成功,即使在打印符号名称时也是如此。但git rev-parse HEAD为真:

git symbolic-ref

因此,要解析$ git checkout --detach HEAD is now at ea220ee40... The eleventh batch for 2.15 $ git rev-parse --abbrev-ref HEAD HEAD $ git rev-parse --symbolic-full-name HEAD HEAD $ git symbolic-ref HEAD fatal: ref HEAD is not a symbolic ref (以查找当前分支),请根据您在" no current branch"中所需的行为选择要使用的命令。情况下。

答案 1 :(得分:0)

事实上,我发现了使用git status命令的第一个技巧:
我的分支是当前的分支,并且有一个上游,我得到像Your branch is up-to-date with 'the_repo/the branch'这样的一行,但我更倾向于知道这一点。

答案 2 :(得分:0)

我在这里找到了与git status相同的答案,但是以脚本友好的方式:

 $ branch="$(git branch | grep '\*' | cut -d' ' -f2-)"
 $ remote="$(git config "branch.${branch}.remote")"
 $ remote_branch="$(git config "branch.${branch}.merge" | cut -d/ -f3-)"
 $ echo "${branch} is tracking ${remote}/${remote_branch}"
 print_locking_less is tracking origin/master

远程跟踪分支的信息存储在.git/config中,如下所示:

[branch "print_locking_less"]
        remote = origin
        merge = refs/heads/master