コミットがどのブランチから来たのかを知る方法はありますか?SHA-1ハッシュ値?
Ruby Grit を使用してこれを実現する方法を教えていただければ、ボーナス ポイントがもらえます。
ベストアンサー1
Dav の言うとおり、情報は直接保存されませんが、だからといって見つけられないというわけではありません。できることがいくつかあります。
コミットがあるブランチを見つける
git branch -a --contains <commit>
これにより、履歴内に指定されたコミットを持つすべてのブランチが表示されます。コミットがすでにマージされている場合、これは明らかにあまり役に立ちません。
reflogを検索
コミットが行われたリポジトリで作業している場合は、そのコミットの行を reflog で検索できます。90 日以上前の reflog は git-gc によって削除されるため、コミットが古すぎる場合は見つかりません。ただし、次のようにすることができます。
git reflog show --all | grep a871742
コミット a871742 を検索します。コミットの最初の 7 桁を省略して使用する必要があることに注意してください。出力は次のようになります。
a871742 refs/heads/completion@{0}: commit (amend): mpc-completion: total rewrite
コミットがブランチ「完了」で行われたことを示します。デフォルトの出力では短縮されたコミット ハッシュが表示されるため、完全なハッシュを検索しないでください。そうしないと何も見つかりません。
git reflog show
は実際には のエイリアスにすぎないgit log -g --abbrev-commit --pretty=oneline
ので、出力形式をいじって grep でさまざまなものを検索できるようにしたい場合は、これが出発点になります。
コミットが行われたリポジトリで作業していない場合、この場合にできる最善のことは、reflog を調べて、コミットがリポジトリに最初に導入された時期を見つけることです。運が良ければ、コミットされたブランチを取得できます。これは、コミット ツリーと reflog の両方を同時に調べることができないため、少し複雑です。reflog 出力を解析し、各ハッシュを調べて、目的のコミットが含まれているかどうかを確認する必要があります。
後続のマージコミットを見つける
これはワークフローに依存しますが、適切なワークフローでは、開発ブランチでコミットが行われ、その後マージされます。次のように実行できます。
git log --merges <commit>..
指定したコミットを祖先とするマージコミットを表示します。(コミットが 1 回だけマージされた場合、最初のコミットが目的のマージになります。そうでない場合は、いくつか調べる必要があると思います。) マージコミット メッセージには、マージされたブランチ名が含まれている必要があります。
これを確実に実行したい場合は、早送りの場合でもマージコミットの作成を強制する--no-ff
オプションを使用することをお勧めしますgit merge
。(ただし、あまり熱心になりすぎないでください。使いすぎるとわかりにくくなる可能性があります。)関連する質問に対するVonCの回答このトピックについて詳しく説明してくれて助かります。