J'ai vu des livres et des articles présenter des graphiques très jolis de branches et de commits git. Comment puis-je créer des images imprimables de haute qualité de l'historique git?
Mise à jour: cette réponse a attiré beaucoup plus d'attention qu'elle ne le mérite. Elle a été publiée à l'origine parce que je pense que les graphiques ont l'air sympa et qu'ils pourraient être dessinés dans Illustrator pour une publication - et qu'il n'y avait pas de meilleure solution. Il existe des réponses beaucoup plus applicables à ce Q, telles que celles de fracz , Jubobs 'ou Harry Lee ! S'il vous plaît, passez à celles-ci !!
Mise à jour 2: j'ai posté une version améliorée de cette réponse à la question Visualisation de la branche dans git , car elle est bien plus appropriée ici. Cette version inclutlg3
, qui affiche à la fois Informations sur l'auteur et les auteurs, vous devriez donc vraiment vérifier. Laissant cette réponse pour des raisons historiques (& rep, je l'avoue), bien que je sois vraiment tenté de le supprimer.} _
2 ¢: j'ai normalement deux alias 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
ressemble à ceci:
et git lg2
ressemble à ceci:
Beaucoup de réponses ici sont excellentes, mais pour ceux qui veulent juste une réponse simple d'une ligne à l'autre sans avoir à configurer des alias ou quoi que ce soit d'autre, voici la réponse:
git log --all --decorate --oneline --graph
Tout le monde ne ferait pas un git log
tout le temps, mais quand vous en avez besoin, rappelez-vous simplement:
"A Dog" = journal git --a ll --d ecorate --o neline --g raph
Gitgraph.js permet de dessiner de jolies branches git sans référentiel. Il vous suffit d'écrire un code Javascript qui configure vos branches et vos commits et de le restituer dans un 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);
ou avec le modèle metro
:
ou avec des messages de commit, des auteurs et des tags:
Testez-le avec JSFiddle .
Générez-le avec Git Grapher by @bsara.
Construit sur TikZ & PGF , gitdags
est un petit paquet LaTeX qui vous permet de produire sans effort des graphiques de validation graphiques vectoriels, et plus encore.
La génération automatique du graphe de validation d'un référentiel existant est not l'objectif de gitdags
; les graphiques qu'il produit ne sont destinés qu'à à des fins éducatives _.
Je l'utilise souvent pour produire des graphiques pour mes réponses aux questions de Git, en guise d'alternative aux graphiques de validation ASCII:
Voici un exemple de graphique illustrant les effets d’une base simple:
\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}
Gitg est un clone de Gitk et de GitX pour GNOME (il fonctionne également sur KDE, etc.) qui affiche un joli graphe coloré.
Il est activement développé (à partir de 2012). Il vous permet de trier les validations (nœuds de graphe) chronologiquement ou topologiquement et de masquer les validations qui ne mènent pas à une branche sélectionnée.
Cela fonctionne très bien avec les référentiels volumineux et les graphes de dépendance complexes.
Exemples de captures d'écran illustrant les référentiels linux-git et linux-2.6:
SourceTree est un très bon. Il affiche un historique et un graphe de branches de bonne taille et de taille moyenne: Prend en charge Windows 7+ et Mac OS X 10.6+.
Je viens d'écrire un outil capable de générer de jolis graphes de commits git à l'aide de HTML/Canvas.
Et fournissez un plugin jQuery qui le rend facile à utiliser.
[github] https://github.com/tclh123/commits-graph
Aperçu:
git-forest
est un excellent script Perl que j'utilise depuis plus d'un an et que je n'utilise presque plus directement la commande git log
.
Voici quelques-unes des choses que j'aime dans ce script:
--reverse
avec la sortie du graphique, ce qui n'est pas possible avec la commande normale git log
.git log
en interne pour extraire la liste des commits. Ainsi, toutes les options que vous passez à git log
peuvent également être transmises à 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:
Basé sur un script Graphviz, j'ai trouvé dans une réponse à une question connexe , j'ai piraté un script Ruby qui crée une vue récapitulative d'un référentiel git. Il élimine toute l'histoire linéaire et ne montre que les commits "intéressants", c'est-à-dire ceux qui ont plusieurs parents, plusieurs enfants, ou qui sont indiqués par une branche ou une étiquette. Voici un extrait du graphique généré pour jquery :
git-big-picture et BranchMaster sont des outils similaires qui tentent d'afficher uniquement la structure de haut niveau d'un graphe, en affichant uniquement les relations entre les balises, les branches, les fusions, etc.
Cette question a encore plus d'options.
J'ai écrit un outil Web pour convertir les journaux git en jolis graphiques SVG: Bit-Booster - Outil de dessin de graphes de validation hors ligne
Téléchargez la sortie de git log --pretty='%h|%p|%d'
directement dans l'outil, puis cliquez sur le lien "télécharger graph.svg".
L'outil est purement client et 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 à l'aide de l'URL "fichier: ///". Vérifié sur Chrome 48 et Firefox 43 sur Ubuntu 12.04.
Il génère du HTML qui peut être publié directement sur n’importe quelle page (y compris le moteur de blogspot!). Jetez un coup d'œil à quelques articles du 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)
Cela dépend de quoi ils ont l'air. J'utilise gitx qui fait des photos comme celle-ci:
Vous pouvez comparer git log --graph
et gitk sur une fusion de poulpes à 24 voies (à l'origine de http://clojure-log.n01se.net/date/2008-12-24.html ):
J'ai ajouté trois commandes personnalisées: git tree
, git stree
et git vtree
. Je vais les passer en revue 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)'
Avec git stree
et git vtree
, j’utilise bash pour aider au 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);"'
[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);"'
EDIT: Cela fonctionne avec la version 1.9a de Git. La valeur de couleur 'auto' fait apparemment ses débuts dans cette version. C'est un ajout intéressant car les noms de branches auront une couleur différente. Cela facilite la distinction entre les branches locales et distantes, par exemple.
Pour une sortie textuelle plus détaillée, essayez:
git log --graph --date-order -C -M --pretty=format:"<%h> %ad [%an] %Cgreen%d%Creset %s" --all --date=short
Vous pouvez écrire un alias dans $ HOME/.gitconfig
[alias]
graph = log --graph --date-order -C -M --pretty=format:\"<%h> %ad [%an] %Cgreen%d%Creset %s\" --all --date=short
gitg: un visualiseur de référentiel basé sur GTK, nouveau mais intéressant et utile
http://git.gnome.org/browse/gitg
Je l'utilise actuellement
git hist
- Afficher l'historique de la branche actuelle
git hist --all
- Affiche le graphique de toutes les branches (y compris les télécommandes)
git hist master devel
- Affiche la relation entre deux ou plusieurs branches
git hist --branches
- Afficher toutes les branches locales
Ajouter --topo-order
pour trier les commits topologiquement, au lieu de par date (par défaut dans cet alias)
--decorate
simple, donc avec des couleurs séparées pour différents noms de branchesgit 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)'"
Bien que parfois j'utilise gitg , reviens toujours en 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 constater, il s’agit presque d’une alias de sauvegarde de frappe, basée sur:
Voir dans la version récente de git (1.8.5 et plus), vous pouvez bénéficier de% C (auto) dans décorer un espace réservé% d
A partir de là, tout ce dont vous avez besoin est une bonne compréhension de gitrevisions pour filtrer tout ce dont vous avez besoin (quelque chose comme master..develop, où - simplifier-fusionner pourrait aider avec des branches à long terme)
La puissance derrière la ligne de commande est la configuration rapide en fonction de vos besoins (comprendre qu'un référentiel n'est pas une configuration de journal de clé unique, il est donc parfois nécessaire d'ajouter --numstat, ou --raw ou --name-status. Ici, git log Les alias sont rapides, puissants et (avec le temps), le graphique le plus joli que vous puissiez obtenir. Encore plus, avec une sortie affichée par défaut via un pageur (moins), vous pouvez toujours rechercher rapidement dans les résultats. avec des projets comme gitgraph
Très légèrement peaufiner La réponse géniale de Slipp , vous pouvez utiliser ses alias pour ne connecter qu'une branche:
[alias]
lgBranch1 = log --graph --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(bold white)— %an%C(reset)%C(bold yellow)%d%C(reset)' --abbrev-commit --date=relative
lgBranch2 = log --graph --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(bold white)— %an%C(reset)' --abbrev-commit
lg = !"git lg1"
En laissant le --all
vous pouvez maintenant faire
git lgBranch1 <branch name>
ou même
git lgBranch1 --all
J'ai cet alias git log
dans ~/.gitconfig
pour afficher l'historique du graphique:
[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:
Dans Git 2.12 +, vous pouvez même personnaliser les couleurs de la ligne du graphique à l’aide de l’option log.graphColors
configuration.
En ce qui concerne le format des journaux, il ressemble à --oneline
, avec l’ajout du nom de l’auteur (en respectant .mailmap
) et de la date de l’auteur relative. Notez que la syntaxe %C(auto)
, qui indique à Git d'utiliser les couleurs par défaut pour le hachage de validation, etc. est prise en charge dans Git> = 1.8.3 .
GitGraph
Génère une représentation PNG ou SVG de l'historique de validation de votre référentiel Git.
git -c core.pager='less -SRF' log --oneline --graph --decorate
Ceci est ma variante finale, semblable à beaucoup de réponses ici. J'aime ajuster les indicateurs passés à less
pour éviter le retour à la ligne dans Word.
Je mets cela sur un alias pour un accès rapide car la commande est un peu lourde.
Avez-vous essayé gitk
ou gitk --all
? Cependant, il n’a pas de fonction print/save img.
Je suggère tig
https://github.com/jonas/tig , Un bien meilleur outil en ligne de commande pour git.
Vous pouvez utiliser homebrew pour installer tig sur macOS:
$ brew install tig
$ tig
Il existe un graphique de validation Git funky parmi les démos de la bibliothèque graphique Raphael web.
La démo est statique, mais il devrait être assez facile de prendre le code et d'échanger ses données statiques pour un ensemble de données en direct - je pense que c'est juste des données de validation Git au format JSON.
La démo est ici: http://dmitrybaranovskiy.github.io/raphael/github/impact.html
Essayez ditaa . Il peut transformer n'importe quel diagramme ASCII en une image. Bien que ce ne soit pas conçu avec les branches Git à l'esprit, j'ai été impressionné par les résultats.
Source (fichier txt):
+--------+
| hotfix |
+---+----+
|
--*<---*<---*
^
|
\--*<---*
|
+---+----+
| master |
+--------+
Commander:
Java -jar ditaa0_9.jar ascii-graph.txt
Résultat:
Il prend également en charge les couleurs d’arrière-plan, les lignes en pointillés, différentes formes, etc. Voir les exemples .
Je ne connais pas d’outil direct, mais vous pouvez peut-être pirater un script pour exporter les données au format point et les restituer avec graphviz.
Pour les utilisateurs OSX, j’ai pris l’exemple @gospes et l’ai légèrement modifié pour gsed (gnu-sed
installé via homebrew) et ai ajusté les couleurs (pour fonctionner avec un arrière-plan noir, je ne suis pas sûr de savoir comment l’exemple original pourrait rendre le rendu ainsi) l'exemple car il spécifie du texte noir sur un terminal avec un arrière-plan 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 consiste d’abord à installer gnu sed (qui a l’option -r). Le plus facilement possible avec homebrew, qui n'écrasera pas le fichier sed installé par le système, mais installera plutôt gnu sed en tant que "gsed". Espérons que cela aide @ SlippD.Thompson qui a commenté ci-dessus à propos de OSX ne fonctionne pas.
quelques alias 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'
En regardant cette conversation, j'ai essayé d'utiliser mon git-cola
& git-dag
préféré. Lancer View->DAG...
à partir de git-cola
et remplacer Log: master --
avec --all
montre un joli graphique avec toutes les branches.
En plus de la réponse de 'Slipp D. Thompson', je vous propose d'ajouter cet alias 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)'"
Si votre référentiel est installé sur Gitlab, vous pouvez utiliser sa représentation graphique telle qu’elle apparaît en SVG dans votre navigateur.
Accédez à la vue graphique de votre référentiel, par exemple. https://gitlab.com/gitlab-org/gitter/webapp/network/develop
Faites défiler le graphique vers le bas (cela charge paresseux!)
Utilisez l'inspecteur de votre navigateur pour copier l'élément SVG dans un nouveau fichier.
Ouvrez-le dans un moteur de rendu de votre choix, par exemple. Inkscape