我们有两个用于本地git存储库的遥控器。一个称为远程dev,另一个称为origin。当我们运行git status或时git status dev,我们收到以下消息:
# On branch 1.8.x
# Your branch is ahead of 'origin/1.8.x' by 4 commits.
# (use "git push" to publish your local commits)
#
nothing to commit, working directory clean
Run Code Online (Sandbox Code Playgroud)
该消息告诉我们origin遥控器的状态。那不是我们想要的。我们如何只检查dev遥控器的状态?
下面是如何 git status获取这些信息。
我们在哪个分支?
$ git symbolic-ref --short HEAD
1.8.x
Run Code Online (Sandbox Code Playgroud)
(以上是首选的查找方法,通常;如果您处于“分离的 HEAD”模式,则会出错),或者:
$ git rev-parse --symbolic-full-name HEAD
refs/heads/1.8.x
Run Code Online (Sandbox Code Playgroud)
(这也有效,但只能为您提供“全名”:删除refs/heads/以获取分支名称)。
1.8.x 的“上游”是什么分支?
$ git rev-parse --symbolic-full-name '@{upstream}'
refs/remotes/origin/1.8.x
Run Code Online (Sandbox Code Playgroud)
(以上是更简单的方法,但同样只给你“全名”形式;这次你必须删除refs/remotes/以缩短它),或者:
$ git config --get branch.1.8.x.remote
origin
$ git config --get branch.1.8.x.merge
refs/heads/1.8.x
$ git config --get remote.origin.fetch
+refs/heads/*:refs/remotes/origin/*
Run Code Online (Sandbox Code Playgroud)
(这就是 git 计算符号全名的方式@{upstream}——它有点复杂,因为您必须应用此处fetch第1行的分支名称映射)。
一侧或另一侧有多少次修订?
$ git rev-list --count origin/1.8.x..1.8.x
4
$ git rev-list --count 1.8.x..origin/1.8.x
0
Run Code Online (Sandbox Code Playgroud)
也就是说,我们要求git rev-list计算从引用1.8.x(您当前的分支)而不是origin/1.8.x(您的上游)可以访问的提交数量。答案是 4,所以你“领先 4”。然后我们要求git rev-list计算origin/1.8.x从1.8.x. 答案是 0,所以你“在 0 之后”,git status然后就可以安静了。
该git status命令为设置为当前分支的“上游”的任何分支完成所有这些工作。所以,你可以使用git branch --set-upstream-to来改变上游在这种情况下,对其进行更改origin/1.8.x,以dev/1.8.x-and从此你将得到这些信息,只有信息,从git status。(将其改回以获取要切回的信息。)
如果您想暂时获得它,而不切换分支,您需要或多或少地做“做什么git status”,但使用替代的“上游”,在这种情况下,dev/1.8.x. 编写执行此操作的 shell 脚本并不难,特别是如果您只是假设分支B映射到rmt/B给定远程的分支rmt(那么您不需要进行所有复杂的映射)。也就是说,如果您在 branch 上zog,并且要询问 remote bob,则只需rev-list为bob/zog..zogand执行两个s 即可zog..bob/zog。
1实际上,git config --get-all remote.origin.fetch如果有多个引用映射fetch行,您真的很想要。但是这种引用映射很痛苦;可能应该有一个 git 管道命令来为你做这件事。