5

ブランチの最初のコミットを決定しようとしています。私は他のさまざまなSO投稿(Gitで分岐点を見つけることを含む)を読みましたが、それらは私が求めているものを私に与えません。

ブランチグラフを見ると、ブランチがマスターから分岐した時期を判断できることがわかります(含まれている画像では、「マスターでの2番目のコミット」からの紫色の線)が、これをテキストで複製することはできません。コマンドラインツール(git log --graph動作しますが、私が求めているものではありません)。

私が求めているコミットは0124fc8、つまり、機能/新しいブランチへの最初のコミットです。

マスターへのすべてのマージは。で行われ--no-ffます。

私は試しましたがgit merge-base feature/new-branch master、これは私に与えます0f5e36f--all同じことをします)

私も試しましgit rev-list --boundary feature/new-branch...masterたが、いくつかのコミットがありますが、どれも私が望むものではありません。

ブランチグラフを示すSourceTree

4

1 に答える 1

5

マスターへのマージがない場合、の最後のエントリが必要なエントリにgit rev-list master..feature/new-branchなります。リビジョンリストでは、履歴にないa..bすべてのコミットが履歴に表示されます。ただし、マージしたので、機能/新ブランチの履歴のすべてのコミットもマスターの履歴に含まれるため、少し賢くする必要があります。ba

あなたがリンクした質問(むしろ、それに対するこの答え)は非常に良いスタートを切ります。秘訣は、--first-parentマスターへのすべてのマージの右側がマスターの履歴の一部であると見なさないようにすることです。git rev-list --first-parent masterマスターに直接コミットされたすべてのコミットを提供し、マージされたコミットは表示しません。残念ながら、私たちが望む方法で--first-parent組み合わせることができない..ので、を使用して独自の..同等のものを作成する必要がありますdiffdiff機能/新ブランチの履歴にあるすべてのコミットのリストを取得し、マスターの「直接」履歴にあるすべてのコミットを削除するために使用できます。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ユーザーは、ブランチの履歴にブランチの祖先からの履歴が含まれ、ブランチにマージされた履歴が含まれることを知っており、期待しています。

于 2012-10-19T11:49:56.863 に答える