GitHub 术语
分支A 和分支B 是偶数。
是 GitHub 的说法
Branch A 和 Branch B 指向同一个提交。
两个分支是否相等?
如果您只对是否这两个分支感兴趣,没有任何额外的细节(例如提交计数),脚本友好的方法是简单地测试它们的提示的 SHA平等:
[ "$(git rev-parse <refA>)" = "$(git rev-parse <refB>)" ]
运行此命令后,如果<ref1>和<ref2>是偶数,则$?的值为0,否则为1。因为这个命令只涉及到管道 Git 命令git-rev-parse,所以它可以安全地以编程方式使用。
一个分支是在另一个分支之前还是之后?
如果您想模拟 GitHub 的功能,例如打印
foo 是在 bar 之前的 n 次提交
等等,你可以使用下面的脚本:
#!/bin/sh
# git-checkeven.sh
#
# Check whether two revisions are even, and, otherwise, to what extent
# the first revision is ahead of / behind the second revision
#
# Usage: git checkeven <revA> <revB>
#
# To make a Git alias called 'checkeven' out of this script,
# put the latter on your search path, and run
#
# git config --global alias.checkeven '!sh git-checkeven.sh'
if [ $# -ne 2 ]; then
printf "usage: git checkeven <revA> <revB>\n\n"
exit 2
fi
revA=$1
revB=$2
nA2B="$(git rev-list --count $revA..$revB)"
nB2A="$(git rev-list --count $revB..$revA)"
if [ "$nA2B" -eq 0 -a "$nB2A" -eq 0 ]; then
printf "$revA is even with $revB\n"
exit 0
elif [ "$nA2B" -gt 0 ]; then
printf "$revA is $nA2B commits behind $revB\n"
exit 1
else
printf "$revA is $nB2A commits ahead of $revB\n"
exit 1
fi
测试
假设一个玩具仓库具有以下历史:
... -- * [release71]
\
* [master, develop]
然后,在定义了一个名为checkeven 的 Git 别名来调用上面的脚本之后,你会得到...
$ git checkeven release71 develop
release71 is 1 commits behind develop
$ git checkeven develop release71
develop is 1 commits ahead of release71
$ git checkeven master develop
master is even with develop