Ich habe gesehen, dass einige Bücher und Artikel einige wirklich hübsche Grafiken von Git-Zweigen und Commits haben. Wie kann ich druckfähige Bilder von Git-Historie erstellen?
Update: Diese Antwort hat weit mehr Aufmerksamkeit erhalten, als sie verdient. Sie wurde ursprünglich veröffentlicht, weil ich denke, dass die Diagramme schön aussehen und in Illustrator für eine Publikation gezeichnet werden könnten - und es gab keine bessere Lösung. Aber jetzt Es gibt viel mehr anwendbare Antworten auf dieses Q, wie zum Beispiel fracz s, Jubobs 'oder Harry Lee ! Bitte gehen Sie auf die Antworten !!
Update 2: Ich habe eine verbesserte Version dieser Antwort auf die Visualisierung der Zweig-Topologie in git question gepostet, da sie dort weitaus passender ist. Diese Version enthältlg3
zeigt sowohl die Informationen zum Autor und Committer, also sollten Sie es wirklich überprüfen. Wenn Sie diese Antwort aus historischen (& rep, ich gebe es zugeben) Gründen vor, obwohl ich wirklich versucht bin, sie einfach zu löschen.
2 ¢: Ich habe zwei Aliase, die ich normalerweise in meine ~/.gitconfig
-Datei stecke:
[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
sieht folgendermaßen aus:
und git lg2
sieht so aus:
Viele der Antworten hier sind großartig, aber für diejenigen, die nur eine einfache Zeile zur Punktantwort möchten, ohne Aliasnamen oder etwas anderes einzurichten, ist dies hier:
git log --all --decorate --oneline --graph
Nicht jeder würde ständig einen git log
machen, aber wenn du es brauchst, denk daran:
"A Dog" = git log --a ll --d ecorate --o neline --g raph
Gitgraph.js erlaubt das Zeichnen hübscher Git-Zweige ohne Repository. Schreiben Sie einfach einen Javascript-Code, der Ihre Verzweigungen und Commits konfiguriert und im Browser rendert.
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);
oder mit metro
template:
oder mit Commit-Nachrichten, Autoren und Tags:
Testen Sie es mit JSFiddle .
Generiere es mit Git Grapher von @bsara.
Auf der Basis von TikZ & PGF , gitdags
ist ein kleines LaTeX-Paket aufgebaut, mit dem Sie mühelos Vektorgrafiken, Grafiken und mehr erstellen können.
Die automatische Generierung des Bestätigungsgraphen eines vorhandenen Repositorys ist nicht, der Zweck von gitdags
; Die von ihm erzeugten Grafiken sind nur für Bildungszwecke gedacht.
Ich verwende es oft, um Grafiken für meine Antworten auf Git-Fragen zu erstellen, als Alternative zu ASCII -Schreibgraphen:
Hier ist ein Beispiel eines solchen Diagramms, das die Auswirkungen einer einfachen Rebase demonstriert:
\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 ist ein Klon von Gitk und GitX für GNOME (es funktioniert auch auf KDE usw.), der einen ziemlich farbigen Graphen zeigt.
Es ist aktiv entwickelt (Stand 2012). Damit können Sie die Commits (Diagrammknoten) entweder chronologisch oder topologisch sortieren und Commits ausblenden, die nicht zu einem ausgewählten Zweig führen.
Es funktioniert gut mit großen Repositories und komplexen Abhängigkeitsgraphen.
Beispiel-Screenshots mit den Repositorys linux-git und linux-2.6:
SourceTree ist wirklich gut. Es druckt ein gut aussehendes, mittelgroßes Verlaufs- und Zweigdiagramm aus: (Folgendes wird an einem experimentellen Git-Projekt ausgeführt, um nur einige Zweige zu sehen). Unterstützt Windows 7+ und Mac OS X 10.6+.
Ich habe gerade ein Tool geschrieben, das mit Hilfe von HTML/Canvas ein hübsches Git-Commit-Diagramm erzeugen kann.
Und stellen Sie ein jQuery-Plugin bereit, das die Verwendung erleichtert.
[github] https://github.com/tclh123/commits-graph
Vorschau:
git-forest
ist ein hervorragendes Perl-Skript, das ich seit mehr als einem Jahr verwende, und ich verwende den Befehl git log
kaum noch direkt.
Dies sind einige der Dinge, die ich an diesem Skript liebe:
--reverse
mit der Grafikausgabe kombinieren, was mit dem regulären git log
-Befehl nicht möglich ist.git log
, um die Liste der Commits zu erfassen, sodass alle Optionen, die Sie an git log
übergeben, auch an dieses Skript übergeben werden können.Ich habe einen Alias mit git-forest
wie folgt:
[alias]
tree = "forest --pretty=format:\"%C(red)%h %C(Magenta)(%ar) %C(blue)%an %C(reset)%s\" --style=15 --reverse"
So sieht die Ausgabe auf einem Terminal aus:
Basierend auf einem Graphviz-Skript, das ich in einer Antwort auf eine verwandte Frage gefunden habe, habe ich ein Ruby-Skript gehackt, das eine zusammenfassende Ansicht eines Git-Repositorys erstellt. Es beseitigt alle lineare Geschichte und zeigt nur "interessante" Commits, d. H. Solche mit mehreren Elternteilen, mehreren Kindern oder auf die durch einen Zweig oder ein Tag verwiesen wird. Hier ist ein Ausschnitt des Diagramms, das es für jquery generiert:
git-big-picture und BranchMaster sind ähnliche Werkzeuge, mit denen versucht wird, nur die übergeordnete Struktur eines Diagramms anzuzeigen, indem nur der Zusammenhang zwischen Tags, Verzweigungen, Zusammenführungen usw. angezeigt wird.
Diese Frage hat einige weitere Optionen.
Ich habe ein Web-Tool zum Konvertieren von Git-Protokollen in hübsche SVG-Diagramme geschrieben: Bit-Booster - Offline-Commit-Diagrammwerkzeug
Laden Sie die Ausgabe von git log --pretty='%h|%p|%d'
direkt in das Tool und klicken Sie dann auf den Link "download graph.svg".
Das Tool ist rein clientseitig und daher werden keine Ihrer Git-Daten mit meinem Server geteilt. Sie können HTML + JS auch lokal speichern und mit den URLs "file: ///" ausführen. Verifiziert auf Chrome 48 und Firefox 43 auf Ubuntu 12.04.
Es generiert HTML-Code, der direkt in jede Seite gepostet werden kann (einschließlich der Blogspot-Engine für Blogspots!). Sehen Sie sich hier einige Blogbeiträge an:
http://bit-booster.blogspot.ca/
Hier ist ein Screenshot einer Beispiel-HTML-Datei, die vom Tool generiert wurde:
http://bit-booster.com/graph.html (das Werkzeug)
Kommt drauf an, wie sie aussahen. Ich benutze gitx was Bilder wie diese macht:
Sie können git log --graph
mit gitk auf einer 24-poligen Octopus-Fusion vergleichen (ursprünglich von http://clojure-log.n01se.net/date/2008-12-24.html ):
Ich habe drei benutzerdefinierte Befehle hinzugefügt: git tree
, git stree
und git vtree
. Ich werde sie in dieser Reihenfolge durchgehen.
[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)'
Mit git stree
und git vtree
habe ich bash als Hilfe bei der Formatierung verwendet.
[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: Dies funktioniert mit git Version 1.9a. Der Farbwert 'auto' wird in dieser Version anscheinend debütiert. Es ist eine nette Ergänzung, da die Namen der Zweige eine andere Farbe erhalten. Dies erleichtert beispielsweise die Unterscheidung zwischen lokalen und entfernten Zweigstellen.
Für detailliertere Textausgaben versuchen Sie bitte:
git log --graph --date-order -C -M --pretty=format:"<%h> %ad [%an] %Cgreen%d%Creset %s" --all --date=short
Sie können einen Alias in $ HOME/.gitconfig schreiben
[alias]
graph = log --graph --date-order -C -M --pretty=format:\"<%h> %ad [%an] %Cgreen%d%Creset %s\" --all --date=short
gitg: Ein gtk-basierter Repository-Viewer. Das ist neu, aber interessant und nützlich
http://git.gnome.org/browse/gitg
Ich benutze es momentan
git hist
- Zeigt den Verlauf des aktuellen Zweigs an
git hist --all
- Zeigt die Grafik aller Niederlassungen (einschließlich Fernbedienungen)
git hist master devel
- Zeigt die Beziehung zwischen zwei oder mehr Zweigen an
git hist --branches
- Zeigt alle lokalen Niederlassungen an
Fügen Sie --topo-order
hinzu, um Commits topologisch statt nach Datum zu sortieren (Standard in diesem Alias).
--decorate
, also mit separaten Farben für verschiedene Zweignamengit 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)'"
Obwohl ich manchmal gitg benutze, komme ich immer wieder zur Kommandozeile:
[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
Wie Sie sehen, ist es fast ein Tastendruck, der Aliase speichert, basierend auf:
In der neuesten Version von git (1.8.5 und höher) können Sie von% C (automatisch) im Platzhalter für Platzhalter% d profitieren
Alles, was Sie brauchen, ist ein gutes Verständnis von gitrevisions , um alles zu filtern, was Sie brauchen (so etwas wie master..develop, wo --simplify-merges bei langfristigen Zweigen helfen könnte)
Die Macht hinter der Befehlszeile ist die schnelle Konfiguration, die auf Ihre Bedürfnisse zugeschnitten ist (verstehen Sie, dass ein Repo keine eindeutige Konfiguration des Schlüsselprotokolls ist, daher ist manchmal das Hinzufügen von --numstat, --raw oder --name-status erforderlich.) Hier git log und Aliasnamen sind schnell, leistungsfähig und (mit der Zeit) der schönste Graph, den Sie erreichen können. Noch mehr: Wenn die Ausgabe standardmäßig über einen Pager (weniger) angezeigt wird, können Sie immer schnell in Ergebnissen suchen. Nicht überzeugt? Sie können das Ergebnis immer analysieren mit Projekten wie gitgraph
Sehr geringfügige Änderung Slipp's geile Antwort , Sie können seine Aliase verwenden, um nur einen Zweig zu protokollieren:
[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"
Wenn Sie den --all
weglassen, können Sie dies jetzt tun
git lgBranch1 <branch name>
oder auch
git lgBranch1 --all
Ich habe diesen git log
-Alias in ~/.gitconfig
, um den Diagrammverlauf anzuzeigen:
[alias]
l = log --all --graph --pretty=format:'%C(auto)%h%C(auto)%d %s %C(dim white)(%aN, %ar)'
Wenn dies festgelegt ist, gibt git l
Folgendes aus:
In Git 2.12 + können Sie sogar die Linienfarben des Diagramms mithilfe der Konfigurationsoption log.graphColors
anpassen.
Das Format der Protokolle ist ähnlich zu --oneline
, wobei der Autorenname (unter Beachtung von .mailmap
) und das relative Autorendatum hinzugefügt wird. Beachten Sie, dass die %C(auto)
-Syntax, mit der Git angewiesen wird, die Standardfarben für Commit-Hash usw. zu verwenden, in Git> = 1.8.3 unterstützt wird.
GitGraph
Erzeugt eine PNG- oder SVG-Darstellung des Commit-Verlaufs Ihres Git-Repositorys.
git -c core.pager='less -SRF' log --oneline --graph --decorate
Dies ist meine Terminalvariante, ähnlich wie hier viele Antworten. Ich möchte die Flags anpassen, die an less
übergeben werden, um das Word-Wrapping zu verhindern.
Ich habe dies für einen schnellen Zugriff auf einen Alias gesetzt, da der Befehl etwas umständlich ist.
Haben Sie gitk
oder gitk --all
ausprobiert? Es hat jedoch keine Funktion zum Drucken/Speichern img als.
Ich empfehle tig
https://github.com/jonas/tig , Ein viel besseres Befehlszeilenprogramm für git.
Sie können Homebrew verwenden, um Tig unter macOS zu installieren:
$ brew install tig
$ tig
Es gibt ein funky Git-Commit-Diagramm als eines der Demos der Raphael Web-Grafikbibliothek.
Die Demo ist statisch, aber es sollte leicht genug sein, den Code zu nehmen und ihre statischen Daten gegen einen Live-Datensatz auszutauschen. Ich denke, es sind nur Git-Commit-Daten im JSON-Format.
Die Demo ist hier: http://dmitrybaranovskiy.github.io/raphael/github/impact.html
Versuchen Sie ditaa . Es kann jedes ASCII - Diagramm in ein Bild umwandeln. Obwohl es nicht für Git-Zweige gedacht ist, waren die Ergebnisse beeindruckt.
Quelle (txt-Datei):
+--------+
| hotfix |
+---+----+
|
--*<---*<---*
^
|
\--*<---*
|
+---+----+
| master |
+--------+
Befehl:
Java -jar ditaa0_9.jar ascii-graph.txt
Ergebnis:
Es unterstützt auch Hintergrundfarben, gestrichelte Linien, verschiedene Formen und mehr. Siehe die Beispiele .
Ich kenne kein direktes Werkzeug, aber vielleicht können Sie ein Skript hacken, um die Daten in das Punktformat zu exportieren, und es mit graphviz rendern.
Für OSX-Benutzer habe ich das @ gospes-Beispiel genommen und für gsed leicht geändert (gnu-sed
wurde über Homebrew installiert) und die Farben angepasst (mit einem schwarzen Hintergrund zu arbeiten) das Beispiel, da es schwarzen Text auf einem Terminal mit schwarzem Hintergrund angibt).
[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
Der Schlüssel für OSX ist, zuerst gnu sed (mit der Option -r) zu installieren. Am einfachsten mit Homebrew zu tun, das das vom System installierte sed nicht überschreibt, sondern gnu sed als "gsed" installiert. Hoffe das hilft @ SlippD.Thompson, der oben kommentiert über OSX nicht funktioniert.
einige Aliase in ~/.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'
Beim Betrachten dieser Konversation wurde versucht, meinen Favoriten git-cola
& git-dag
zu verwenden. Das Ausführen von View->DAG...
aus git-cola
und Ersetzen von Log: master --
durch --all
zeigt ein hübsches Diagramm mit allen Zweigen.
Zusätzlich zur Antwort von 'Slipp D. Thompson' schlage ich vor, dass Sie diesen Alias hinzufügen, um dieselbe Verzierung zu erhalten, jedoch in einer einzigen Zeile durch 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)'"
Wenn Ihr Repository auf Gitlab liegt, können Sie dessen Diagrammdarstellung verwenden, da diese in Ihrem Browser als SVG-Datei dargestellt wird.
Gehen Sie zur Diagrammansicht Ihres Repositorys, z. https://gitlab.com/gitlab-org/gitter/webapp/network/develop
Scrolle die Grafik nach unten (es wird faul geladen!)
Verwenden Sie den Inspektor Ihres Browsers, um das SVG-Element in eine neue Datei zu kopieren
Öffnen Sie es in einem Renderer Ihrer Wahl, z. Inkscape