Comment obtenir l'historique des commit pour une seule branche?


128

Disons que j'ai créé une nouvelle branche à my_experimentpartir de masteret effectué plusieurs engagements my_experiment. Si je fais un git logwhen on my_experiment, je vois les commits faits sur cette branche, mais aussi les commits faits masteravant la création de la my_experimentsbranche.

Je trouverais très utile de voir l'historique de tous les engagements dans la my_experimentsbranche jusqu'à ce qu'il atteigne la création de cette branche - effectivement une véritable histoire de cette branche uniquement. Sinon, lorsque je regarde dans le journal, je ne sais pas si les commits étaient sur la my_experimentsbranche ou non.

Y a-t-il un moyen de faire cela avec Git?

Réponses:


139

Vous pouvez utiliser une plage pour ce faire.

git log master..

Si vous avez vérifié votre my_experimentsuccursale. Cela comparera où masterest à HEAD(la pointe de my_experiment).


3
Ok a parlé trop tôt. Cela l'a fait pour mon exemple simple. Mais maintenant, je regarde le vrai dépôt de quelqu'un d'autre et il me vient à l'esprit que pour utiliser correctement cette commande, j'aurais besoin de savoir à partir de quelle branche ma branche actuelle a été créée. Peut-être que je devrais être capable de le dire de gitk mais ce n'est pas évident pour moi. Des pensées?
Marplesoft

@Marplesoft Cela peut être compliqué à comprendre. Voir cette question .
alex

Pourriez-vous expliquer brièvement comment cela fonctionne? Que git log master..dit à Git?
tonix

2
@tonix Suivez le lien dans la réponse pour plus d'informations sur le fonctionnement d'une plage (la master..) partie.
alex

7

La git merge-basecommande peut être utilisée pour trouver un ancêtre commun. Donc, si my_experiment n'a pas encore été fusionné dans master et que my_experiment a été créé à partir de master, vous pouvez:

git log --oneline `git merge-base my_experiment master`..my_experiment

Si vous voulez inclure le parent de votre premier commit, ajoutez ^ et --first-parent : git log --oneline `git merge-base my_experiment master`^..my_experiment --first-parent
Eric Lavoie

7

Remarque: si vous limitez ce journal au dernier n commit (les 3 derniers commits par exemple, git log -3), assurez-vous de mettre un espace entre 'n' et votre branche:

git log -3 master..

Avant Git 2.1 (août 2014), cette erreur: git log -3master..vous montrerait en fait les 3 derniers commits de la branche actuelle (ici my_experiment), en ignorant la masterlimite (ce qui signifie que si elle my_experimentne contient qu'un seul commit, 3 seraient toujours listés, 2 d'entre eux à partir de master)

Voir commit e3fa568 par Junio ​​C Hamano ( gitster) :

révision: analyser git log -<count>plus attentivement " "

Cette ligne de commande mal saisie ignore simplement " master" et finit par afficher deux validations du courant HEAD:

$ git log -2master

parce que nous alimentons " 2master" atoi()sans nous assurer que la chaîne entière est analysée comme un entier.

Utilisez strtol_i()plutôt la fonction d'assistance.


1

Vous ne pouvez utiliser que git log --oneline


Bien que ce code puisse répondre à la question, fournir un contexte supplémentaire sur la manière et / ou pourquoi il résout le problème améliorerait la valeur à long terme de la réponse.
DebanjanB

1

Je pense qu'une option pour vos besoins est git log --online --decorate. Cela vous permet de connaître le commit vérifié et les meilleurs commits pour chaque branche que vous avez dans votre scénario. En faisant cela, vous avez une belle vue sur la structure de votre repo et les commits associés à une branche spécifique. Je pense que lire ceci pourrait aider.


0

Je sais qu'il est très tard pour celui-ci ... Mais voici un oneliner (pas si simple) pour obtenir ce que vous cherchiez:

git show-branch --all 2>/dev/null | grep -E "\[$(git branch | grep -E '^\*' | awk '{ printf $2 }')" | tail -n+2 | sed -E "s/^[^\[]*?\[/[/"
  • Nous listons les commits avec le nom de la branche et les positions relatives aux états de branche réels avec git show-branch(en envoyant les avertissements à /dev/null).
  • Ensuite, nous ne conservons que ceux avec notre nom de branche à l'intérieur du support avec grep -E "\[$BRANCH_NAME".
  • Où le réel $BRANCH_NAMEest obtenu avec git branch | grep -E '^\*' | awk '{ printf $2 }'(la branche avec une étoile, écho sans cette étoile).
  • De nos résultats, nous supprimons la ligne redondante au début avec tail -n+2.
  • Et puis, nous nettoyons enfin la sortie en supprimant tout ce qui précède [$BRANCH_NAME]avec sed -E "s/^[^\[]*?\[/[/".
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.