Graphiques des branches de Pretty git

j'ai vu des livres et des articles qui ont de très jolis graphiques de branches git et commits. Comment puis-je faire des images imprimables de haute qualité de l'histoire git?

1018
demandé sur WayToDoor 2009-06-29 14:12:28

30 réponses

mise à Jour: Cette réponse a eu beaucoup plus d'attention qu'elle mérite.  Il a été publié à l'origine parce que je pense que les graphiques ont l'air agréable et ils pourraient être dessinés-dans Illustrator pour une publication– et il n'y avait pas de meilleure solution.  Mais il existe désormais beaucoup plus de réponses à ces questions, telles que fracz , Jubobs ', ou Harry Lee 's!  S'il vous plaît aller upvote!!!!

mise à jour 2: j'ai posté une version améliorée de cette réponse à la question visualisation de la topologie de la branche dans git , car c'est beaucoup plus approprié là.  Cette version inclut lg3 , ce qui montre à la fois les informations de l'auteur et du committer, donc vous devriez vraiment vérifier.  Laissant cette réponse pour des raisons historiques (& rep, Je l'admets), même si je suis vraiment tenté de la supprimer.

: j'ai deux alias que je jette normalement dans mon fichier ~/.gitconfig :

[alias]
lg1 = log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(dim white)- %an%C(reset)%C(bold yellow)%d%C(reset)' --all
lg2 = log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold cyan)%aD%C(reset) %C(bold green)(%ar)%C(reset)%C(bold yellow)%d%C(reset)%n''          %C(white)%s%C(reset) %C(dim white)- %an%C(reset)' --all
lg = !"git lg1"

git lg / git lg1 on dirait que:

git lg1

et git lg2 ressemble à ceci:

git lg2

1554
répondu Slipp D. Thompson 2017-05-23 12:18:30

beaucoup de réponses ici sont grandes, mais pour ceux qui veulent juste une ligne simple à la réponse de point sans avoir à configurer des alias ou quoi que ce soit de plus, il est ici:

git log --all --decorate --oneline --graph

pas tout le monde ferait un journal de gitan tout le temps, mais quand vous en avez besoin rappelez-vous juste: A Dog "= git log -- a ll -- d ecorate -- o neline -- g raph

enter image description here

618
répondu Patoshi パトシ 2018-03-23 01:37:39

pour la sortie textuelle, vous pouvez essayer:

git log --graph --abbrev-commit --decorate --date=relative --all

ou:

git log --graph --oneline --decorate --all

ou: voici un alias graphviz pour dessiner le graphe DAG.

j'utilise personnellement gitx , gitk --all et gitnub .

291
répondu keo 2016-12-03 00:48:16

Gitgraph.js permet de dessiner de jolies branches git sans dépôt. Il suffit d'écrire un code Javascript qui configure vos branches et les commits et les rend dans le navigateur.

var gitGraph = new GitGraph({
   template: "blackarrow",
   mode: "compact",
   orientation: "horizontal",
   reverseArrow: true
});

var master = gitGraph.branch("master").commit().commit();
var develop = gitGraph.branch("develop").commit();
master.commit();
develop.commit().commit();
develop.merge(master);

sample graph generated with Gitgraph.js

ou avec metro modèle:

GitGraph.js metro theme

ou avec les messages de propagation, les auteurs et les tags:

GitGraph with commit messages

tester avec JSFiddle .

Générer avec Git Grapher par @bsara.

186
répondu fracz 2016-11-29 06:57:57

construit sur le dessus de TikZ & PGF , gitdags est un petit paquet LaTeX qui vous permet de produire facilement des graphiques vectoriels de propagation, et plus encore.

la génération automatique d'un graphique de propagation d'un dépôt existant est et non gitdags ; les graphiques qu'il produit sont seulement destinés à des fins éducatives .

Je l'utilise souvent pour produire des graphiques pour mes réponses aux questions Git, comme une alternative à ascii commit graphs:

Voici un exemple d'un tel graphique montrant les effets d'une simple rebase:

enter image description here

\documentclass{article}

\usepackage{subcaption}
\usepackage{gitdags}

\begin{document}

