O seguinte comando shell deve fazer o que você deseja:
git log --all --not $(git rev-list --no-walk --exclude=refs/heads/mybranch --all)
Ressalvas
Se você mybranchfez o check-out, o comando acima não funcionará. Isso porque os commits on mybranchtambém são acessíveis HEAD, então o Git não considera os commits exclusivos mybranch. Para que ele funcione quando o mybranchcheck-out é feito, você também deve adicionar uma exclusão para HEAD:
git log --all --not $(git rev-list --no-walk \
--exclude=refs/heads/mybranch \
--exclude=HEAD \
--all)
No entanto, você não deve excluir a HEADmenos que o mybranchcheck-out esteja marcado, caso contrário corre o risco de mostrar confirmações que não são exclusivas mybranch.
Da mesma forma, se você tiver uma ramificação remota chamada origin/mybranchque corresponda à mybranchramificação local , será necessário excluí-la:
git log --all --not $(git rev-list --no-walk \
--exclude=refs/heads/mybranch \
--exclude=refs/remotes/origin/mybranch \
--all)
E se a ramificação remota for a ramificação padrão para o repositório remoto (geralmente apenas verdadeiro origin/master), você também terá que excluir 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)
Se você tiver feito o check-out da ramificação, e houver uma ramificação remota, e a ramificação remota for o padrão para o repositório remoto, você acaba excluindo muito:
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)
Explicação
O git rev-listcomando é um comando de nível inferior (encanamento) que percorre as revisões fornecidas e despeja os identificadores SHA1 encontrados. Pense nisso como equivalente a, git logexceto que mostra apenas o SHA1 - nenhuma mensagem de log, nenhum nome de autor, nenhum registro de data e hora, nada disso "sofisticado".
A --no-walkopção, como o nome indica, impede git rev-listde percorrer a cadeia ancestral. Portanto, se você digitar git rev-list --no-walk mybranch, imprimirá apenas um identificador SHA1: o identificador da confirmação de ponta da mybranchramificação.
Os --exclude=refs/heads/mybranch --allargumentos dizem git rev-listpara começar a partir de cada referência, exceto refs/heads/mybranch.
Portanto, quando você executa git rev-list --no-walk --exclude=refs/heads/mybranch --all, o Git imprime o identificador SHA1 da confirmação da dica de cada referência, exceto refs/heads/mybranch. Esses commits e seus ancestrais são os commits nos quais você não está interessado - esses são os commits que você não deseja ver.
Os outros commits são os que você deseja ver, então coletamos a saída git rev-list --no-walk --exclude=refs/heads/mybranch --alle pedimos ao Git para mostrar tudo, exceto esses commits e seus ancestrais.
O --no-walkargumento é necessário para repositórios grandes (e é uma otimização para repositórios pequenos): sem ele, o Git precisaria imprimir e o shell precisaria coletar (e armazenar na memória) muito mais identificadores de confirmação do que o necessário. Com um repositório grande, o número de confirmações coletadas pode facilmente exceder o limite de argumentos da linha de comando do shell.
Bug do Git?
Eu esperava que o seguinte funcionasse:
git log --all --not --exclude=refs/heads/mybranch --all
mas isso não acontece. Acho que isso é um bug no Git, mas talvez seja intencional.