如何比较 git 中的本地和远程分支树?

How to compare local and remote branch trees in git?

This answer描述如何获取两个分支之间的(文件)差异。

我想知道如何知道我的 local 分支与 remote 分支有多少提交。

我的意思是,提交次数提前旁边后面

您只需键入 Git bash 中的 git status 即可获取此信息。 Git 会将您当前的本地分支与其远程跟踪分支进行比较。你会看到这样的东西:

$ git status
# On branch master

这之后会出现如下状态消息:

# Your branch is up-to-date with 'origin/master'
# Your branch is ahead of 'origin/master' by 1 commit.
# Your branch is behind 'origin/master' by 1 commit.
# Your branch is 1 commit ahead and 2 commits behind 'origin/master'

第一条消息意味着您的本地分支与远程跟踪分支完全同步。第二条和第三条消息意味着您的分支相对于远程有额外的提交,反之亦然。如果您的本地分支和远程分支在您的分支离开后都有新的提交,则会显示第四条消息。

您可以使用@{u} upstream or @{push} gitrevisions syntax来计算提交次数:

  • 领先:git rev-list --count ..@{u}
  • 落后:git rev-list --count @{u}..

比较两个随机分支 AB,找出有多少 A 上的提交是 B 的新提交:

git rev-list --count B..A

AB 可能具有以下关系之一:

  1. AB是不相关的分支;
  2. A 是最新的 B;
  3. A 领先于 B;
  4. A落后于B
  5. AB 不同。

求与foo.sh的关系:

#!/bin/bash

A=
B=

merge_base=$(git merge-base $A $B)
if [[ "${merge_base}" = "" ]];then
    echo "$A and $B are unrelated"
else
    num_new_to_A=$(git rev-list --count $A..$B)
    num_new_to_B=$(git rev-list --count $B..$A)
    if [[ "${num_new_to_A}" -eq 0 ]] && [[ "${num_new_to_B}" -eq 0 ]];then
        echo "$A is up-to-date with $B"
    elif [[ "${num_new_to_A}" -eq 0 ]] && [[ "${num_new_to_B}" -gt 0 ]];then
        echo "$A is ${num_new_to_B} commits ahead of $B"
    elif [[ "${num_new_to_A}" -gt 0 ]] && [[ "${num_new_to_B}" -eq 0 ]];then
        echo "$A is ${num_new_to_A} commits behind $B"
    elif [[ "${num_new_to_A}" -gt 0 ]] && [[ "${num_new_to_B}" -gt 0 ]];then
        echo "$A is diverged with $B, ${num_new_to_B} commits ahead and ${num_new_to_A} commits behind"
    else
        :
    fi
fi

比较masterorigin/master

bash foo.sh master origin/master