マスターへのマージがない場合、の最後のエントリが必要なエントリにgit rev-list master..feature/new-branch
なります。リビジョンリストでは、履歴にないa..b
すべてのコミットが履歴に表示されます。ただし、マージしたので、機能/新ブランチの履歴のすべてのコミットもマスターの履歴に含まれるため、少し賢くする必要があります。b
a
あなたがリンクした質問(むしろ、それに対するこの答え)は非常に良いスタートを切ります。秘訣は、--first-parent
マスターへのすべてのマージの右側がマスターの履歴の一部であると見なさないようにすることです。git rev-list --first-parent master
マスターに直接コミットされたすべてのコミットを提供し、マージされたコミットは表示しません。残念ながら、私たちが望む方法で--first-parent
組み合わせることができない..
ので、を使用して独自の..
同等のものを作成する必要がありますdiff
。diff
機能/新ブランチの履歴にあるすべてのコミットのリストを取得し、マスターの「直接」履歴にあるすべてのコミットを削除するために使用できます。1つのコマンドを複数の行に分割するためにバックスラッシュエスケープを使用しました:-
diff --new-line-format=%L --old-line-format= --unchanged-line-format= \
<(git rev-list --first-parent master) \
<(git rev-list --first-parent feature/new-branch)
これを作成するオプションdiff
は、2番目の入力にある行のみを出力し、最初の入力にはない行を出力します。+または-のものはなく、ヘッダーもありません。私はPOSIXに精通していないので、GNUdiffだけがそれらのオプションを持っているのかもしれません。同様に<( )
、他の2行の演算子には、bashまたはzshが必要です。他のシェルを使用する必要がある場合は、おそらく一時ファイルを使用する必要があります。
最初の入力(無視する行の1つ)は、上記でわかったように、マスターするための「直接」履歴です。2番目の入力は、機能/新しいブランチの「直接」履歴です。コマンドの出力は、機能/新しいブランチに「直接」コミットされたすべてのコミットですが、「直接」マスターにはコミットされません。「直接」は「マージを介さない」ことを意味します。機能/新しい分岐に分岐する前--first-parent
にマスターにマージされたコミットが含まれないようにするには、2番目の入力に含める必要がありますが、機能/新しい分岐にマージされた他のブランチからのコミットを除外するという副作用があります。 (最初のコミットのみが必要な場合は、違いはありません)。
出力は通常どおり逆の順序であるため、出力の最後の行は目的のコミットです。
この情報はGitの世界のモデルにまったく適合していないように思われるため、この情報を使用して何を達成しようとしているのかを知りたいと思います。Gitユーザーは、ブランチの履歴にブランチの祖先からの履歴が含まれ、ブランチにマージされた履歴が含まれることを知っており、期待しています。