次のシェルコマンドはあなたが望むことをするはずです:
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 logSHA1のみを表示することを除いて、それと同等であると考えてください。ログメッセージ、作成者名、タイムスタンプ、その「派手な」ものはありません。
この--no-walkオプションは、名前が示すようにgit rev-list、祖先チェーンを歩くことを防ぎます。したがって、入力git rev-list --no-walk mybranchすると、SHA1識別子が1つだけ出力されます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は印刷しなければならない、とシェルは(メモリ内と店舗)を収集しなければならない多くの人が必要以上の識別子をコミットします。大きなリポジトリでは、収集されたコミットの数がシェルのコマンドライン引数の制限を簡単に超える可能性があります。
Gitバグ?
私は以下がうまくいくと期待していました:
git log --all --not --exclude=refs/heads/mybranch --all
しかし、そうではありません。これはGitのバグだと思いますが、おそらく意図的なものです。