次のシェルコマンドは、あなたが望むことをするはずです:
git log --all --not $(git rev-list --no-walk --exclude=refs/heads/mybranch --all)
注意事項
チェックアウトした場合mybranch
、上記のコマンドは機能しません。これは、 のコミットmybranch
が からも到達可能HEAD
であるためです。そのため、Git はコミットが に固有のものであるとは見なしませんmybranch
。がチェックアウトされたときに機能させるにmybranch
は、除外対象も追加する必要がありますHEAD
。
git log --all --not $(git rev-list --no-walk \
--exclude=refs/heads/mybranch \
--exclude=HEAD \
--all)
ただし、がチェックアウトされていない限り、除外しないでください。そうしないと、 に排他的ではないコミットが表示される危険があります。HEAD
mybranch
mybranch
同様にorigin/mybranch
、ローカル ブランチに対応する名前のリモート ブランチがある場合はmybranch
、それを除外する必要があります。
git log --all --not $(git rev-list --no-walk \
--exclude=refs/heads/mybranch \
--exclude=refs/remotes/origin/mybranch \
--all)
また、リモート ブランチがリモート リポジトリのデフォルト ブランチである場合 (通常は のみに該当します)、同様origin/master
に除外する必要があります。origin/HEAD
git log --all --not $(git rev-list --no-walk \
--exclude=refs/heads/mybranch \
--exclude=refs/remotes/origin/mybranch \
--exclude=refs/remotes/origin/HEAD \
--all)
ブランチをチェックアウトし、リモート ブランチがあり、リモートブランチがリモート リポジトリのデフォルトである場合、多くを除外することになります。
git log --all --not $(git rev-list --no-walk \
--exclude=refs/heads/mybranch \
--exclude=HEAD
--exclude=refs/remotes/origin/mybranch \
--exclude=refs/remotes/origin/HEAD \
--all)
説明
このgit rev-list
コマンドは、指定されたリビジョンを調べて、検出された SHA1 識別子をダンプする低レベル (配管) コマンドです。git log
SHA1 のみが表示されることを除けば、ログ メッセージ、作成者名、タイムスタンプなどの「凝った」ものは表示されないという点を除けば、同等と考えてください。
このオプションは、名前が示すように、祖先の連鎖をたどる--no-walk
ことを防ぎます。git rev-list
したがって、入力git rev-list --no-walk mybranch
すると、1 つの SHA1 識別子のみが出力されます:mybranch
ブランチの先端コミットの識別子です。
--exclude=refs/heads/mybranch --all
引数は、 を除く各参照から開始するように指示しgit rev-list
ますrefs/heads/mybranch
。
そのため、 を実行するgit rev-list --no-walk --exclude=refs/heads/mybranch --all
と、Git は を除く各参照のチップ コミットの SHA1 識別子を出力しrefs/heads/mybranch
ます。これらのコミットとその祖先は、関心のないコミットです。これらは、表示したくないコミットです。
他のコミットはあなたが見たいものなので、出力を収集し、git rev-list --no-walk --exclude=refs/heads/mybranch --all
それらのコミットとその祖先以外のすべてを表示するように Git に指示します。
この--no-walk
引数は、大規模なリポジトリには必要です (これは小規模なリポジトリの最適化です): これがないと、Git は出力する必要があり、シェルは必要以上に多くのコミット ID を収集 (およびメモリに格納) する必要があります。大規模なリポジトリでは、収集されたコミットの数がシェルのコマンドライン引数の制限を簡単に超える可能性があります。
バグ?
私は次のように動作することを期待していました:
git log --all --not --exclude=refs/heads/mybranch --all
しかし、そうではありません。これは Git のバグだと思いますが、意図的なものかもしれません。