2 つのブランチが「偶数」であるかどうかを確認するにはどうすればよいですか? 質問する

2 つのブランチが「偶数」であるかどうかを確認するにはどうすればよいですか? 質問する

GitHub ウェブ インターフェースには、ブランチがブランチと一致しているかどうかを知らせてくれる便利な機能がありますmaster

この機能に相当するコマンドライン機能はありますか? 複数のリポジトリを操作しており、ブランチが均等であるか、注意が必要かどうかをすばやく確認する方法を探しています。

この機能について疑問に思っている人のために、GitHub Web インターフェースのスクリーンショットを以下に示します。

ここに画像の説明を入力してください

ここに画像の説明を入力してください

ベストアンサー1

GitHub 用語

Aと枝はB均等です。

GitHubの用語で

ブランチAとブランチはB同じコミットを指します。

2 つの枝は均等ですか?

もしあなたが興味があるのがかどうか2 つのブランチが偶数であるかどうか、追加の詳細 (コミット数など) なしで、スクリプトに適した方法は、単にそれらのヒントの SHA が等しいかどうかをテストすることです。

[ "$(git rev-parse <refA>)" = "$(git rev-parse <refB>)" ]

このコマンドを実行すると、 と が偶数の場合はの値は$?になり、それ以外の場合は になります。このコマンドは Git の配管コマンド のみを使用するため、プログラムで安全に使用できます。0<ref1><ref2>1git-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

おすすめ記事