次のシェルコマンドは、あなたが望むことをするはずです:
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)
ただし、がチェックアウトされていない限り、除外しないでください。そうしないと、 に排他的ではないコミットが表示される危険があります。HEADmybranchmybranch
同様に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 logSHA1 のみが表示されることを除けば、ログ メッセージ、作成者名、タイムスタンプなどの「凝った」ものは表示されないという点を除けば、同等と考えてください。
このオプションは、名前が示すように、祖先の連鎖をたどる--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 のバグだと思いますが、意図的なものかもしれません。