git log pour retourner Seulement les commits faits à la branche principale?

j'ai fait un peu de recherche et trouvé:

git log myBranchName

comme solution possible. Mais ce qui arrive quand ma branche est la branche principale? quand je cours:

git log master

il semble rendre tout Commité à n'importe quelle branche. Basé sur ce que j'ai lu, il Liste tous les commits liés à la branche principale. Sachant cela, comment je peux appeler la validation de l'histoire de la branche principale?

20
git
demandé sur Kris Anderson 2013-04-08 13:06:48

2 réponses

je pense que c'est ce que vous voulez

git log --first-parent master

pour citer le manuel

suit seulement le premier parent commit en voyant une fusion commit. Ce l'option peut donner une meilleure vue d'ensemble lors de la visualisation de l'évolution d'un branche thématique particulière, parce que les fusions dans une branche thématique ont tendance à être il ne s'agit que de s'ajuster aux mises à jour en amont de temps en temps, et ceci l'option vous permet d'ignorer les commits individuels votre l'histoire part d'une telle fusion.

42
répondu parkydr 2016-11-11 17:56:03

en raison du modèle de branchement de Git, les commits n'appartiennent pas à une ou plusieurs branches. Les Branches sont des pointeurs vers des objets de propagation simples à l'intérieur du Graphe de propagation complet. Donc quand vous dites qu'un commit est "sur une branche X" dans X, vous voulez généralement dire qu'il est accessible quand vous commencez à la commit que la branche x Pointe.

pour git log , le comportement par défaut est égal à git log HEAD où HEAD se réfère à la propagation que la branche courante pointe actuellement. Donc, si vous êtes sur la branche master , il est égal à git log master , montrant toutes les propagations qui sont accessibles à partir de la propagation la plus récente.

Malheureusement, ce que vous faites référence à une livraison effectuée à une certaine branche n'est pas clairement défini dans Git. Si je fais une commit sur master, puis crée une nouvelle branche qui pointe vers la même commit (par exemple en utilisant git branch newbranch ), alors cette branche est littéralement identique à la branche master sauf pour le nom. Ainsi chaque propriété "sur la branche" master serait désormais impliquent également des "sur la branche newbranch" . En tant que tel, vous ne pouvez pas avoir cette propriété dans Git.

même la solution de parkydr, qui montre toutes les commits qui ont été faites seulement sur un seul côté des fusions n'est pas une solution infaillible. Idéalement, il cacherait toutes les commit qui ont été faites sur une branche séparée non-master et qui ont ensuite été fusionnées en master. En tant que tel, vous n'obtiendriez que des propagations qui sont soit faites directement à la ligne maître ou qui sont en train de fusionner les commits fusionnant dans d'autres commits. Cependant il y a deux choses qui empêchent ce travail:

  1. fusionne Fast-forward: lorsque vous vous déconnectez du maître et créez quelques commits, sans en créer de nouveaux directement sur le maître, alors un git merge somebranch sur le maître va accélérer les commits, résultant en la branche du maître pointant vers le même commit que somebranch . En tant que tel vous "perdez" l'information que ces commits ont été créés à l'origine sur une branche séparée. Vous pouvez forcer Git à créer toujours merge commits, en utilisant git merge --no-ff mais cela ne vous aidera pas après.
  2. l'ordre de fusion n'est pas garanti: lorsque vous êtes sur master et fusionnez une branche, alors le précédent Master commit sera toujours le premier parent. Pour que tu aies le comportement désiré. Toutefois, il est parfaitement possible d'être sur dit branche, et fusionne master à la place, ce qui fait que master commit est le second parent. Alors master pourrait être redirigé rapidement (ou réinitialisé) vers le nouveau commit résultant en une vue "inversée".

donc, l'essentiel est que vous ne pouvez pas obtenir en toute sécurité une telle histoire. Vous feriez mieux de vous habituer à la façon dont le modèle de branchement flexible de Git fonctionne.

12
répondu poke 2013-04-08 12:04:25