93 votes

L'utilisation de Git, montrer à tous les commits qui existent *uniquement* sur une branche spécifique, et non pas *tous* les autres

Donné une direction, je voudrais voir une liste des commits qui existent uniquement sur cette branche. Dans cette question, nous discutons des moyens de voir les commits sont sur une branche, mais pas une ou plusieurs autres branches.

C'est un peu différent. J'aimerais voir les commits sont sur une branche, mais pas sur toutes les autres branches.

Le cas d'utilisation est une ramification de la stratégie de certaines branches ne doit être fusionné, et n'a jamais commis directement sur. Ce serait utilisée pour vérifier si une livraison n'ait été faite directement sur une "fusion" uniquement " de la branche.

EDIT: ci-Dessous sont les étapes pour configurer un mannequin repo git pour tester:

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"
git checkout merge-only 
git merge master

Seule la validation avec le message "bad s'engager directement sur la fusion-seulement", qui a été faite directement sur la fusion seule branche, devrait s'afficher.

80voto

wrtsprt Points 741

Mon collègue viens de trouver cette élégante solution git log --first-parent --no-merges. Dans votre exemple de cours de la première commettre encore présente.

30voto

jimmyorr Points 3004

Courtoisie de mon cher ami, Redmumba:

git log --no-merges origin/merge-only \
    --not $(git for-each-ref --format="%(refname)" refs/remotes/origin |
    grep -Fv refs/remotes/origin/merge-only)

...où est - origin/merge-only est votre distance de fusion uniquement nom de la branche. Si vous travaillez sur un local uniquement, repo git, substitut refs/remotes/origin avec refs/heads, et de substituer à distance nom de la branche origin/merge-only avec la branche locale de nom merge-only, c'est à dire:

git log --no-merges merge-only \
    --not $(git for-each-ref --format="%(refname)" refs/heads |
    grep -Fv refs/heads/merge-only)

12voto

grzuy Points 1695

Cela pourrait peut-être aider:

git show-branche

7voto

manojlds Points 96599

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.

2voto

JaimeJorge Points 1202

Une autre variation de l'réponses acceptées, à utiliser avec master

git log origin/master --not $(git branch -a | grep -Fv master)

Filtre tous les commits qui se produisent dans n'importe quelle branche master.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X