特定のコミットを含むブランチをリストする方法は?


1088

どのブランチに特定のコミットが含まれているのかを調べるためにgitにクエリを実行するには gitkブランチが多すぎる場合を除いて、通常はブランチが一覧表示されます。その場合は、「many(38)」などのように表示されます。完全なリスト、または少なくとも特定のブランチにコミットが含まれているかどうかを知る必要があります。



コメントごとにコミット同等のための関連質問:stackoverflow.com/questions/16304574/...
UpAndAdam

回答:


1471

gitのブランチマニュアルページ

 git branch --contains <commit>

指定されたコミット(指定されていない場合はHEAD)を含むブランチのみをリストします。意味し--listます。


 git branch -r --contains <commit>

「リモートブランチと直接的な関係を持つローカルブランチ」であるリモートトラッキングブランチも(user3941992の以下の回答で述べたように)リストします。


このgit readyの記事も参照してください。

この--containsタグは、特定のコミットがブランチにまだ導入されているかどうかを判断します。おそらく、適用したと思われるパッチからのコミットSHAを持っているか、メモリ使用量を75%削減するお気に入りのオープンソースプロジェクトのコミットがまだあるかどうかを確認したいだけです。

$ git log -1 tests
commit d590f2ac0635ec0053c4a7377bd929943d475297
Author: Nick Quaranto <nick@quaran.to>
Date:   Wed Apr 1 20:38:59 2009 -0400

    Green all around, finally.

$ git branch --contains d590f2
  tests
* master

注:コミットがリモート追跡ブランチ上にある場合は、-aオプションを追加します
MichielBが以下にコメントするように

git branch -a --contains <commit>

MatrixFrogは、どのブランチがその正確なコミットを含むかを示すだけであるとコメントしています。
「同等の」コミットが含まれているブランチ(つまり、どのブランチがそのコミットを選択したか)を知りたい場合は、次のようになりますgit cherry

git cherry はコミットID(sha1)ではなくチェンジセットを比較するため、を使用git cherryして、ローカルで行ったコミットが<upstream>別のコミットIDで適用されているかどうかを確認できます。
たとえば、<upstream>コミットを直接プッシュまたはプルするのではなく、電子メールでパッチをフィードしている場合に、これが発生します。

           __*__*__*__*__> <upstream>
          /
fork-point
          \__+__+__-__+__+__-__+__> <head>

(ここでは、「-」とマークされたコミットはに表示されません。git cherryつまり、それらはすでにに存在してい<upstream>ます。)


3
testsそしてmaster- masterそれゆえ、アスタリスク現在のブランチです。
ブルー染色された'25年

54
これは、どのブランチがその正確なコミットを含むかを示すだけです。あなたは(つまり、どの枝が桜摘みコミット持って)コミット「同等」を含むどの枝を知りたい場合だとgit cherry:「gitの桜がチェンジではなく、コミットID(SHA1)を比較しているので、あなたが見つけるためにgitの桜を使用することができますローカルで行ったコミットが別のコミットIDで<upstream>に適用されている場合。たとえば、コミットを直接プッシュまたはプルするのではなく、メールで<upstream>にパッチをフィードしている場合に発生します。」kernel.org/pub/software/scm/git/docs/git-cherry.html
MatrixFrog 2011

62
-aリモートブランチもチェックするパラメータを追加します。
ラマン2012年

28
あなたも行うことができますgit tag --contains <commit>コミットを含むすべてのタグの検索を参照してください
アンドリューマーシャル

5
git cherry@UpAndAdamがここで質問をした部分について:stackoverflow.com/questions/16304574/…、悲しいかな、質問は(まだ)回答されていません。
adeelx 2014

22

あなたは走ることができます:

git log <SHA1>..HEAD --ancestry-path --merges

出力の最後のコミットのコメントから、元のブランチ名を見つけることができます

例:

       c---e---g--- feature
      /         \
-a---b---d---f---h---j--- master

git log e..master --ancestry-path --merges

commit h
Merge: g f
Author: Eugen Konkov <>
Date:   Sat Oct 1 00:54:18 2016 +0300

    Merge branch 'feature' into master

6
いいね!私git log <SHA1>..master --ancestry-path --merges --oneline | tail -n1はこれを1行で取得していました
James EJ

1
あなたは純粋なのgitコマンドを使用したい場合は、使用することができます:git log <SHA1>..master --ancestry-path --merges --oneline -1
バルトシュ

注:コミットshaがmaster / fooブランチ(HEAD)の最新のコミットである場合... A..Bコミット範囲を実行することはできません。次のような範囲は使用しないでください:: git log HEAD --oneline -1> 82c12a9 (HEAD, origin/remote-branch-name, origin/master, origin/dev, origin/HEAD, master, dev) commit message
Devin G Rhode

このgitリポジトリがサブモジュールであり、切り離されたHEAD問題を解決しようとしている場合...優先ブランチについて難しい質問があります...前の例でmasterは、このリストにある場合は常にそれが優先されると簡単に言うことができます。そこからはあまり明確ではありません。.gitmodulesファイルからgitブランチを読み取ってみてくださいgit config -f .gitmodules submodule.src/foo/submodule.branch。これは、長年のフォーク/広報である可能性があります。cdしてrepo rootにして実行しgit config submodule.src/foo/submodule.branchます。スーパープロジェクトの現在のgitブランチを使用することもできます。
Devin G Rhode

余談小さな通り:git config submodule.src/foo/submodule.branchレポローカル.gitconfigファイルを含むgitのコンフィグ、任意の様々な影響を受けることができます。(実行する必要がありますgit config --local include.path ./path/to/your/.gitconfig
Devin G Rhode
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.