Je veux lister tous les commits qui ne sont qu'une partie d'une branche spécifique.
Avec ce qui suit, il répertorie toutes les validations de la branche, mais aussi du parent (maître)
git log mybranch
L'autre option que j'ai trouvée, était d'exclure les commits accessibles par le maître et me donne ce que je veux, MAIS je voudrais éviter d'avoir à connaître les noms des autres branches.
git log mybranch --not master
J'essayais d'utiliser git for-each-ref
, mais il répertorie également mybranch donc il exclut en fait tout:
git log mybranch --not $(git for-each-ref --format '^%(refname:short)' refs/heads/)
Mettre à jour:
Je teste une nouvelle option que j'ai trouvée il y a quelque temps, et jusqu'à présent, il semble que cela pourrait être ce que je cherchais:
git log --walk-reflogs mybranch
Mise à jour (2013-02-13T15: 08):
L'option --walk-reflogs est bonne, mais j'ai vérifié qu'il y a une expiration pour reflogs (90 jours par défaut, gc.reflogExpire ).
Je pense avoir trouvé la réponse que je cherchais:
git log mybranch --not $(git for-each-ref --format='%(refname)' refs/heads/ | grep -v "refs/heads/mybranch")
Je supprime simplement la branche actuelle de la liste des branches disponibles et j'utilise cette liste pour être exclue du journal. De cette façon, je ne reçois que les commits qui ne sont atteints que par mybranch .
Réponses:
D'après ce que cela semble que vous devriez utiliser
cherry
:Cela montrerait tous les commits contenus dans mybranch , mais PAS dans develop . Si vous laissez la dernière option ( mybranch ), elle comparera la branche actuelle à la place.
Comme l'a souligné VonC, vous comparez TOUJOURS votre branche à une autre branche, alors connaissez vos branches, puis choisissez celle à comparer.
la source
git cherry -v master
comparer votre branche actuelle avec la branche principale.fatal: Unknown commit mybranch
.Je ne pense pas que ce soit possible: une branche dans Git est toujours basée sur une autre ou au moins sur une autre commit, comme expliqué dans " git diff ne montre pas assez ":
Vous avez besoin d'un point de référence pour que votre journal affiche les bons commits.
Comme mentionné dans " GIT - D'où je me suis branchée? ":
Donc, même s'il
git log master..mybranch
s'agit d'une seule réponse, elle afficherait toujours trop de validations, si ellemybranch
est basée surmyotherbranch
, elle-même basée surmaster
.Afin de trouver cette référence (l'origine de votre branche), vous pouvez uniquement analyser les validations et voir dans quelle branche elles se trouvent, comme indiqué dans:
la source
J'ai enfin trouvé le moyen de faire ce que le PO voulait. C'est aussi simple que:
La commande affichera toutes les validations accessibles à partir de la branche fournie au format graphique. Mais, vous pouvez facilement filtrer toutes
*
les validations de cette branche en consultant le graphique des validations dont le premier caractère est dans la ligne de validation.Par exemple, regardons l'extrait du
git log --graph master
dépôt GakeHub sur cakephp ci-dessous:Comme vous pouvez le voir, seulement commits
8314c2ff833280bbc7102cb6d4fcf62240cd3ac4
etc3f45e811e4b49fe27624b57c3eb8f4721a4323b
avoir*
le premier caractère dans la validation des lignes. Ces validations proviennent de la branche principale tandis que les quatre autres proviennent d'autres branches.la source
La commande shell suivante devrait faire ce que vous voulez:
Avertissements
Si vous avez
mybranch
vérifié, la commande ci-dessus ne fonctionnera pas. C'est parce que les validationsmybranch
sont également accessibles parHEAD
, donc Git ne considère pas les validations comme uniques àmybranch
. Pour le faire fonctionner lorsqu'ilmybranch
est extrait, vous devez également ajouter une exclusion pourHEAD
:Cependant, vous ne devez pas exclure
HEAD
sauf si lemybranch
est extrait, sinon vous risquez d'afficher des validations qui ne sont pas exclusives àmybranch
.De même, si vous avez une branche distante nommée
origin/mybranch
qui correspond à lamybranch
branche locale , vous devrez l'exclure:Et si la branche distante est la branche par défaut du référentiel distant (généralement vrai uniquement pour
origin/master
), vous devrez également exclureorigin/HEAD
:Si vous avez extrait la branche et qu'il y a une branche distante et que la branche distante est la valeur par défaut pour le référentiel distant, vous finissez par exclure beaucoup:
Explication
La
git rev-list
commande est une commande de bas niveau (plomberie) qui parcourt les révisions données et sauvegarde les identificateurs SHA1 rencontrés. Considérez-le comme équivalent,git log
sauf qu'il ne montre que le SHA1 - pas de message de journal, pas de nom d'auteur, pas d'horodatage, rien de tout cela "fantaisiste".L'
--no-walk
option, comme son nom l'indique, empêchegit rev-list
de parcourir la chaîne d'ascendance. Donc, si vous tapez,git rev-list --no-walk mybranch
il n'imprimera qu'un seul identifiant SHA1: l'identifiant du commit de tip de lamybranch
branche.Les
--exclude=refs/heads/mybranch --all
arguments indiquentgit rev-list
de commencer à partir de chaque référence à l'exception derefs/heads/mybranch
.Ainsi, lorsque vous exécutez
git rev-list --no-walk --exclude=refs/heads/mybranch --all
, Git affiche l'identifiant SHA1 de la validation de pointe de chaque référence, à l'exception derefs/heads/mybranch
. Ces commits et leurs ancêtres sont les commits que vous ne vous intéresse en ce sont les commits vous ne pas voulez voir.Les autres validations sont celles que vous souhaitez voir, nous collectons donc la sortie de
git rev-list --no-walk --exclude=refs/heads/mybranch --all
et demandons à Git de tout montrer sauf ces validations et leurs ancêtres.L'
--no-walk
argument est nécessaire pour les grands référentiels (et est une optimisation pour les petits référentiels): sans lui, Git devrait imprimer, et le shell devrait collecter (et stocker en mémoire) beaucoup plus d'identifiants de validation que nécessaire. Avec un grand référentiel, le nombre de validations collectées pourrait facilement dépasser la limite d'argument de ligne de commande du shell.Git bug?
Je m'attendais à ce que les éléments suivants fonctionnent:
mais ce n'est pas le cas. Je suppose que c'est un bug dans Git, mais c'est peut-être intentionnel.
la source
hg log -b <branch>
. Je ne comprends pas pourquoi les gens disent que git est hostile. / sgit log --all --not --exclude=refs/heads/mybranch --all
ne fonctionne pas, mais legit log refs/heads/mybranch --not --exclude=refs/heads/mybranch --all
fait, avec les mêmes mises en garde concernant l'exclusion de HEAD et de l'origine.Réponse rapide:
Disons:
Que vous avez une branche maître
Faites quelques commits
Vous avez créé une branche nommée b2
Faites
git log -n1
; l'ID de validation est la base de fusion entre b2 et masterFaites quelques commits en b2
git log
affichera l'historique de vos journaux de b2 et masterUtilisez la plage de commit, si vous n'êtes pas familier avec le concept, je vous invite à le google ou à empiler overflow-it,
Pour votre contexte réel, vous pouvez faire par exemple
Le ".." est l'opérateur de plage pour la commande log.
Cela signifie, sous une forme simple, donnez-moi tous les journaux plus récents que commitID_FOO ...
Regardez le point # 4, la base de fusion
Alors:
git log COMMITID_mergeBASE..HEAD
vous montrera la différenceGit peut récupérer la base de fusion pour vous comme ceci
Enfin, vous pouvez faire:
la source
Vous pouvez essayer quelque chose comme ceci:
Ou, en empruntant à la recette du manuel de l'utilisateur de Git :
la source
git show-ref --tags
.énumérera les conseils de chaque branche qui ne l'est pas
master
.liste tous les commit de
master
l'historique qui ne figurent dans aucun autre historique de branche.Le séquençage est important pour les options qui configurent le pipeline de filtres pour la sélection de validation, il
--branches
doit donc suivre tous les modèles d'exclusion qu'il est censé appliquer, et--no-walk
doit suivre les filtres fournissant les validations. Rev-list n'est pas censé marcher.la source
Cela générera les validations sur la branche actuelle. Si un argument est passé, il ne produit que les hachages.
git_show_all_commits_only_on_this_branch
la source
J'utilise les commandes suivantes:
ou
la source
J'ai trouvé cette approche relativement facile.
Commander à la succursale et
Courir
Cela ne fournira que deux SHA:
1) dernier commit de la branche [C1]
2) et commit parent au premier commit de la branche [C2]
Maintenant, lancez
Ici C1 et C2 sont deux chaînes que vous obtiendrez lorsque vous exécuterez la première commande. Mettez ces valeurs sans <> dans la deuxième commande.
Cela donnera la liste de l'historique des changements de fichiers dans la branche.
la source
Dans ma situation, nous utilisons Git Flow et GitHub. Pour cela, il vous suffit de comparer votre branche de fonctionnalités avec votre branche de développement sur GitHub.
Il montrera les validations effectuées uniquement dans votre branche de fonctionnalité.
Par exemple:
https://github.com/your_repo/compare/develop...feature_branch_name
la source
git
et d'utiliser à la place GitHub pour simplement faire une demande de pull ou comparer les branches.