Comment déterminer quand une branche Git a été créée?

327

Existe-t-il un moyen de déterminer quand une branche Git a été créée? J'ai une branche dans mon référentiel et je ne me souviens pas l'avoir créée et j'ai pensé que peut-être que voir l'horodatage de la création me rafraîchirait la mémoire.

paxos1977
la source
3
a trouvé cela très utile commandlinefu.com/commands/view/2345/…
Brendon-Van-Heyzen
1
Lorsque vous avez posé cette question, étiez-vous vraiment intéressé à obtenir la date et l'heure de création de la branche, ou étiez-vous également intéressé à savoir dans votre historique de validation la branche a été créée pour la première fois, c'est-à-dire la validation de votre branche qui a été créée pour la première fois de?
3
@Cupcake, la question est assez claire. Je m'intéressais à la création de la succursale. Cela dit, connaître le commit serait une information utile dans le cas général.
paxos1977

Réponses:

151

Utilisation

git show --summary `git merge-base foo master`

Si vous préférez le voir en contexte en utilisant gitk, utilisez

gitk --all --select-commit = `git merge-base foo master`

(où foo est le nom de la branche que vous recherchez.)

Capture d'écran

Greg Bacon
la source
24
Pour clarifier la réponse, le processus comporte deux étapes. (1) obtenir l'arborescence en utilisant "git merge-base <branch> master" où branch est la branche d'intérêt. (2) Utilisez l'arborescence comme entrée dans git show pour obtenir la date: "git show --summary <treesh>"
paxos1977
11
Cette réponse semble excepter que la branche a été créée à partir de master. Mais si ce n'est pas le cas? Existe-t-il un moyen de trouver le premier commit de la branche ayant plus d'un enfant?
Manitra Andriamitondra
20
Ce n'est pas la date à laquelle la branche a été créée - c'est le commit "branching".
Marco
44
La solution ne fonctionnera que si «branche» n'a jamais été fusionnée avec «maître». Existe-t-il un moyen de trouver la toute première base de fusion pour deux branches universellement?
Ilya Ivanov
22
Cela montre la base de fusion, pas la création de branche.
Hedley
139

Comme indiqué dans les commentaires et dans la réponse de Jackub , tant que votre branche est plus jeune que le nombre de jours défini dans le paramètre de configuration gc.reflogexpire(la valeur par défaut est 90 jours), vous pouvez utiliser votre reflog pour savoir quand une référence de branche a été d'abord créé.

