ベストアンサー1
GitHub 用語
枝
A
と枝はB
均等です。
GitHubの用語で
ブランチ
A
とブランチはB
同じコミットを指します。
2 つの枝は均等ですか?
もしあなたが興味があるのがかどうか2 つのブランチが偶数であるかどうか、追加の詳細 (コミット数など) なしで、スクリプトに適した方法は、単にそれらのヒントの SHA が等しいかどうかをテストすることです。
[ "$(git rev-parse <refA>)" = "$(git rev-parse <refB>)" ]
このコマンドを実行すると、 と が偶数の場合はの値は$?
になり、それ以外の場合は になります。このコマンドは Git の配管コマンド のみを使用するため、プログラムで安全に使用できます。0
<ref1>
<ref2>
1
git-rev-parse
一方の枝はもう一方の枝より先にありますか、それとも後にありますか?
GitHubの機能をエミュレートしたい場合、例えばprint
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
if ! git merge-base --is-ancestor "$revA" "$revB" && \
! git merge-base --is-ancestor "$revB" "$revA"
then
printf "$revA and $revB have diverged\n"
exit 1
fi
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
テスト
次の履歴を持つおもちゃのリポジトリを想定します。
* [develop]
/
... -- * [main, master]
\
* [release]
checkeven
次に、上記のスクリプトを呼び出すというGit エイリアスを定義すると、次のようになります...
$ git checkeven main develop
main is 1 commits behind develop
$ git checkeven develop main
develop is 1 commits ahead of main
$ git checkeven master main
master is even with main
$ git checkeven develop release
develop and release have diverged