这里已经提出了类似的问题,但我认为它被误解了(或者也许我误解了这个问题)。那我就在这里问清楚吧。当我这样做时git status,我会得到一条线(除其他外),告诉我我是否落后于我正在跟踪的远程分支(或从其分叉)。这很棒。然而,我有不止一个遥控器。我有一个“官方”遥控器(来源),它是共享的(只有当东西“准备好”时我才推送到那里),还有一个“个人”遥控器(工作),我用它从家庭/工作中推送东西,所以当我切换电脑时我可以继续工作。现在,当我这样做时git status,会将本地分支与origin/branch_name(或我正在跟踪的任何远程分支)进行比较。然而,我也想将它与其他遥控器/分支进行比较,但不拉动,只是比较。理想情况下,我想做这样的事情:
git fetch work
git status work/branch_name
Run Code Online (Sandbox Code Playgroud)
并获取我的本地分支与 work/branch_name 的状态比较。
请注意,我不想进行比较,也就是说,我对哪些文件/路径不同不感兴趣。我只是想看看两个分支是否/何时分叉,或者一个分支是否领先于另一个分支。
另请注意,我可以使用图形方式获取此信息gitk --all,查看两个分支在树中的位置,但我想从命令行执行此操作。另外,如果有多个分支,显示的树gitk --all可能会很混乱。
谢谢
不幸的是,git status总是使用当前配置的上游,即查看当前分支(我们称之为$branch),然后检查和 的配置值。branch.$branch.remotebranch.$branch.merge
除了修改git status为采用--pretend-upstream标志或类似内容之外,您只剩下两个选择:重新配置上游(可能是暂时的)或模拟git status. 由于您只需要提交次数,因此这相对容易:我们只需要知道所需上游的名称。
为了使这一点完全通用,您可能会发明类似的东西或其他东西,并循环输出,但要硬连线一个特定的东西,您可以这样做:branch.$branch.extstatusgit config --get-allwork/branch_name
git rev-list --count work/branch_name..HEAD
Run Code Online (Sandbox Code Playgroud)
和:
git rev-list --count HEAD..work/branch_name
Run Code Online (Sandbox Code Playgroud)
该表示法选择1右侧分支..上的提交, 2不包括左侧分支上的任何提交,并使print仅显示所选内容中的提交计数;因此,第一个命令让您“提交您拥有的而他们没有的”(您的“领先”计数),第二个命令让您“提交他们拥有但您没有的”(您的“落后”计数)。--countgit rev-list
将两者与 shell 结合起来:
echo "vs work/branch_name: ahead $(git rev-list ...), behind $(git rev-list ...)"
Run Code Online (Sandbox Code Playgroud)
(填写...我为了使线条适合而省略的部分)。将其设置为 git 或 shell 别名就可以了。
1更准确地说,“可从以下位置到达”:即提交本身或其任何父母、祖父母等。
2更准确地说,任何标识提交或可用于定位提交的内容(例如带注释的标签)。