[解決済み] Git のコミットがどのブランチから来たかを調べる
質問
あるコミットがどのブランチから来たものかを知る方法はありますか? 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の回答
は、このトピックについて詳しく説明しています。
関連
-
[解決済み] Git で直近のローカルコミットを取り消すには?
-
[解決済み] Gitブランチをローカルやリモートで削除するには?
-
[解決済み] git pull」と「git fetch」の違いは何ですか?
-
[解決済み] コミット前に 'git add' を取り消すにはどうすればよいですか?
-
[解決済み] リモートのGitブランチをチェックアウトするには?
-
[解決済み] Git リポジトリを以前のコミットに戻すにはどうすればよいですか?
-
[解決済み] コミットに含まれるすべてのファイルを一覧表示するにはどうすればよいですか?
-
[解決済み] Git リポジトリで削除されたファイルを検索して復元する方法
-
[解決済み] Git で最新のコミットを新しいブランチに移動する
-
[解決済み】ローカルのGitブランチの名前を変更するには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Git サブモジュール head 'reference is not a tree' エラー
-
[解決済み] git rebase fatal: 必要なリビジョンは1つです。
-
[解決済み】マージが終了していません(MERGE_HEADは存在します)。
-
[解決済み] git stashを元に戻す
-
[解決済み] GitのFETCH_HEADとはどういう意味ですか?
-
[解決済み] コミット ID が与えられた場合、現在のブランチにそのコミットが含まれているかどうかを判断する方法は?
-
[解決済み] Git で現在のブランチ名を取得するには?
-
[解決済み] なぜ git はデフォルトで fast-forward マージを行うのですか?
-
[解決済み] Gitブランチの最も近い親を見つける方法
-
[解決済み】特定のコミットを含むマージコミットを検索する