\begin{figure}
  \begin{subfigure}[b]{\textwidth}
    \centering
    \begin{tikzpicture}
      % Commit DAG
      \gitDAG[grow right sep = 2em]{
        A -- B -- { 
          C,
          D -- E,
        }
      };
      % Tag reference
      \gittag
        [v0p1]       % node name
        {v0.1}       % node text
        {above=of A} % node placement
        {A}          % target
      % Remote branch
      \gitremotebranch
        [origmaster]    % node name
        {origin/master} % node text
        {above=of C}    % node placement
        {C}             % target
      % Branch
      \gitbranch
        {master}     % node name and text 
        {above=of E} % node placement
        {E}          % target
      % HEAD reference
      \gitHEAD
        {above=of master} % node placement
        {master}          % target
    \end{tikzpicture}
    \subcaption{Before\ldots}
  \end{subfigure}

  \begin{subfigure}[b]{\textwidth}
    \centering
    \begin{tikzpicture}
      \gitDAG[grow right sep = 2em]{
        A -- B -- { 
          C -- D' -- E',
          {[nodes=unreachable] D -- E },
        }
      };
      % Tag reference
      \gittag
        [v0p1]       % node name
        {v0.1}       % node text
        {above=of A} % node placement
        {A}          % target
      % Remote branch
      \gitremotebranch
        [origmaster]    % node name
        {origin/master} % node text
        {above=of C}    % node placement
        {C}             % target
      % Branch
      \gitbranch
        {master}      % node name and text 
        {above=of E'} % node placement
        {E'}          % target
      % HEAD reference
      \gitHEAD
        {above=of master} % node placement
        {master}          % target
    \end{tikzpicture}
    \subcaption{\ldots{} and after \texttt{git rebase origin/master}}
  \end{subfigure}
  \caption{Demonstrating a typical \texttt{rebase}}
\end{figure}

\end{document}
98
répondu jubobs 2017-05-23 12:02:56

Gitg est un clone de Gitk et GitX pour GNOME (il fonctionne également sur KDE etc.) qui montre un joli graphique en couleurs.

il est activement développé (à partir de 2012). Il vous permet de trier les propagations (noeuds de graphe) soit chronologiquement ou topologiquement , et masquer les propagations qui ne mènent pas à une branche sélectionnée.

il fonctionne très bien avec de grands dépôts et des graphiques de dépendances complexes.

exemples de captures d'écran, montrant les dépôts linux-git et linux-2.6:

linux-git

linux-2.6

73
répondu Mechanical snail 2015-08-18 16:48:31

SourceTree est vraiment une bonne. Il n'imprime une bonne apparence et de taille moyenne histoire et branche graphique: (ce qui suit est fait sur un projet expérimental Git juste pour voir quelques branches). Prend en charge Windows 7+ et Mac OS X 10.6+.

enter image description here

http://www.sourcetreeapp.com /

57
répondu 太極者無極而生 2013-05-21 18:24:56

je viens d'écrire un outil qui peut générer assez git commits graph en utilisant HTML/Canvas.

et fournir un plugin jQuery qui le rendent facile à utiliser.

[github] https://github.com/tclh123/commits-graph

Extrait:

preview

54
répondu Harry Lee 2014-01-14 15:34:58

git-forest est un excellent script perl que j'utilise depuis plus d'un an et j'utilise à peine la commande git log directement.

ce sont quelques-unes des choses que j'aime dans ce script:

  • il utilise des caractères unicode pour dessiner les lignes dans le graphe donnant un regard plus continu aux lignes du graphe.
  • vous pouvez combiner --reverse avec la sortie graphique, ce qui n'est pas possible avec la commande régulière git log .
  • il utilise git log en interne pour saisir la liste des propagations, donc toutes les options que vous passez à git log peuvent aussi être passées à ce script.

j'ai un alias utilisant git-forest comme suit:

[alias]
tree = "forest --pretty=format:\"%C(red)%h %C(magenta)(%ar) %C(blue)%an %C(reset)%s\" --style=15 --reverse"

voici à quoi ressemble la sortie sur un terminal:

enter image description here

50
répondu Tuxdude 2015-08-18 16:45:52

basé sur un script Graphviz que j'ai trouvé dans une réponse à une question connexe , j'ai hacké un script ruby qui crée une vue sommaire d'un dépôt git. Il élide toute l'histoire linéaire et montre juste "intéressant" commits, c.-à-d. ceux avec plusieurs parents, plusieurs enfants, ou pointé vers par une branche ou une étiquette. Voici un extrait du graphique qu'il génère pour jquery :

jquery sample

git-big-picture et BranchMaster sont des outils similaires qui tentent de montrer que le haut niveau de la structure d'un graphe, par l'affichage de l'utilisation de balises, de branches, de fusions, etc. sont liées.

cette question a d'autres options.

41
répondu Matt McHenry 2017-05-23 12:34:51

dépend de leur apparence. J'utilise gitx qui fait des photos comme celle-ci:

simple plot

vous pouvez comparer git log --graph vs. gitk sur une fusion octopus 24-way (à l'origine de http://clojure-log.n01se.net/date/2008-12-24.html ):

24-way git octopus merge. Original URL was <codehttp://lwn.net/images/ns/kernel/gitk-octopus.png</code

36
répondu Dustin 2015-09-08 13:49:20

j'ai écrit un outil web pour convertir les journaux git en jolis graphiques SVG: Bit-Booster - Offline Commettre Graphique De L'Outil De Dessin

Télécharger la sortie de git log --pretty='%h|%p|%d' directement dans l'outil, puis cliquez sur "télécharger graphique.svg" lien.

l'outil est purement côté client, et donc aucune de vos données Git n'est partagée avec mon serveur. Vous pouvez également enregistrer le HTML + JS localement et l'exécuter en utilisant les URL "file:///". Vérifié sur Chrome 48 et Firefox 43 sur Ubuntu 12.04.

il génère HTML qui peut être posté directement dans n'importe quelle page (y compris le moteur de blogging blogspot!). Jetez un oeil à certains des billets de blog ici:

http://bit-booster.blogspot.ca /

voici une capture d'écran d'un exemple de fichier HTML généré par l'outil:

http://bit-booster.com/graph.html (l'outil)

35
répondu G. Sylvie Davies 2017-09-05 07:53:20

j'ai ajouté trois commandes personnalisées: git tree , git stree et git vtree . Je vais les étudier dans cet ordre.

[alias]
    tree = log --all --graph --decorate=short --color --format=format:'%C(bold blue)%h%C(reset) %C(auto)%d%C(reset)\n         %C(black)[%cr]%C(reset)  %x09%C(black)%an: %s %C(reset)'

enter image description here

avec git stree et git vtree j'ai utilisé bash pour aider avec le formatage.

[alias]
    logx = log --all --graph --decorate=short --color --format=format:'%C(bold blue)%h%C(reset)+%C(dim black)(%cr)%C(reset)+%C(auto)%d%C(reset)++\n+++       %C(bold black)%an%C(reset)%C(black): %s%C(reset)'
    stree = !bash -c '"                                                                             \
        while IFS=+ read -r hash time branch message; do                                            \
            timelength=$(echo \"$time\" | sed -r \"s:[^ ][[]([0-9]{1,2}(;[0-9]{1,2})?)?m::g\");     \
            timelength=$(echo \"16+${#time}-${#timelength}\" | bc);                                 \
            printf \"%${timelength}s    %s %s %s\n\" \"$time\" \"$hash\" \"$branch\" \"\";          \
        done < <(git logx && echo);"'

git_stree


[alias]
    logx = log --all --graph --decorate=short --color --format=format:'%C(bold blue)%h%C(reset)+%C(dim black)(%cr)%C(reset)+%C(auto)%d%C(reset)++\n+++       %C(bold black)%an%C(reset)%C(black): %s%C(reset)'
    vtree = !bash -c '"                                                                             \
        while IFS=+ read -r hash time branch message; do                                            \
            timelength=$(echo \"$time\" | sed -r \"s:[^ ][[]([0-9]{1,2}(;[0-9]{1,2})?)?m::g\");     \
            timelength=$(echo \"16+${#time}-${#timelength}\" | bc);                                 \
            printf \"%${timelength}s    %s %s %s\n\" \"$time\" \"$hash\" \"$branch\" \"$message\";  \
        done < <(git logx && echo);"'

git_vtree


modifier: cela fonctionne avec Git version 1.9 A. La valeur de couleur "auto" fait apparemment ses débuts dans cette version. C'est une belle addition parce que les noms de branches obtiendront une couleur différente. Il est ainsi plus facile de faire la distinction entre les branches locales et les branches éloignées, par exemple.

32
répondu gospes 2016-03-09 12:11:09

pour une sortie textuelle plus détaillée, veuillez essayer:

git log --graph --date-order -C -M --pretty=format:"<%h> %ad [%an] %Cgreen%d%Creset %s" --all --date=short

vous pouvez écrire alias dans $HOME/.gitconfig

[alias]
    graph = log --graph --date-order -C -M --pretty=format:\"<%h> %ad [%an] %Cgreen%d%Creset %s\" --all --date=short
30
répondu kaoru 2011-06-02 12:58:41

gitg : une visionneuse de dépôt basée sur gtk, qui est nouvelle mais intéressante et utile

http://git.gnome.org/browse/gitg

Je l'utilise actuellement

27
répondu saeedgnu 2013-10-30 18:50:25

bien que parfois j'utilise gitg , toujours revenir à la ligne de commande:

[alias]
    #quick look at all repo
    loggsa = log --color --date-order --graph --oneline --decorate --simplify-by-decoration --all
    #quick look at active branch (or refs pointed)
    loggs  = log --color --date-order --graph --oneline --decorate --simplify-by-decoration
    #extend look at all repo
    logga  = log --color --date-order --graph --oneline --decorate --all
    #extend look at active branch
    logg   = log --color --date-order --graph --oneline --decorate
    #Look with date
    logda  = log --color --date-order --date=local --graph --format=\"%C(auto)%h%Creset %C(blue bold)%ad%Creset %C(auto)%d%Creset %s\" --all
    logd   = log --color --date-order --date=local --graph --format=\"%C(auto)%h%Creset %C(blue bold)%ad%Creset %C(auto)%d%Creset %s\"        
    #Look with relative date
    logdra = log --color --date-order --graph --format=\"%C(auto)%h%Creset %C(blue bold)%ar%Creset %C(auto)%d%Creset %s\" --all
    logdr = log --color --date-order --graph --format=\"%C(auto)%h%Creset %C(blue bold)%ar%Creset %C(auto)%d%Creset %s\"  

    loga   = log --graph --color --decorate --all

    # For repos without subject body commits (vim repo, git-svn clones)
    logt  = log --graph --color --format=\"%C(auto)%h %d %<|(100,trunc) %s\"
    logta  = log --graph --color --format=\"%C(auto)%h %d %<|(100,trunc) %s\" --all        
    logtsa = log --graph --color --format=\"%C(auto)%h %d %<|(100,trunc) %s\" --all --simplify-by-decoration 

comme vous pouvez le voir est presque une touche de sauvegarde des alias, basé sur:

  • -- couleur: net look
  • --graphe: visualiser parents
  • --date de l'ordre: plus compréhensible regarder repo
  • --décorer: qui est qui
  • --oneline: Plusieurs fois tous vous devez savoir à propos d'un commit
  • - simplifier-par-la décoration: de base pour un premier coup d'oeil (juste des balises pertinentes de fusions, de branches)
  • --tous: sauvegarde des frappes avec tous les alias avec et sans cette option
  • --date=relative (%ar): comprendre l'activité en repo (parfois une branche est peu commet près de maître mais il ya des mois de lui)

voir dans la version récente de git (1.8.5 et plus) vous pouvez bénéficier de %C(auto) en décorer l'espace réservé %d

D'ici tout ce que vous avez besoin est une bonne compréhension de gitrevisions pour filtrer ce que vous avez besoin (quelque chose comme maître..développer ,où -- simplifier-les fusions pourraient aider avec les branches à long terme)

la puissance derrière la ligne de commande est la configuration rapide basée sur vos besoins (comprendre qu'un repo n'est pas une configuration de log de clé unique, donc ajouter --numstat, ou --raw, ou --name-status est parfois nécessaire. Ici git log et alias sont rapides, puissants et (avec le temps) le plus beau graphe que vous pouvez atteindre. Encore plus, avec la sortie affichée par défaut à travers un pager (dire moins), vous pouvez toujours rechercher rapidement à l'intérieur des résultats. Pas convaincu? Vous pouvez toujours analyser le résultat avec des projets comme gitgraph

24
répondu albfan 2015-12-18 10:44:59

Ceci est mon point de vue sur cette question:

Capture d'écran:

Screenshot

Utilisation:

git hist - montrer l'histoire de la branche actuelle

git hist --all - afficher le graphique de toutes les branches (y compris les télécommandes)

git hist master devel - montrer la relation entre deux ou plusieurs branches

git hist --branches - afficher toutes les succursales locales

Ajouter --topo-order pour trier s'engage topologiquement, plutôt que par date (par défaut dans cet alias)

prestations:

  • ressemble juste comme Uni --decorate , donc avec des couleurs séparées pour les différents noms de la branche
  • Adds committer email
  • , Ajoute commettre relative et absolue de la date
  • sortes s'engage par date

Installation:

git config --global alias.hist "log --graph --date-order --date=short \
--pretty=format:'%C(auto)%h%d %C(reset)%s %C(bold blue)%ce %C(reset)%C(green)%cr (%cd)'"
22
répondu drzymala 2017-12-07 09:16:05

j'ai cette git log alias ~/.gitconfig pour afficher le graphique de l'histoire:

[alias]
l = log --all --graph --pretty=format:'%C(auto)%h%C(auto)%d %s %C(dim white)(%aN, %ar)'

avec ceci en place, git l produira quelque chose comme:

enter image description here

dans Git 2.12 + vous pouvez même personnaliser les couleurs de ligne du graphique en utilisant l'option de configuration log.graphColors .

quant au format des logs, il est similaire à --oneline , avec l'ajout du nom d'auteur (concernant .mailmap ) et le date d'auteur relative . Notez que la syntaxe %C(auto) , qui dit à Git d'utiliser les couleurs par défaut pour le hachage de propagation, etc. est supporté en Git >= 1.8.3 .

13
répondu Eugene Yarmash 2017-08-17 07:27:08

GitGraph

génère une représentation PNG ou SVG de l'historique de propagation de votre dépôt Git.

https://code.google.com/p/gitgraph

12
répondu EddieG098 2013-04-01 14:03:01
git -c core.pager='less -SRF' log --oneline --graph --decorate

c'est ma variation terminale, semblable à beaucoup de réponses ici. J'aime ajuster les drapeaux passés à less pour empêcher l'enroulement de mots.

example output

j'ai paramétré ceci à un alias pour un accès rapide puisque la commande est un peu lourde.

10
répondu Andy 2016-01-06 03:13:02

avez-vous essayé gitk ou gitk --all ? Cependant, il n'a pas de fonction d'impression/sauvegarde img.

9
répondu Adrian Panasiuk 2009-06-29 13:14:48

je suggère tig https://github.com/jonas/tig , un outil de ligne de commande beaucoup mieux pour git.

vous pouvez utiliser homebrew pour installer tig sur macOS:

$ brew install tig
$ tig

enter image description here

7
répondu nodejh 2018-01-04 07:10:54

Essayer ditaa . Il peut transformer n'importe quel diagramme ASCII en image. Bien que l'is n'ait pas été conçu avec des branches Git à l'esprit, j'ai été impressionné par les résultats.

Source (fichier txt):

        +--------+
        | hotfix |
        +---+----+
            |
--*<---*<---*
       ^ 
       |
       \--*<---*
               |
           +---+----+
           | master |
           +--------+

commande:

java -jar ditaa0_9.jar ascii-graph.txt

résultat:

enter image description here

il supporte aussi les couleurs de fond, les lignes tiretées, différentes formes et plus. Voir les exemples .

6
répondu fracz 2016-03-25 19:37:32

il y a un graphe funky git commit comme l'un des démos de la Raphael web graphics library.

la démo est statique, mais il devrait être assez facile de prendre le code et d'échanger leurs données statiques pour un ensemble de données en direct -- je pense que c'est juste des données git commit au format JSON.

la démo est ici: http://dmitrybaranovskiy.github.io/raphael/github/impact.html

6
répondu Spudley 2016-06-07 20:45:25

Je ne sais pas s'il s'agit d'un outil direct, mais peut-être Pouvez-vous hacker un script pour exporter les données au format Point et les rendre avec graphviz.

5
répondu Thomas 2009-06-29 10:57:42

pour les utilisateurs D'OSX, j'ai pris l'exemple @gospes et l'ai légèrement modifié pour gsed ( gnu-sed installé via homebrew) et ajusté les couleurs (pour travailler avec un fond noir, pas sûr comment l'exemple original pourrait éventuellement rendre la façon dont il le fait dans l'exemple car il spécifie le texte noir sur un terminal avec un fond noir).

[alias]
    # tree, vtree, stree support
    logx = log --all --graph --decorate=short --color --format=format:'%C(bold blue)%h%C(reset)+%C(bold black)(%cr)%C(reset)+%C(auto)%d%C(reset)++\n+++       %C(bold black)%an%C(reset)%C(bold black): %s%C(reset)'
    tree = log --all --graph --decorate=short --color --format=format:'%C(bold blue)%h%C(reset) %C(auto)%d%C(reset)\n         %C(bold black)[%cr]%C(reset)  %x09%C(bold black)%an: %s %C(reset)'
    stree = !bash -c '" \
    while IFS=+ read -r hash time branch message; do \
        timelength=$(echo \"$time\" | gsed -r \"s:[^ ][[]([0-9]{1,2}(;[0-9]{1,2})?)?m::g\"); \
        timelength=$(echo \"16+${#time}-${#timelength}\" | bc); \
        printf \"%${timelength}s    %s %s %s\n\" \"$time\" \"$hash\" \"$branch\" \"\"; \
    done < <(git logx && echo);"' | less -r
    vtree = !bash -c '" \
    while IFS=+ read -r hash time branch message; do \
      timelength=$(echo \"$time\" | gsed -r \"s:[^ ][[]([0-9]{1,2}(;[0-9]{1,2})?)?m::g\"); \
      timelength=$(echo \"16+${#time}-${#timelength}\" | bc); \
      printf \"%${timelength}s    %s %s %s\n\" \"$time\" \"$hash\" \"$branch\" \"$message\"; \
    done < <(git logx && echo);"' | less -r

la clé pour OSX est d'installer d'abord gnu sed (qui a l'option-r). Plus facile à faire avec homebrew, qui n'écrira pas le sed installé par le système, mais installera gnu sed comme "gsed". Espérons que cela aide @SlippD.Thompson qui a commenté ci-dessus à propos D'OSX ne fonctionne pas.

4
répondu markeissler 2017-05-23 12:34:51

en regardant cette conversation j'ai essayé d'utiliser mon préféré git-cola & git-dag . L'exécution View->DAG... de git-cola et remplacer Log: master -- par --all montre joli graphe avec toutes les branches.

2
répondu Aleksey Kontsevich 2018-03-22 01:50:53

certains pseudonymes dans ~/.oh-my-zsh/plugins/git/git.plugin.zsh

gke='\gitk --all $(git log -g --pretty=%h)'
glg='git log --stat'
glgg='git log --graph'
glgga='git log --graph --decorate --all'
glgm='git log --graph --max-count=10'
glgp='git log --stat -p'
glo='git log --oneline --decorate'
glog='git log --oneline --decorate --graph'
gloga='git log --oneline --decorate --graph --all'
glol='git log --graph --pretty='\''%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset'\'' --abbrev-commit'
glola='git log --graph --pretty='\''%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset'\'' --abbrev-commit --all'
2
répondu shuaihanhungry 2018-07-12 11:46:53

en plus de la réponse de 'Slipp D. Thompson', je vous propose d'ajouter ce pseudonyme pour avoir la même décoration mais en une seule ligne par commit:

git config --global alias.tre "log --graph --decorate --pretty=oneline --abbrev-commit --all --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(dim white)- %an%C(reset)%C(bold yellow)%d%C(reset)'"
1
répondu Lyes CHIOUKH 2018-03-06 13:34:59