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 mybranch
vérifié, la commande ci-dessus ne fonctionnera pas. C'est parce que les validations mybranch
sont également accessibles par HEAD
, donc Git ne considère pas les validations comme uniques à mybranch
. Pour le faire fonctionner lorsqu'il mybranch
est 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 HEAD
sauf si le mybranch
est 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/mybranch
qui correspond à la mybranch
branche 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-list
commande 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 log
sauf 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-walk
option, comme son nom l'indique, empêche git rev-list
de parcourir la chaîne d'ascendance. Donc, si vous tapez, git rev-list --no-walk mybranch
il n'imprimera qu'un seul identifiant SHA1: l'identifiant du commit de tip de la mybranch
branche.
Les --exclude=refs/heads/mybranch --all
arguments indiquent git rev-list
de 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 --all
et demandons à Git de tout montrer sauf ces validations et leurs ancêtres.
L' --no-walk
argument 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.