定期的にマージされる多くのブランチがあります。つまり、A を B にマージし、次に B を C にマージし、次に A を D に、D を C にマージすることができます。私が知っているコミット X があるとします。元々は A で導入され、その後何らかの方法で C にマージされました (git log C を実行するとわかります)。どのマージ (どのマージ コミット) がコミット X をブランチ C にもたらしたかを調べる方法はありますか?
1 に答える
通常、私は次のようなことをします。
git log --oneline --ancestry-path --merges <commit-of-interest>..C
ここでの引数は重要です。これにより、git は の子孫であり、かつ の祖先で--ancestry-path
もあるコミットのみを表示します。このオプションは、結果のリストをさらにフィルタリングして、マージ コミットのみを表示します。<commit-of-interest>
C
--merges
印刷された各マージは、次のカテゴリのいずれかに分類されます。
<commit-of-interest>
ブランチに持ち込まれたマージ- マージにより、別のブランチがすでにあるブランチに持ち込まれました
<commit-of-interest>
- 両方の親ブランチがすでに
<commit-of-interest>
最初のカテゴリは、関心のあるカテゴリです。通常、マージがどのカテゴリに属しているかは、コミットの件名を見ればわかります。リストの一番下から始めます。最も古いマージは、最初のカテゴリに含まれる可能性が最も高くなります。
2 番目と 3 番目のカテゴリのマージを除外するスクリプトを作成することは技術的に可能ですが (マージの最初の親から到達可能かどうかをテストするだけです<commit-of-interest>
)、必要だとは思いませんでした。
コミット履歴をさらに詳しく調べる必要がある場合は、履歴グラフを確認することをお勧めします。
git log --oneline --graph --color --decorate \
--ancestry-path <commit-of-interest>..C
--boundary
あまりにも多くのノイズが追加されることもありますが、あなたも投げ入れたいかもしれません. を使用することもできますgitk
が、残念ながら、それが描画するグラフは正しい順序で親子関係を示していません (gitk
左側のマージとその 2 番目の親の間のエッジを描画する場合があります。git log --graph
常に右側の 2 番目の親エッジを描画します)。