Essayez ceci:
git rev-list --all --not $(git rev-list --all ^branch)
Fondamentalement, git rev-list --all ^branch
obtient toutes les révisions de pas dans la branche et puis vous avez toutes les révisions dans le repo et soustraire de la liste précédente qui est la révision uniquement dans la branche.
Après @Brian commentaires:
À partir de git rev-liste de la documentation:
List commits that are reachable by following the parent links from the given commit(s)
Si une commande comme celle - git rev-list A
où A est un à valider la liste des commits qui sont accessible à partir d'Une inclusif de l'A.
Avec cela à l'esprit, quelque chose comme
git rev-list --all ^A
liste commet pas accessible à partir d'Une
Donc, git rev-list --all ^branch
liste de tous les commet pas accessible à partir de l'extrémité de la branche. Qui va supprimer tous les commits de la branche, ou en d'autres termes s'engage qui ne sont que dans les autres branches.
Maintenant, venons-en à l' git rev-list --all --not $(git rev-list --all ^branch)
Ce sera comme l' git rev-list --all --not {commits only in other branches}
Si nous voulons liste all
qui ne sont pas accessibles à partir de all commits only in other branches
Qui est l'ensemble de commits qui sont seulement dans la branche. Prenons un exemple simple:
master
|
A------------B
\
\
C--------D--------E
|
branch
Ici le but est de se D et E, les engage pas dans une autre branche.
git rev-list --all ^branch
ne donnent que B
Maintenant, git rev-list --all --not B
est ce que l'on en est là. Ce qui est également git rev-list -all ^B
- nous voulons que tous s'engage à ne pas accessible à partir de B. Dans notre cas, il s est D et E. Qui est ce que nous voulons.
L'espoir c'est ce qui explique comment la commande fonctionne correctement.
Edit après le commentaire:
git init
echo foo1 >> foo.txt
git add foo.txt
git commit -am "initial valid commit"
git checkout -b merge-only
echo bar >> bar.txt
git add bar.txt
git commit -am "bad commit directly on merge-only"
git checkout master
echo foo2 >> foo.txt
git commit -am "2nd valid commit on master"
Après les étapes ci-dessus, si vous faites un git rev-list --all --not $(git rev-list --all ^merge-only)
, vous obtiendrez la livraison vous avez été à la recherche pour - "bad commit directly on merge-only"
on.
Mais une fois que vous faites l'étape finale dans vos démarches git merge master
de la commande ne donnera pas le résultat escompté. Car à partir de maintenant il n'y a pas de commettre ce n'est pas là dans la fusion-seulement depuis un supplément de commettre en maître a aussi été fusionnés pour fusionner seule. Donc, git rev-list --all ^branch
donne un résultat vide et, par conséquent git rev-list -all --not $(git rev-list --all ^branch)
donnera tous les commits de fusion-seulement.