Git: Comment lister les commits sur cette branche mais pas à partir de branches fusionnées

90

Supposons que votre historique de validation git ressemble à ceci:

A---B---C---D---E---F master
     \         /
      X---Y---Z topic

Est-il possible d'avoir git list uniquement les commits sur master, AF? En d'autres termes, si le commit était sur une branche fusionnée, je ne veux pas qu'il s'affiche.

wch
la source
2
Alors, comment git saurait-il lequel de Det Zfaisait partie de la branche fusionnée?
Romain
2
Lorsqu'ils sont fusionnés à partir de master, les validations de master précédentes sont les premiers parents de la fusion. git logpermet d'afficher uniquement ces commits avec --first-parent, donc vous obtenez le bon truc
CharlesB

Réponses:

133

git loga l'option --first-parent, donc vous n'obtiendrez pas d' topichistoire.

Lorsqu'ils sont fusionnés master, les mastercommits sont les premiers parents de la fusion. Git log permet d'afficher uniquement ces commits avec --first-parent, donc vous obtenez les bons éléments.

CharlesB
la source
25
+1 --first-parentdoes it :) combiné avec --no-mergesvous pouvez masquer les commits de fusion
c00kiemon5ter
J'ai voté pour, mais cela semble toujours excessif par rapport à ma réponse
UpAndAdam
22

TLDR :git log origin/master --no-merges vous donnera un journal de master et exclura tous les commits fusionnés (dans ce cas x, y, z)

Points d'origine

Il existe une autre façon générale de procéder qui ne dépend pas et --first-parentqui sera utile dans certaines situations. En utilisant les filtres d'exclusion de branche

git log origin/topic ^origin/master Cela vous donnera un journal de origin/topictous origin/masterles commits supprimés.

vous pouvez également ajouter --no-mergesqui cachera les commits de fusion que vous voudrez ou non.

Un autre conseil pratique est d'utiliser à la shortlogplace de logce qui vous donnera plus d'un résumé abrégé qui peut être pratique pour les notes de publication ou la communication de ce qui se trouve dans une branche.

Mise à jour
Après avoir relu ceci, vous voudriez en fait presque l'inverse de ce que j'ai publié; cependant, cela finirait par exclure tout ce qui est sur master et foo ( git log origin/master ^origin/foo). Cependant, vous pouvez également obtenir ce que vous demandez (masquer tous les commits qui font partie des fusions) avecgit log origin/master --no-merges

UpAndAdam
la source
0

Answer by Charles travaille pour moi.

git log has option --first-parent --no-merges, so you won't get topic history.

Mais si vous utilisez une interface utilisateur graphique pour vos activités Git comme, Git Extension, SourceTree, Tortoise Git,

Ensuite, il existe des options directes pour vérifier le premier parent dans vos outils. J'ai pensé ajouter cette réponse à la liste car la plupart des gens trouvent l'interface graphique facile. et Vous pouvez directement sélectionner tous les commits de cette branche particulière de l'outil, si nécessaire.

J'ai joint l'exemple de deux outils, ce serait similaire pour d'autres outils également: [J'ai estompé le nom d'utilisateur, le nom du repo git car il s'agit d'un dépôt privé, mais vous pouvez toujours avoir une idée de la façon d'utiliser le premier parent à partir des outils ]

  1. Extension Git
    • Ouvrez l'extension Git -> Vérifiez la branche de fonctionnalité dont vous voulez voir les commits, il existe une option pour sélectionner les premiers commits comme indiqué dans l'image:

entrez la description de l'image ici

  1. Tortue Git
    • Ouvrez le dossier du référentiel -> Cliquez sur Afficher les journaux de Tortoise Git -> Extraire la branche et sélectionnez les premiers commits comme indiqué dans l'image

entrez la description de l'image ici

KushalSeth
la source
-3

Cela ne marche pas?

git log master
git log --stat master
Stefan Kendall
la source
Non, ça ne marche pas. Le commit de fusion a deux parents; tout ce qui revient de ces deux parents est sur la branche «maître».
GoZoner