1. ホーム
  2. git

[解決済み] Git を使って、ある特定のブランチにのみ存在し、他のブランチには存在しないコミットをすべて表示する

2023-01-11 21:42:53

質問

あるブランチにおいて、以下のようなコミットの一覧を見たいと思います。 のみです。 であるコミットの一覧を見たいのです。 で この質問 では、どのコミットがあるブランチにあり、他の指定されたブランチにはないかを確認する方法について説明しました。

これは少し違います。 あるブランチにあるコミットで にもありません。 ブランチにはないコミットを見たいのです。

使用例としては、ブランチ戦略において、いくつかのブランチはマージされるだけで、直接コミットされることはないというものがあります。 これは、"merge-only" ブランチに直接コミットされたかどうかをチェックするために使用されます。

EDIT: 以下は、テスト用のダミー git リポジトリをセットアップする手順です。

git init
echo foo1 >> foo.txt
git add foo.txt
git commit -am "initial valid commit"
git checkout -b merge-only
echo bar >> bar.txt
git add bar.txt
git commit -am "bad commit directly on merge-only"
git checkout master
echo foo2 >> foo.txt 
git commit -am "2nd valid commit on master"
git checkout merge-only 
git merge master

メッセージ "bad commit directly on merge-only" を持つ、マージオンリーブランチに直接行われたコミットのみが表示されるはずです。

どのように解決するのですか?

私の親愛なる友人の好意で Redmumba :

git log --no-merges origin/merge-only \
    --not $(git for-each-ref --format="%(refname)" refs/remotes/origin |
    grep -Fv refs/remotes/origin/merge-only)

...ここで origin/merge-only は、リモートのマージ専用ブランチの名前です。 ローカルのみの git リポジトリで作業している場合は refs/remotes/originrefs/heads に置き換え、リモートブランチ名 origin/merge-only をローカルブランチ名 merge-only というように、つまり

git log --no-merges merge-only \
    --not $(git for-each-ref --format="%(refname)" refs/heads |
    grep -Fv refs/heads/merge-only)