2

定期的にマージされる多くのブランチがあります。つまり、A を B にマージし、次に B を C にマージし、次に A を D に、D を C にマージすることができます。私が知っているコミット X があるとします。元々は A で導入され、その後何らかの方法で C にマージされました (git log C を実行するとわかります)。どのマージ (どのマージ コミット) がコミット X をブランチ C にもたらしたかを調べる方法はありますか?

4

1 に答える 1

5

通常、私は次のようなことをします。

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 番目の親エッジを描画します)。

于 2012-07-07T16:42:28.527 に答える