次のシェルコマンドはあなたが望むことをするはずです:
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
すると、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のバグだと思いますが、おそらく意図的なものです。