Git 与不同遥控器相比的状态

Git status compared to different remote

已经有人问过类似的问题 here,但我认为它被误解了(或者我误解了问题)。所以让我在这里问清楚。当我执行 git status 时,我得到(除其他外)一条线,告诉我我是否落后于(或从)我正在跟踪的远程分支。这很棒。但是,我有不止一个遥控器。我有一个 'official' 远程(源),它是共享的(只有当东西是 'ready' 时我才会推送),还有一个 'personal' 远程(工作),我用它来推送东西来自 home/work,以便我在切换计算机时可以继续工作。现在,当我执行 git status 时,会将本地分支与 origin/branch_name(或我正在跟踪的任何远程分支)进行比较。但是,我也想将它与其他 remotes/branches 进行比较,但不拉,只是比较。理想情况下,我想做这样的事情:

git fetch work
git status work/branch_name

并获取我的本地分支机构与 work/branch_name 的 状态 比较。

请注意,我不想做 diff,也就是说,我对 files/paths 有什么不同不感兴趣。我只是想看看 if/when 两个分支是否分叉,或者是否一个在另一个之前。

另请注意,我可以使用 gitk --all 以图形方式获取此信息,查看两个分支在树中的位置,但我想从命令行执行此操作。此外,如果有多个分支,显示为 gitk --all 的树可能会很乱。

谢谢

不幸的是,git status 总是使用当前配置的上游,即查看您当前的分支(我们称之为 $branch)然后检查branch.<em>$branch</em>.remotebranch.<em>$branch</em> 的配置值。合并.

除了修改 git status 以使用 --pretend-upstream 标志或类似的东西外,您只有两个选择:重新配置上游(可能是临时的),或模拟 git status。由于您只需要提交计数,事实证明这相对容易:我们只需要知道所需上游的名称即可。

为了使其完全通用,您可以发明类似 branch.<em>$branch</em>.extstatus 或其他内容的东西,然后循环 git config --get-all 输出,但是要硬连接一个特定的 work/branch_name 你可以这样做:

git rev-list --count work/branch_name..HEAD

和:

git rev-list --count HEAD..work/branch_name

.. 符号选择 1 right-hand-side 分支上的提交,2 排除任何提交在 left-hand 侧分支上,并且 --count 使 git rev-list 仅打印选择中的 count 提交;所以第一个命令让你 "commits you have that they don't" (你的 "ahead" 计数),第二个命令让你 "commits they have that you don't" (你的 "behind" 计数)。

将两者结合 shell:

echo "vs work/branch_name: ahead $(git rev-list ...), behind $(git rev-list ...)"

(填写 ... 部分,我将其遗漏以使线条适合)。将其设置为 git 或 shell 别名就可以了。


1更准确地说,"reachable from":即提交本身或其任何 parents、grandparents 等.

2更准确地说,任何标识提交或可用于定位提交的内容(例如,带注释的标签)。