Notez que cela git reflogpeut prendre la plupart des git logdrapeaux. Notez en outre que les HEAD@{0}sélecteurs de style sont effectivement des notions de temps et, en fait, sont traités (d'une manière piratée) comme des chaînes de date. Cela signifie que vous pouvez utiliser l'indicateur --date=localet obtenir une sortie comme celle-ci:

$ git reflog --date = local
763008c HEAD @ {ven 20 août 10:09:18 2010}: tirer: avance rapide
f6cec0a HEAD @ {mar 10 août 09:37:55 2010}: tirer: avance rapide
e9e70bc HEAD @ {jeu 4 fév 02:51:10 2010}: tirer: avance rapide
836f48c HEAD @ {jeu 21 jan 14:08:14 2010}: paiement: passage de maître à maître
836f48c HEAD @ {jeu 21 jan 14:08:10 2010}: tirer: avance rapide
24bc734 HEAD @ {Wed Jan 20 12:05:45 2010}: paiement: passage de 74fca6a42863ffacaf7ba6f1936a9f228950f657 
74fca6a HEAD @ {Wed Jan 20 11:55:43 2010}: paiement: passage du maître à la v2.6.31
24bc734 HEAD @ {Wed Jan 20 11:44:42 2010}: tirer: Avance rapide
964fe08 HEAD @ {lun 26 oct 15:29:29 2009}: paiement: passage de 4a6908a3a050aacc9c3a2f36b276b46c0629ad91 
4a6908a HEAD @ {lun 26 oct 14:52:12 2009}: paiement: passage du maître à la v2.6.28

Il peut également être utile d'utiliser parfois --date=relative:

$ git reflog --date = relative
763008c HEAD @ {il y a 4 semaines}: tirer: avance rapide
f6cec0a HEAD @ {il y a 6 semaines}: tirer: avance rapide
e9e70bc HEAD @ {il y a 8 mois}: tirer: avance rapide
836f48c HEAD @ {il y a 8 mois}: paiement: passage de maître à maître
836f48c HEAD @ {il y a 8 mois}: tirer: avance rapide
24bc734 HEAD @ {il y a 8 mois}: paiement: passage de 74fca6a42863ffacaf7ba6f1936a9f228950f657 à master
74fca6a HEAD @ {il y a 8 mois}: paiement: passage du maître à la v2.6.31
24bc734 HEAD @ {il y a 8 mois}: tirer: avance rapide
964fe08 HEAD @ {il y a 11 mois}: paiement: passage de 4a6908a3a050aacc9c3a2f36b276b46c0629ad91 à master
4a6908a HEAD @ {il y a 11 mois}: paiement: passage du maître à la v2.6.28

Une dernière remarque: l' --allindicateur (qui est vraiment un indicateur git-log compris par git-reflog) affichera les reflogs pour toutes les références connues refs/(au lieu de simplement HEAD), ce qui vous montrera clairement les événements de branche:

git reflog --date = local --all
860e4e4 refs / heads / master @ {Sun Sep 19 23:00:30 2010}: commit: Second.
17695bc refs / heads / example_branch @ {Mon Sep 20 00:31:06 2010}: branch: Créé à partir de HEAD
Aaron
la source
3
Très intéressant. +1. À condition, bien sûr, que cela se fasse en quelques gc.reflogexpirejours.
VonC
2
@VonC - vous avez raison. La valeur par défaut de gc.reflogexpire est de 90 jours.
Aaron
1
Finalement! la seule réponse dans laquelle git lui-même dit: "branch: Created from HEAD". Donc, cette chose insaisissable de "branche" de git PEUT être retrouvée jusqu'à sa date et son heure de création ... Merci, +1 prix. Mais qu'en est-il de cette chose gc.reflogexpire, et comment faire cela sur des branches distantes?
Motti Shneor
60

Pro Git § 3.1 Git Branching - Ce qu'est une branche a une bonne explication de ce qu'est vraiment une branche git

Une branche dans Git est simplement un pointeur mobile léger vers [a] commit.

Puisqu'une branche est juste un pointeur léger, git n'a aucune notion explicite de son historique ou de sa date de création. "Mais attendez," je vous entends dire, "bien sûr, git connaît mon histoire de branche!" Eh bien, en quelque sorte.

Si vous exécutez l'une des opérations suivantes:

git log <branch> --not master
gitk <branch> --not master

vous verrez ce qui ressemble à «l'historique de votre branche», mais il s'agit en fait d'une liste de validations accessibles depuis «branch» qui ne sont pas accessibles depuis master. Cela vous donne les informations que vous voulez, mais si et seulement si vous n'avez jamais fusionné la «branche» vers le maître et n'avez jamais fusionné le maître dans la «branche» depuis que vous l'avez créée. Si vous avez fusionné, cet historique de différences s'effondrera.

Heureusement, le reflog contient souvent les informations que vous souhaitez, comme expliqué dans diverses autres réponses ici. Utilisez ceci:

git reflog --date=local <branch>

pour montrer l'histoire de la branche. La dernière entrée de cette liste est (probablement) le point auquel vous avez créé la branche.

Si la branche a été supprimée, 'branch' n'est plus un identifiant git valide, mais vous pouvez l'utiliser à la place, ce qui peut trouver ce que vous voulez:

git reflog --date=local | grep <branch>

Ou dans un shell cmd Windows:

git reflog --date=local | find "<branch>"

Notez que reflog ne fonctionnera pas efficacement sur les branches distantes, uniquement celles sur lesquelles vous avez travaillé localement.

yo-yo
la source
Hmm, je ne sais pas encore à quel point cette réponse est utile, je devrai l'étudier plus tard. Pour ce que ça vaut, cependant, vous avez certainement fait du bon travail en faisant l'effort d'écrire quelque chose de complet , et pas seulement une réponse partielle courte et paresseuse, donc c'est vraiment bon. En outre, il est important de noter que vous ne pouvez utiliser le reflog que pour autant que votre branche ne date pas de plus de gc.reflogexpirejours, comme indiqué dans cette réponse et cette réponse .
4
Je ne voulais pas dupliquer toutes les bonnes informations sur les reflogs des autres réponses, mais heureux d'ajouter le gc.reflogexpire si vous pensez que c'est utile. Ma réponse visait à (1) fournir plus de clarté sur ce qu'est une branche git et pourquoi son "historique" est quelque peu nébuleux, (2) mettre les commandes utiles au centre, y compris (3) montrer les commits sur une branche et non master et (4) grep-le reflog pour une branche supprimée. Commentaires bienvenus.
yoyo
Merci @Cupcake. Curieusement, j'avais à l'origine des crochets autour de la `` branche '', mais cela supprimait le mot entier de mon aperçu de la réponse, j'ai donc supposé qu'il était traité à tort comme du HTML en ligne (invalide).
yoyo
Cette méthode a bien fonctionné via intellij et BitBucketgit reflog --date=local <branch>
isaac weathers
41

Tout d'abord, si votre branche a été créée en quelques gc.reflogexpirejours (90 jours par défaut, soit environ 3 mois), vous pouvez utiliser git log -g <branch>ou git reflog show <branch>pour trouver la première entrée dans reflog, qui serait un événement de création, et ressemble à quelque chose comme ci-dessous (pour git log -g):

Reflog: <branch>@{<nn>} (C R Eator <[email protected]>)
Reflog message: branch: Created from <some other branch>

Vous obtiendriez qui a créé une branche, combien d'opérations il y a et à partir de quelle branche (enfin, il pourrait s'agir simplement de "Créé à partir de HEAD", ce qui n'aide pas beaucoup).

C'est ce que MikeSep a dit dans sa réponse .


Deuxièmement, si vous avez une branche depuis plus longtemps gc.reflogexpireet que vous avez exécuté git gc(ou si elle a été exécutée automatiquement), vous devrez trouver un ancêtre commun avec la branche à partir de laquelle elle a été créée. Jetez un œil au fichier de configuration, il y a peut-être une branch.<branchname>.mergeentrée, qui vous dirait sur quelle branche celle-ci est basée.

Si vous savez que la branche en question a été créée à partir de la branche principale (forking à partir de la branche principale), par exemple, vous pouvez utiliser la commande suivante pour voir l'ancêtre commun:

git show $(git merge-base <branch> master)

Vous pouvez également essayer git show-branch <branch> master, comme alternative.

C'est ce que Gbacon a dit dans sa réponse .

Jakub Narębski
la source
3
"git reflog show <branch>" fonctionne bien, montre très explicitement quand la branche a été créée. Treesh alimente "git show --summary <treesh>"
paxos1977
1
Le 'git log -g <branch>' était celui qui fonctionnait pour moi - beaucoup de détails. Besoin d'être sur la branche pour utiliser l'un de ces éléments.
Lidia
18

Je ne suis pas encore sûr de la commande git, mais je pense que vous pouvez les trouver dans les reflogs.

.git/logs/refs/heads/<yourbranch>

Mes fichiers semblent avoir un horodatage Unix.

Mise à jour: Il semble y avoir une option pour utiliser l'historique de reflog au lieu de l'historique de validation lors de l'impression des journaux:

git log -g

Vous pouvez également suivre ce journal, jusqu'au moment où vous avez créé la branche. git logaffiche la date de la validation, cependant, pas la date à laquelle vous avez effectué l'action qui a fait une entrée dans le reflog. Je ne l'ai pas encore trouvé, sauf en regardant dans le reflog réel dans le chemin ci-dessus.

Mike Seplowitz
la source
12

Essaye ça

  git for-each-ref --format='%(committerdate) %09 %(authorname) %09 %(refname)'
Sireesh Yarlagadda
la source
3
vous pourriez avoir besoin %avant(refname)
Vor
1
@Vor j'ai fait le changement
biniam
J'ai expliqué cela par la suite | cut -c 5- | sort -r |, puis par le biais de grep pour le mois, me donnant une liste chronologique inversée, plus ou moins.
Noumenon
2
@Noumenon: for-each-ref peut trier pour vous, en ajoutant par exemple --sort='-committerdate'(notez le '-' avant la date de validation pour l'ordre chronologique inverse).
Pete
9

Utilisation:

git reflog

pour afficher tout le cycle de vie de votre référentiel dans le dossier actuel. Le nom de la branche qui apparaît en premier (de bas en haut) est la source qui a été créée.

855a3ce HEAD@{0}: checkout: moving from development to feature-sut-46
855a3ce HEAD@{1}: checkout: moving from feature-sut-46 to development
855a3ce HEAD@{2}: checkout: moving from feature-jira35 to feature-sut-46
535dd9d HEAD@{3}: checkout: moving from feature-sut-46 to feature-jira35
855a3ce HEAD@{4}: checkout: moving from development to feature-sut-46
855a3ce HEAD@{5}: checkout: moving from feature-jira35 to development
535dd9d HEAD@{6}: commit: insert the format for vendor specific brower - screen.css
855a3ce HEAD@{7}: checkout: moving from development to feature-jira35
855a3ce HEAD@{8}: checkout: moving from master to development

Cela signifie:

  • Le développement de la branche est créé (checkout -b) à partir du maître

  • La fonction de branche-jira35 est créée (checkout -b) à partir du développement

  • La fonction de branche-jira-sut-46 est créée (checkout -b) à partir du développement

De Nguyen
la source
2
mais où sont les dates? et vous voyez plusieurs fois le check-out dans chaque agence. Est-ce à dire que la PREMIÈRE occurrence de chaque branche est sa création?
Motti Shneor
4

C'est quelque chose que j'ai trouvé avant de trouver ce fil.

git reflog show --date=local --all | sed 's!^.*refs/!refs/!' | grep '/master' | tail -1
git reflog show --date=local --all | sed 's!^.*refs/!refs/!' | grep 'branch:'
Andrew Sohn
la source
3

Cette commande affiche la date de création de la branche à devpartir demain

$git reflog show --date=iso dev
$7a2b33d dev@{2012-11-23 13:20:28 -2100}: branch: Created from main
Sazzad Hissain Khan
la source
"la date de création de la succursale" ... si moins de 90 jours. S'il était créé plus de 90 jours, ces informations seraient purgées. Comme mentionné ci-dessus dans stackoverflow.com/a/3748722/6309 .
VonC
@Sazzad Hissain Khan Celui-ci a fonctionné pour nous car nous voulions fournir des `` conseils de triche amicaux '' à des gens non techniques qui se perdaient un peu avec certaines des subtilités de Git.
Chris22
2

Si vous souhaitez obtenir les détails de toutes les succursales

for i in `git branch -r | tail -n +2 `;do git log --reverse $i|grep -A 2 -B 2 `echo $i | awk -F'origin/' '{print $2}'` |head -n 4; done
Anshul Agarwal
la source
2

J'ai trouvé le meilleur moyen: je vérifie toujours la dernière branche créée de cette façon

git for-each-ref --sort=-committerdate refs/heads/
user838900
la source
1

Combiné avec la réponse d'Andrew Sohn ( https://stackoverflow.com/a/14265207/1929406 )

branchcreated=$(git reflog show --date=format:'%Y-%m-%d %H:%M:%S' --all | sed 's!^.*refs/!refs/!' | grep '/master' | tail -1| cut -d'{' -f 2| cut -d'}' -f 1 | xargs)
echo $branchcreated
kivagant
la source
1

Cela a fait pour moi: (10 ans plus tard)

git log [--remotes] --no-walk --decorate

Puisqu'il n'y a aucune information stockée sur les heures de création de branche, cela affiche la première validation de chaque branche ( --no-walk), qui inclut la date de la validation. Utilisation--remotes pour les succursales distantes ou omettez-le pour les succursales locales.

Comme je fais au moins un commit dans une branche avant d'en créer un autre, cela m'a permis de remonter quelques mois de créations de branche (et de dev-start) à des fins de documentation.

source: AnoE sur stackexchange

Groo le tueur de bogues
la source
0

syntaxe: git reflog --date=local | grep checkout: | grep ${current_branch} | tail -1

exemple: git reflog --date=local | grep checkout: | grep dev-2.19.0 | tail -1

résultat: cc7a3a8ec HEAD@{Wed Apr 29 14:58:50 2020}: checkout: moving from dev-2.18.0 to dev-2.19.0

Jamter
la source