私がやろうとしていることは、バージョンチェックです。私は、コードが最小限のバージョンの上にあることを保証したいのです。そのため、現在のブランチに指定したコミットが含まれているかどうかを知る方法が必要です。
この結果を得るには、複数の方法があります。最初の素朴な方法は、git log
を使って grep
で特定のコミットを検索することですが、これは必ずしも正確ではありません。
git log | grep <commit_id>
git branchを直接使用して、指定した
COMMIT_ID` を含むすべてのブランチを検索するほうがよいでしょう。
git branch --contains $COMMIT_ID
次のステップは現在のブランチを見つけることで、これは git 1.8.1
以降のバージョンでは
git symbolic-ref --short HEAD
として、一緒に組み合わせる。
git branch $(git symbolic-ref --short HEAD) --contains $COMMIT_ID
しかし、上記のコマンドはtrueかfalseを返さないので、コミットが現在のブランチにあれば終了コード0、なければ終了コード1を返す短縮版があります。
git merge-base --is-ancestor $COMMIT_ID HEAD
終了コードはいいのですが、答えとして文字列 true
または false
が欲しいので、もう少し追加する必要があり、bash の if
と組み合わせると、次のようになります。
if [ 0 -eq $(git merge-base --is-ancestor $COMMIT_ID HEAD) ]; then echo "true"; else echo "false"; fi
特定のコミットを含むブランチのリストを取得します。
# get all the branches where the commit exists
$ git branch --contains <commit-id>
ブランチに特定のコミットがあるかどうかを確認します。
# output the branch-name if the commit exists in that branch
$ git branch --contains <commit-id> | grep <branch-name>
ブランチ(例えばfeature
)を完全一致で検索します。
$ git branch --contains <commit-id> | grep -E '(^|\s)feature$'
**例えば、feature
、feature1
、feature2
という3つのローカルブランチがある場合、以下のようになります。
$ git branch --contains <commit-id> | grep 'feature'
# output
feature
feature1
feature2
$ git branch --contains <commit-id> | grep -E '(^|\s)feature$'
# output
feature
また、local
とremote
の両方のブランチを検索したり(-a
を使用)、remote
のブランチのみを検索したり(-r
を使用)することができます。
# search in both 'local' & 'remote' branches
$ git branch -a --contains <commit-id> | grep -E '(^|\s)feature$'
# search in 'remote' branches
$ git branch -r --contains <commit-id> | grep -E '(^|\s)feature$'
答えとして@torekによって抽出されたコメント:
指定されたコミットを含むすべてのブランチを見つける方法については、提案された複製を参照してください。
git merge-base --is-ancestor
を使用します。 CがHEADの祖先である場合、現在のブランチにはCが含まれているため、次のようになります。if git merge-base --is-ancestor $hash HEAD; then
echo I contain commit $hash
else
echo I do not contain commit $hash
fi
(サイドノート:シェルスクリプトでは、ゼロを出るコマンドは「true」ですが、nonzeroを出るコマンドは「false」です。)。
うん別の選択肢:
。 git rev-list<ブランチ名> | grep `git rev-parse< commit>`。
。
これは、「git branch --contains」が機能しない「remotes / origin / master」などのローカルにキャッシュされたリモートブランチでも動作するため、私にとって最も効果的です。
これは、「現在のブランチ」だけに関するOPの質問以上のものをカバーしていますが、この質問の「任意のブランチ」バージョンを尋ねるのは馬鹿げているので、とにかくここに投稿することにしました。
この質問にはスクリプトに関する優れた答えがいくつかあるので、お気に入りを追加します。
これは、最後の $ n
が $ br
でコミットするために、どのブランチにそれぞれが含まれているかを示します。
br=mybranch
n=10
git log --oneline -n$n $br | awk '{print; system("git branch --contains "$1)}'
これは似ていますが、ブランチのリストでも同じです。
br="mybranch yourbranch herbranch"
n=4
for br in $brs; do git log --oneline -n$n $br | awk '{print; system("git branch --contains "$1)}'; done