1. ホーム
  2. ギット

[解決済み] Git のコミットがどのブランチから来たかを調べる

2022-03-23 21:43:07

質問

あるコミットがどのブランチから来たものかを知る方法はありますか? SHA-1 ハッシュ値を教えてください。

Ruby Grit を使ってこれを実現する方法を教えてくれたらボーナスポイント。

どのように解決するのですか?

情報が直接保存されていないのはダヴの言うとおりですが、だからといって絶対に調べられないというわけではありません。以下は、あなたができるいくつかのことです。

コミットが行われたブランチを探す

git branch -a --contains <commit>

これは、指定されたコミットが履歴に残っているすべてのブランチを教えてくれます。明らかに、そのコミットがすでにマージされている場合はあまり役に立ちません。

リブログを検索する

コミットが行われたリポジトリで作業している場合、そのコミットの行をリブログで検索することができます。90日以上前のリブログはgit-gcによって刈り込まれるので、コミットが古すぎる場合は見つけることができません。とはいえ、こんなこともできます。

git reflog show --all | grep a871742

でコミットa871742を探します。コミットの最初の 7 桁を省略したものを使用しなければならないことに注意してください。 出力はこのようなものになるはずです。

a871742 refs/heads/completion@{0}: commit (amend): mpc-completion: total rewrite

は、そのコミットが "completion"ブランチ上で行われたことを示します。デフォルトの出力ではコミットハッシュが省略されて表示されるので、完全なハッシュを検索しないように注意しましょう。

git reflog show のエイリアスに過ぎません。 git log -g --abbrev-commit --pretty=oneline というわけで、出力フォーマットをいじって grep でさまざまなものを利用できるようにしたい場合は、これが出発点となります!

コミットが行われたリポジトリで作業していない場合、この場合にできることは reflog を調べてそのコミットがいつ初めてリポジトリに導入されたかを知ることです。運がよければ、そのコミットが行われたブランチを取得することができます。これは少し複雑で、コミットツリーと reflogs の両方を同時にたどることはできません。reflog の出力を解析し、それぞれのハッシュを調べて目的のコミットが含まれているかどうかを確認することになります。

後続のマージコミットを検索する

これはワークフローに依存しますが、良いワークフローでは、開発ブランチにコミットし、それをマージします。こんなことができます。

git log --merges <commit>..

を実行すると、指定されたコミットを先祖に持つマージコミットが表示されます。(そのコミットが一度だけマージされたものであれば、最初のコミットが目的のマージであるはずです。そうでなければ、いくつか調べてみる必要があるでしょう)。マージコミットメッセージには、マージされたブランチの名前が含まれていなければなりません。

もし、このようなことを当てにしたいのであれば、以下のように --no-ff オプションで git merge を使用すると、早送りの場合でも強制的にマージコミットを作成することができます。(あまり熱心になり過ぎないように。使い過ぎると難解になるかもしれません)。 関連する質問に対するVonCの回答 は、このトピックについて詳しく説明しています。