La commande shell suivante devrait faire ce que vous voulez:
git log --all --not $(git rev-list --no-walk --exclude=refs/heads/mybranch --all)
Avertissements
Si vous avez mybranchvérifié, la commande ci-dessus ne fonctionnera pas. C'est parce que les validations mybranchsont également accessibles par HEAD, donc Git ne considère pas les validations comme uniques à mybranch. Pour le faire fonctionner lorsqu'il mybranchest extrait, vous devez également ajouter une exclusion pour HEAD:
git log --all --not $(git rev-list --no-walk \
--exclude=refs/heads/mybranch \
--exclude=HEAD \
--all)
Cependant, vous ne devez pas exclure HEADsauf si le mybranchest extrait, sinon vous risquez d'afficher des validations qui ne sont pas exclusives à mybranch.
De même, si vous avez une branche distante nommée origin/mybranchqui correspond à la mybranchbranche locale , vous devrez l'exclure:
git log --all --not $(git rev-list --no-walk \
--exclude=refs/heads/mybranch \
--exclude=refs/remotes/origin/mybranch \
--all)
Et si la branche distante est la branche par défaut du référentiel distant (généralement vrai uniquement pour origin/master), vous devrez également exclure 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)
Si vous avez extrait la branche et qu'il y a une branche distante et que la branche distante est la valeur par défaut pour le référentiel distant, vous finissez par exclure beaucoup:
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)
Explication
La git rev-listcommande est une commande de bas niveau (plomberie) qui parcourt les révisions données et sauvegarde les identificateurs SHA1 rencontrés. Considérez-le comme équivalent, git logsauf qu'il ne montre que le SHA1 - pas de message de journal, pas de nom d'auteur, pas d'horodatage, rien de tout cela "fantaisiste".
L' --no-walkoption, comme son nom l'indique, empêche git rev-listde parcourir la chaîne d'ascendance. Donc, si vous tapez, git rev-list --no-walk mybranchil n'imprimera qu'un seul identifiant SHA1: l'identifiant du commit de tip de la mybranchbranche.
Les --exclude=refs/heads/mybranch --allarguments indiquent git rev-listde commencer à partir de chaque référence à l'exception de refs/heads/mybranch.
Ainsi, lorsque vous exécutez git rev-list --no-walk --exclude=refs/heads/mybranch --all, Git affiche l'identifiant SHA1 de la validation de pointe de chaque référence, à l'exception de refs/heads/mybranch. Ces commits et leurs ancêtres sont les commits que vous ne vous intéresse en ce sont les commits vous ne pas voulez voir.
Les autres validations sont celles que vous souhaitez voir, nous collectons donc la sortie de git rev-list --no-walk --exclude=refs/heads/mybranch --allet demandons à Git de tout montrer sauf ces validations et leurs ancêtres.
L' --no-walkargument est nécessaire pour les grands référentiels (et est une optimisation pour les petits référentiels): sans lui, Git devrait imprimer, et le shell devrait collecter (et stocker en mémoire) beaucoup plus d'identifiants de validation que nécessaire. Avec un grand référentiel, le nombre de validations collectées pourrait facilement dépasser la limite d'argument de ligne de commande du shell.
Git bug?
Je m'attendais à ce que les éléments suivants fonctionnent:
git log --all --not --exclude=refs/heads/mybranch --all
mais ce n'est pas le cas. Je suppose que c'est un bug dans Git, mais c'est peut-être intentionnel.