我正在搜索git命令以了解与现有分支相关联的上游(如果有)
(与"写"命令{{1}}相关联的某种"读"命令)
原因是我使用了一个与几个远程回购连接的分支,并且我想在更改之前检查分支是否已经与右上游连接。
答案 0 :(得分:4)
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]
,但远程跟踪分支的名称为origin
,weird/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