Grafici di ramo piuttosto git


1385

Ho visto alcuni libri e articoli avere alcuni grafici davvero carini di rami e commit di git. Come posso creare immagini stampabili di alta qualità della cronologia di Git?


4
Ho creato uno script Python per creare un grafico Graphiz! Guarda. github.com/chode/git-graph
Stephan Bechter,

4
Se vuoi alta qualità e stampabile, il mio strumento ( bit-booster.com/graph.html ) converte "git log" in SVG. Per ulteriori informazioni, vedere la mia risposta .
G. Sylvie Davies,

2
Stai cercando uno strumento per visualizzare la tua cronologia di git - o - uno strumento di creazione di grafici che ha un modo per disegnare graziosi "rami Git"?
Uri Abramson,


5
Eliminerei il tag direct-acyclic-graphs perché è irrilevante per questa domanda
Maksim Dmitriev

Risposte:


1843

Aggiornamento: questa risposta ha ottenuto molta più attenzione di quanto meriti. È stato originariamente pubblicato perché penso che i grafici abbiano un bell'aspetto e possano essere disegnati in Illustrator per una pubblicazione - e non c'era soluzione migliore. Ma ora esistono molte più risposte applicabili a questa Q, come quelle di Fracz , Jubobs o Harry Lee ! Per favore, vota quelli !!

Aggiornamento 2: ho pubblicato una versione migliorata di questa risposta alla topologia del ramo Visualizzazione in domanda git , dal momento che è molto più appropriato lì. Quella versione include lg3, che mostra sia le informazioni sull'autore che sul committer, quindi dovresti davvero verificarlo. Lasciando questa risposta per motivi storici (e rep, lo ammetterò), anche se sono davvero tentato di eliminarlo.

Il mio 2 ¢ : Ho due alias che normalmente tiro nel mio ~/.gitconfigfile:

[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 lg1assomiglia a questo:
git lg1

e si git lg2presenta così:
git lg2


35
Sì lo faccio. I colori normali e luminosi / grassetti sono: Nero #202020/ #555555, Rosso: #5d1a14/ #da4939, Verde: #424e24/ #a5c261, Giallo: #6f5028/ #ffc66d, Blu: #263e4e/ #6d9cbe, Magenta: #3e1f50/ #a256c7, Ciano: #234e3f/ #62c1a1e Bianco: #979797/ #ffffff.
Slipp D. Thompson,

3
@Turbo: per me, i colori sono modificabili nelle impostazioni del profilo per la mia app terminale (Terminal.app). L'app del terminale che stai utilizzando potrebbe non supportare la modifica dei colori visualizzati per determinati colori ANSI. Inoltre, il trattino (trattino preciso, con precisione) è stato creato con l'opzione shift-[tasto trattino-meno]. Suppongo di aver erroneamente supposto che tutte le piattaforme attuali fossero sniffate con Unicode.
Slipp D. Thompson,

3
Il tuo --date=relativee --abbrev-commitsei ridondante perché usi esplicitamente %cre %h, rispettivamente.
graywh,

6
Aggiungerei il %C(auto)modificatore a refnames ( %d) per ottenere colori più belli. Vedi stackoverflow.com/questions/5889878/color-in-git-log/…
Josef Eisl

2
Bella risposta. Ho modificato il comando in modo che assomigli di più all'output di --oneline --decorate conlg = log --graph --abbrev-commit --decorate --format=format:'%C(yellow)%h%C(reset)%C(auto)%d%C(reset) %C(normal)%s%C(reset) %C(dim white)%an%C(reset) %C(dim blue)(%ar)%C (reset)' --all
Craig P. Motlin

1199

Molte delle risposte qui sono fantastiche, ma per coloro che vogliono solo una semplice riga al punto rispondono senza dover impostare alias o altro, eccolo qui:

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

Non tutti lo farebbero git logsempre, ma quando ne hai bisogno ricorda solo:

" A Dog " = git log - a ll - d ecorate - o neline - g raph

inserisci qui la descrizione dell'immagine


252
git config --global alias.adog "log --all --decorate --oneline --graph"
venerdì

4
Ho cercato per --allcosì tanto tempo che sto per piangere (T_T) GRAZIE!
Felipe Gerard,

2
--oneline è stato introdotto in Git 1.6.3: github.com/git/git/blob/… --pretty = oneline funzionerà con le versioni Git prima della 1.6.3
Pat Myron,

13
migliore risposta su SO. Grazie per averlo mantenuto spensierato.
Tobias Feil,

4
Penso che "--decorate" sia ora incluso per impostazione predefinita. Ma mi ricorderò comunque l'acronimo in questo modo!
Josiah Yoder,

378

Per l'output testuale puoi provare:

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

o:

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

oppure: ecco un alias graphviz per disegnare il grafico DAG.

Io personalmente uso gitx, gitk --alle gitnub.


14
aggiungerei --abbrev-commit --decorate, e poi è perfetto!
asimmetrico

6
--abbrev-commit è implicito in --oneline, no?
Dwineman,

4
@dwineman sì, non è necessario --abbrev-commitse si utilizza--oneline
Thomas

2
Sembra che nella tua seconda riga git log --graph --oneline --decorate --date=relative --alll' --dateargomento sia inutile. Non riesco a vedere nessuna data mostrata nel registro.
Lerner Zhang,

la data non viene visualizzata quando --oneline è specificato
martinkunev

253

Gitgraph.js consente di disegnare rami piuttosto git senza un repository. Basta scrivere un codice Javascript che configura le filiali e le commit e renderizzarlo nel browser.

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);

grafico di esempio generato con Gitgraph.js

o con metromodello:

Tema della metropolitana GitGraph.js

o con messaggi di commit, autori e tag:

GitGraph con messaggi di commit

Provalo con JSFiddle .

Generalo con Git Grapher di @bsara.


3
Sì, è assolutamente fantastico! Inserito in fiddle jsfiddle.net/guan1oz1 in modo da poterlo provare subito.
Berkus,

14
Le frecce dovrebbero indicare i genitori, tuttavia, non i bambini.
jub0bs

4
@Jubobs: buon punto. Questo è un ostacolo comune per le persone che cercano di capire Git: pensano alla sequenza temporale invece che all'eredità. Mettere in chiaro che (quasi) tutto in git è relativo a qualcosa di precedente aiuta tutti gli altri pezzi a posto.
Slipp D. Thompson

6
Per quanto riguarda la direzione della freccia, dai documenti: * @param {Boolean} [options.reverseArrow = false] - Fa in modo che le frecce puntino agli antenati se vero
Scott

2
Cordiali saluti, dopo aver visto questo post e aver giocato con gitgraph.js, ho deciso di creare un piccolo strumento che fondamentalmente mette un'interfaccia utente in gitgraph.js. Non è finito e l'interfaccia utente non è dove voglio che sia ancora, ma i contributi sono benvenuti! dai un'occhiata: github.com/bsara/git-grapher
bsara

123

Costruito su TikZ e PGF , gitdagsè un piccolo pacchetto LaTeX che consente di produrre facilmente grafici di commit di grafica vettoriale e altro ancora.

La generazione automatica del grafico di commit di un repository esistente non è lo scopo di gitdags; i grafici che produce sono pensati solo per scopi educativi .

Lo uso spesso per produrre grafici per le mie risposte a domande Git, in alternativa ai grafici di commit ASCII:

Ecco un esempio di tale grafico che dimostra gli effetti di un semplice rebase:

inserisci qui la descrizione dell'immagine

\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}

1
@Sembra fantastico! Vorrei anche qualche riga su come usarlo: si consideri un utente Windows che non ha installato LaTeX. Come produrre un grafico da zero?
VonC,

1
@VonC Non ne sono sicuro, ma se non si desidera installare LaTeX, si potrebbe essere in grado di produrre grafici su ShareLatex e WriteLaTeX e simili. Lo esaminerò ed espanderò il wiki quando avrò più tempo ... Sentiti libero di promuovere il pacchetto:)
jub0bs,

Questa è roba fantastica! Scriverò un tutorial ad un certo punto, ma per ora, volevo solo menzionare che puoi postelaborare i tuoi grafici usando il documentclass standalone (io uso la funzione di ritaglio), usare latex input.texper generare un dvi e infine usare dvisvgm input.dviper generare un SVG con trasparenza. La conversione da SVG a un formato raster come PNG è abbastanza facile con convert -antialias -density 300 -background none input.svg output.png. A proposito, queste immagini sembrano incredibili con piena trasparenza. Stiamo
vmrob

5
Mi ci è voluto un po 'per farlo funzionare, quindi ho scritto una guida passo-passo su come far funzionare i gitdag da zero su Ubuntu 14.04
ChrisFreeman,

1
@AndreaPolci Vedi github.com/Jubobs/gitdags/issues/3 per un esempio di unione. La documentazione per gitdagsè in arrivo!
jub0bs

79

Gitg è un clone di Gitk e GitX per GNOME (funziona anche su KDE ecc.) Che mostra un grafico piuttosto colorato.

È attivamente sviluppato (a partire dal 2012). Ti consente di ordinare i commit (nodi grafici) in ordine cronologico o topologico e nascondere i commit che non portano a un ramo selezionato.

Funziona bene con grandi repository e grafici di dipendenza complessi.

Schermate di esempio che mostrano i repository linux-git e linux-2.6:

linux-git

linux-2.6


60

SourceTree è davvero buono. Stampa una storia e un grafico di rami di bell'aspetto e di medie dimensioni: (Quanto segue viene fatto su un progetto Git sperimentale solo per vedere alcuni rami). Supporta Windows 7+ e Mac OS X 10.6+.

inserisci qui la descrizione dell'immagine

http://www.sourcetreeapp.com/


È disponibile anche nell'App Store, quindi l'aggiornamento dovrebbe funzionare automaticamente.
WebOrCode

Adoro il grafico di sourcetree, ma preferirei usare la riga di comando e le impostazioni predefinite di sourcetree fanno sempre casino con i miei repository.
SgtPooki,

SourceTree insiste affinché tu crei un account Atlassian (o usi il tuo account google e conceda ad Atlassian alcune autorizzazioni per ottenere le informazioni sul tuo indirizzo e-mail e sul profilo), e dopo l'installazione su Mac (OS X El Capitan v 10.11.5) fallisce nel passaggio 'Clonning': "fatale: nessuna mappatura del sottomodulo trovata in .gitmodules per il percorso '<percorso ignorato>'" e anche uno strano avvertimento: "modelli non trovati / usr / local / git / share / git-core / templates". Messaggi molto oscuri, non così grandi.
Dmitry Shevkoplyas il

3
E dopo la disinstallazione non dimenticare di mettere in ordine i privilegi di sicurezza di Google che hai concesso in precedenza: myaccount.google.com/security -> App e siti collegati -> App connesse al tuo account -> Gestisci app
Dmitry Shevkoplyas

60

Ho appena scritto uno strumento in grado di generare un bel grafico di commit con HTML / Canvas.

E fornisci un plugin jQuery che lo rende facile da usare.

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

Anteprima:

anteprima


Sembra carino, come si ottengono i dati preformattati per disegnare questo grafico?
Olga,

3
@Olga Ho appena aggiunto il codice di backend al mio repository. È possibile visualizzare che su github.
Harry Lee,

56

git-forestè un eccellente script perl che uso da più di un anno e non uso quasi più il git logcomando direttamente.

Queste sono alcune delle cose che amo di questo script:

  • Usa i caratteri unicode per disegnare le linee nel grafico dando uno sguardo più continuo alle linee del grafico.
  • È possibile combinare --reversecon l'output grafico, che non è possibile con il git logcomando normale .
  • Usa git loginternamente per afferrare l'elenco dei commit, quindi anche tutte le opzioni che passi a git logpossono essere passate a questo script.

Ho un alias che usa git-forestcome segue:

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

Ecco come appare l'output su un terminale:

inserisci qui la descrizione dell'immagine


3
@ void.pointer - Sì, perché git-forest è uno script perl e ha dipendenze del modulo perl. Eseguire git su cygwin con i moduli perl richiesti installati potrebbe essere la migliore alternativa che potresti ottenere se lo desideri davvero su Windows :)
Tuxdude,

1
Wow, quel repository ha molti ottimi strumenti. Grazie!
Eldelshell,

1
Funziona perfettamente bene @MinGW (MSYS) sotto Win $; installa CPANM; quindi Git.pm; crea un alias e sei pronto per partire.
Sektor,

cos'è quell'emulatore di terminale molto carino che usi? Mi piacciono le cose dell'indicatore grafico di prompt.
NH.

Come installare questo "script"? Sono su Ubuntu.
user13107

50

Ho scritto uno strumento web per convertire i log git in graziosi grafici SVG: Bit-Booster - Strumento di disegno grafico di commit offline

Carica l'output git log --pretty='%h|%p|%d'direttamente nello strumento e fai clic sul link "download graph.svg".

Lo strumento è lato client puro, quindi nessuno dei tuoi dati Git è condiviso con il mio server. Puoi anche salvare l'HTML + JS localmente ed eseguirlo usando gli URL "file: ///". Verificato su Chrome 48 e Firefox 43 su Ubuntu 12.04.

Genera HTML che può essere pubblicato direttamente in qualsiasi pagina (incluso il motore di blog di blogspot!). Dai un'occhiata ad alcuni dei post del blog qui:

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

Ecco uno screenshot di un file HTML di esempio generato dallo strumento:

http://bit-booster.com/graph.html (lo strumento)


1
@Jay sembra che il colore rifletta il livello di rientro di quel particolare ramo e che i rami possano spostarsi su un'altra colonna e quindi cambiare colore.s
Thorbjørn Ravn Andersen,

44

Basato su uno script Graphviz che ho trovato in una risposta a una domanda correlata , ho creato uno script ruby che crea una vista di riepilogo di un repository git. Elimina tutta la storia lineare e mostra solo commit "interessanti", cioè quelli con più genitori, più figli o indicati da un ramo o tag. Ecco uno snippet del grafico che genera per jquery :

campione jquery

git-big-picture e BranchMaster sono strumenti simili che cercano di mostrare solo la struttura di alto livello di un grafico, mostrando solo come sono correlati tag, rami, fusioni, ecc.

Questa domanda ha alcune opzioni in più.


2
Ho provato questo, ma non sono riuscito a far funzionare correttamente il punto con l'output del nostro repository (42 filiali, 175 tag, 42.000 commit) ... Peccato ... È esattamente quello che stavo cercando!
Xavier Nodet,

1
@XavierNodet, se il tuo repository è pubblico e / o hai un messaggio di errore, ecc., Invia un problema su GitHub. Grazie!
Matt McHenry,

38

Ho aggiunto tre comandi personalizzati: git tree, git streee git vtree. Li esaminerò in questo ordine.

[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)'

inserisci qui la descrizione dell'immagine

Con git streee git vtreeho usato bash per aiutare con la formattazione.

[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


EDIT: funziona con la versione 1.9a di git. Il valore di colore "auto" sembra fare il suo debutto in questa versione. È una bella aggiunta perché i nomi dei rami avranno un colore diverso. Ciò semplifica, ad esempio, la distinzione tra filiali locali e remote.


fatal: bad color value 'auto' for variable '--pretty format':(
Girevole

Si è rivelato essere una vecchia versione di Git. Yum ha una versione piuttosto obsoleta di Git nel suo repository. Compilato dalla fonte (1.9) e funziona benissimo. È anche bello! Grazie @gospes!
Girevole

Non andare su OS X:sed: illegal option -- r
Slipp D. Thompson,

@ SlippD.Thompson: sto usando Linux :). -R è per espressioni regolari estese. Apparentemente la versione OSX di sed non ce l'ha. Forse potresti aggiornare sed. Altrimenti, puoi semplicemente riscrivere il comando sed senza regex esteso.
Gospes,

1
Per il Mac OS X sed, usa -E invece di -r
Baxter Lopez il

37

Dipende da come apparivano. Uso gitx che crea immagini come questa:

trama semplice

Puoi confrontare git log --graphvs. gitk su una fusione di polpo a 24 vie (originariamente da http://clojure-log.n01se.net/date/2008-12-24.html ):

Unione polpo git 24 vie.  L'URL originale era <code> http://lwn.net/images/ns/kernel/gitk-octopus.png </code>


49
È divertente ... avrei giurato di averti sentito dire "Unire polpo a 24 vie"!
dty

4
Per curiosità, qualcuno ha tentato di estrarre le routine di disegno di GitX (o di un altro strumento di interfaccia grafica) in un eseguibile autonomo? Se non sbaglio, convincere Cocoa a disegnare in un file PDF vettoriale non sarebbe difficile e soddisferebbe la necessità del PO di immagini stampabili ad alta Q.
Slipp D. Thompson,

Era su S3 via skitch prima che rifondassero le loro cose. Vorrei averlo ancora. :(
Dustin,

L'ho appena sostituito con una versione gitk di lwn.net/images/ns/kernel/gitk-octopus.png , collegata da clojure-log.n01se.net/date/2008-12-24.html . @Dustin: spero che vada bene. Non è la stessa immagine, ma ha uno scopo simile. Dalla schermata, sembra che faccia parte del kernel Linux, quindi immagino che potresti trovare quel commit e riprendere uno screenshot di gitx equivalente ....
naught101

34

Per un output testuale più dettagliato, prova:

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

Puoi scrivere alias in $ HOME / .gitconfig

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

29

Questa è la mia opinione su questo argomento:

Immagine dello schermo:

Immagine dello schermo

Uso:

git hist - Mostra la storia del ramo corrente

git hist --all - Mostra il grafico di tutti i rami (compresi i telecomandi)

git hist master devel - Mostra la relazione tra due o più rami

git hist --branches - Mostra tutte le filiali locali

Aggiungi --topo-orderall'ordinamento esegue il commit topologicamente, anziché per data (impostazione predefinita in questo alias)

Benefici:

  • Sembra semplice --decorate, quindi con colori separati per nomi di rami diversi
  • Aggiunge l'e-mail del committer
  • Aggiunge la data relativa e assoluta del commit
  • Ordina per data

Impostare:

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)'"


28

Anche se a volte uso gitg , torna sempre alla riga di comando:

[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 

Come puoi vedere è quasi un tasto per salvare gli alias, basato su:

  • --colore: aspetto chiaro
  • --graph: visualizza i genitori
  • --date-order: sguardo più comprensibile al repository
  • --decorate: chi è chi
  • --oneline: molte volte tutto ciò che devi sapere su un commit
  • --semplify-by-decoration: basic per un primo sguardo (solo tag, fusioni rilevanti, rami)
  • --all: salvataggio delle sequenze di tasti con tutti gli alias con e senza questa opzione
  • --date = relative (% ar): Comprendi l'attività in repository (a volte una filiale ha pochi commit vicino al master ma mesi fa da lui)

Vedi nella recente versione di git (1.8.5 e successive) puoi beneficiare di% C (auto) nel segnaposto decorativo% d

Da qui tutto ciò che serve è una buona comprensione delle gitrevisions per filtrare tutto ciò di cui hai bisogno (qualcosa come master..sviluppare, dove - semplificare le fusioni potrebbe aiutare con i rami a lungo termine)

Il potere dietro la riga di comando è la rapida configurazione in base alle tue esigenze (capire che un repository non è una configurazione di registro chiave unica, quindi a volte è necessario aggiungere --numstat, - --raw o --name-status. Qui git log e gli alias sono veloci, potenti e (con il tempo) il grafico più bello che puoi ottenere. Ancora di più, con l'output mostrato per impostazione predefinita tramite un cercapersone (diciamo meno) puoi sempre cercare rapidamente i risultati. Non sei convinto? Puoi sempre analizzare il risultato con progetti come gitgraph


Molto bella. Aggiungendoli alla mia configurazione. Ma consiglio di cambiare% Cred% d% Creset in% C (auto)% d% Creset che fornirà colori diversi per i nomi di filiali locali o remoti
MarkB42

17

Modificando leggermente la fantastica risposta di Slipp , puoi usare i suoi alias per registrare solo un ramo:

[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"

Lasciando da --allte ora puoi fare

git lgBranch1 <branch name>

o anche

git lgBranch1 --all


14

Ho questo git logalias ~/.gitconfigper visualizzare la cronologia del grafico:

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

Con questo in atto, git lverrà emesso qualcosa di simile:

inserisci qui la descrizione dell'immagine

In Git 2.12 + puoi persino personalizzare i colori delle linee del grafico usando l' log.graphColorsopzione di configurazione.

Per quanto riguarda il formato dei registri, è simile a --oneline, con l'aggiunta del nome dell'autore (rispettando .mailmap) e la relativa data dell'autore . Nota che la %C(auto)sintassi, che dice a Git di usare i colori predefiniti per commit hash, ecc. È supportata in Git> = 1.8.3 .


1
git log --graph --oneline solo per assicurarsi che oneliner non si perdesse
tsenapathy il

c'è un modo per mettere i nomi dei rami a sinistra?
anaval,

12

Hai provato gitko gitk --all? Tuttavia non ha una funzione di stampa / salvataggio img.


3
gitk è efficiente ma non molto bello.
Johan

Il fatto che sia integrato lo rende piacevole e senza problemi per me. --allTi mostra soprattutto tutti i rami.
BcK,


11
git -c core.pager='less -SRF' log --oneline --graph --decorate

Questa è la mia variazione terminale, simile a molte risposte qui. Mi piace regolare le bandiere passate lessper impedire il ritorno a capo automatico.

esempio di output

Ho impostato questo su un alias per un accesso rapido poiché il comando è un po 'ingombrante.


8

Prova le ditaa . Può trasformare qualsiasi diagramma ASCII in un'immagine. Anche se non è stato progettato pensando ai rami Git, sono stato colpito dai risultati.

Fonte (file txt):

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

Comando:

java -jar ditaa0_9.jar ascii-graph.txt

Risultato:

inserisci qui la descrizione dell'immagine

Supporta anche colori di sfondo, linee tratteggiate, forme diverse e altro. Vedi gli esempi .


1
Allo stesso modo, casual-effects.com/markdeep è molto potente per elaborare diagrammi di arte ascii disposti a mano.
Beni Cherniavsky-Paskin,

7

Se il tuo repository si trova su Gitlab, puoi usare la sua rappresentazione grafica come renderizzata come SVG nel tuo browser.

  • Vai alla visualizzazione grafica del tuo repository, ad esempio https://gitlab.com/gitlab-org/gitter/webapp/network/develop

  • Scorri il grafico verso il basso (impegna carichi pigri!)

  • Utilizza l'ispettore del browser per copiare l'elemento SVG in un nuovo file

  • Aprilo in un renderer di tua scelta, ad esempio Inkscape

inserisci qui la descrizione dell'immagine


6

Non conosco uno strumento diretto, ma forse puoi hackerare uno script per esportare i dati in formato punto e renderizzarli con graphviz.


Prova questo github.com/gugod/bin/blob/master/git-graphviz . Non avevo tutte le dipendenze nel mio ambiente aziendale, quindi cambiare quei iocomandi in semplici comandi perl `git log [...]` ha funzionato per me.
Ross Rogers,

Se sei su un Mac e vuoi provare questo script, puoi prendere perl con brew install perl dote quindi cpan common::sense IO::allottenere le dipendenze. Quindi, reindirizza l'output a un comando appropriato, come git-graphviz | dot -Tpng -o repo.png. Tuttavia, l'output non è molto diverso da git-big-picture .
jrhorn424,

6

C'è un grafico funky di commit Git come una delle demo della libreria di grafica web Raphael .

La demo è statica, ma dovrebbe essere abbastanza semplice prendere il codice e scambiare i loro dati statici con un set di dati dal vivo - penso che sia solo Git commit dati in formato JSON.

La demo è qui: http://dmitrybaranovskiy.github.io/raphael/github/impact.html


1
È lo stesso codice grafico utilizzato sui grafici di impatto di GitHub, no? (es. github.com/DmitryBaranovskiy/raphael/graphs/impact )
Slipp D. Thompson

@Sven: grazie per averlo sottolineato. Ho corretto i collegamenti interrotti per te, anche se tieni presente che questa risposta ha cinque anni e quindi potrebbe esserci una soluzione migliore più recentemente.
Spudley,

@ SlippD.Thompson questo codice è ora disponibile su github.com/DmitryBaranovskiy/raphaeljs.com/tree/master/github
Vadim Kotov

6

Un output grafico git gradevole e pulito per le shell

con hash come usualmente oltre all'albero grafico

con hash come usualmente oltre all'albero grafico

o in una colonna aggiuntiva

o in una colonna aggiuntiva

Modifica : vuoi iniziare subito senza leggere spiegazioni? Usa frammenti di codice alias, script o codici funzione dalla sezione EDIT 5 di seguito.

In tutte le risposte a questa domanda nessuno ha mostrato finora un risultato pulito simile a un tablel per shell. La più vicina è stata questa risposta da Gospes da cui sono partito.

Il punto centrale del mio approccio è contare solo i caratteri dell'albero mostrati all'utente. Quindi riempirli per una lunghezza personale con spazi bianchi.

Oltre a git hai bisogno di questi strumenti

  • grep
  • incolla
  • printf
  • sed
  • ss
  • TR
  • bagno

principalmente a bordo con qualsiasi distribuzione linux.

Lo snippet di codice è

while IFS=+ read -r graph hash time branch message;do

  # count needed amount of whitespaces and create them
  whitespaces=$((9-$(sed -nl1000 'l' <<< "$graph" | grep -Eo '\\\\|\||\/|\ |\*|_' | wc -l)))
  whitespaces=$(seq -s' ' $whitespaces|tr -d '[:digit:]')

  # show hashes besides the tree ...
  #graph_all="$graph_all$graph$(printf '%7s' "$hash")$whitespaces \n"

  # ... or in an own column
  graph_all="$graph_all$graph$whitespaces\n"
  hash_all="$hash_all$(printf '%7s' "$hash")  \n"

  # format all other columns
  time_all="$time_all$(printf '%12s' "$time") \n"
  branch_all="$branch_all$(printf '%15s' "$branch")\n"
  message_all="$message_all$message\n"
done < <(git log --all --graph --decorate=short --color --pretty=format:'+%C(bold 214)%<(7,trunc)%h%C(reset)+%C(dim white)%>(12,trunc)%cr%C(reset)+%C(214)%>(15,trunc)%d%C(reset)+%C(white)%s%C(reset)' && echo);

# paste the columns together and show the tablelike output
paste -d' ' <(echo -e "$time_all") <(echo -e "$branch_all") <(echo -e "$graph_all") <(echo -e "$hash_all") <(echo -e "$message_all")

Per calcolare gli spazi bianchi necessari che utilizziamo

  sed -nl500 'l' <<< "$graph"

per ottenere tutti i caratteri (fino a 500 per riga) che selezionare solo i caratteri dell'albero: * | / \ _ e spazi bianchi con

  grep -Eo '\\\\|\||\/|\ |\*|_'

infine contali e sottrai il risultato dal nostro valore di lunghezza scelto, che è 9 nell'esempio.

Per produrre la quantità calcolata di spazi bianchi che utilizziamo

  seq -s' ' $whitespaces

e troncare i numeri di posizione con

  tr -d '[:digit:]'

di aggiungerli alla fine della nostra linea del grafico. Questo è tutto!

Git ha la bella opzione per formattare la lunghezza degli identificatori di output già con la sintassi '%><(amount_of_characters,truncate_option)', che aggiunge spazi bianchi dal lato sinistro '>' o destro '<' e può troncare i caratteri dall'inizio 'ltrunc', mezzo 'mtrunc' o fine 'trunc'.

È importante che printf cmd sopra usi gli stessi valori di lunghezza per la colonna git corrispondente.

Divertiti a modellare il tuo output pulito, simile a quello di un tablel, in base alle tue esigenze.

Extra:

Per ottenere il valore di lunghezza corretto, puoi utilizzare il frammento seguente

while read -r graph;do
    chars=$(sed -nl1000 'l' <<< "$graph" | grep -Eo '\\\\|\||\/|\ |\*|_' | wc -l)
    [[ $chars -gt ${max_chars:-0} ]] && max_chars=$chars
done < <(git log --all --graph --pretty=format:' ')

e usa $ max_chars come il giusto valore di lunghezza sopra.


EDIT 1 : Ho appena notato che il carattere di sottolineatura viene usato anche nell'albero git e modifica i frammenti di codice sopra di conseguenza. Se mancano altri personaggi, lascia un commento.


EDIT 2 : Se vuoi eliminare le parentesi attorno alle voci di ramo e tag, usa "% D" invece di "% d" nel comando git, come in EDIT 3.


EDIT 3 : forse l'opzione di colore "auto" è quella che preferisci per le voci di ramo e tag?

git headless auto color head e tag tablelike shell output

Cambia questa parte del comando git (colore 214 )

%C(214)%>(15,trunc)%D%C(reset)

per auto

%C(auto)%>(15,trunc)%D%C(reset)


EDIT 4 : O ti piace il tuo mix di colori per quella parte, un output di fantasia con la testa lampeggiante?

uscita tablelike in stile fantasia git tree

Per poter dare uno stile a testa, nomi di ramo e tag, abbiamo prima bisogno dell'opzione di colore "auto" nel nostro comando git come in EDIT 3.

Quindi possiamo sostituire i valori di colore conosciuti con i nostri aggiungendo queste 3 righe

 # branch name styling
 branch=${branch//1;32m/38;5;214m}
 # head styling
 branch=${branch//1;36m/3;5;1;38;5;196m}
 # tag styling
 branch=${branch//1;33m/1;38;5;222m}

appena prima della linea

 branch_all="$branch_all$(printf '%15s' "$branch")\n"

nel nostro frammento di codice. I valori di sostituzione producono i colori sopra.

Ad esempio, il valore di sostituzione per head è

3;5;1;38;5;196

dove 3; sta per corsivo, 5; per lampeggiare e 1; 38; 5; 196 per il colore. Per maggiori informazioni inizia qui. Nota: questo comportamento dipende dal terminale preferito e potrebbe pertanto non essere utilizzabile.

MA puoi scegliere qualsiasi valore di colore che preferisci.

PANORAMICA dei valori di colore git e degli equivalenti ANSI

inserisci qui la descrizione dell'immagine

Puoi trovare un elenco con l' opzione git color / style qui .

Se hai bisogno dell'output sulla tua console per colori accurati (l'immagine sopra è ridimensionata dallo stackoverflow) puoi produrre l'output con

for ((i=0;i<=255;i++));do
  while IFS='+' read -r tree hash;do 
    echo -e "$(printf '%-10s' "(bold $i)") $hash  $(sed -nl500 'l' <<< "$hash"|grep -Eom 1 '[0-9;]*[0-9]m'|tr -d 'm')"
  done < <(git log --all --graph --decorate=short --color --pretty=format:'+%C(bold '$i')%h%C(reset)'|head -n 1)
done

nel percorso del progetto git che utilizza il primo commit dall'output del log git.


EDIT 5 : Come menzionato il membro "Andras Deak", ci sono alcuni modi per utilizzare questo codice:

1) come alias :

alias non accetta parametri ma una funzione può , quindi basta definire nel tuo .bashrc

   function git_tably () {
     unset branch_all graph_all hash_all message_all time_all max_chars

     ### add here the same code as under "2) as a shell-script" ###

   }

e chiama la funzione git_tably (derivata da tablelike) direttamente sotto il percorso del tuo progetto git o da dove vuoi con il tuo percorso del progetto git come primo parametro.

2) come shell-script :

Lo uso con l'opzione per passare una directory di progetto git come primo parametro o se vuota, prendo la directory di lavoro come il normale comportamento. Nella sua interezza abbiamo

# edit your color/style preferences here or use empty values for git auto style
tag_style="1;38;5;222"
head_style="1;3;5;1;38;5;196"
branch_style="38;5;214"

# determine the max character length of your git tree
while IFS=+ read -r graph;do
  chars_count=$(sed -nl1000 'l' <<< "$graph" | grep -Eo '\\\\|\||\/|\ |\*|_' | wc -l)
  [[ $chars_count -gt ${max_chars:-0} ]] && max_chars=$chars_count
done < <(cd "${1:-"$PWD"}" && git log --all --graph --pretty=format:' ')

# create the columns for your prefered tablelike git graph output
while IFS=+ read -r graph hash time branch message;do

  # count needed amount of whitespaces and create them
  whitespaces=$(($max_chars-$(sed -nl1000 'l' <<< "$graph" | grep -Eo '\\\\|\||\/|\ |\*|_' | wc -l)))
  whitespaces=$(seq -s' ' $whitespaces|tr -d '[:digit:]')

  # show hashes besides the tree ...
  #graph_all="$graph_all$graph$(printf '%7s' "$hash")$whitespaces \n"

  # ... or in an own column
  graph_all="$graph_all$graph$whitespaces\n"
  hash_all="$hash_all$(printf '%7s' "$hash")  \n"

  # format all other columns
  time_all="$time_all$(printf '%12s' "$time") \n"
  branch=${branch//1;32m/${branch_style:-1;32}m}
  branch=${branch//1;36m/${head_style:-1;36}m}
  branch=${branch//1;33m/${tag_style:-1;33}m}
  branch_all="$branch_all$(printf '%15s' "$branch")\n"
  message_all="$message_all$message\n"

done < <(cd "${1:-"$PWD"}" && git log --all --graph --decorate=short --color --pretty=format:'+%C(bold 214)%<(7,trunc)%h%C(reset)+%C(dim white)%>(12,trunc)%cr%C(reset)+%C(auto)%>(15,trunc)%D%C(reset)+%C(white)%s%C(reset)' && echo);

# paste the columns together and show the tablelike output
paste -d' ' <(echo -e "$time_all") <(echo -e "$branch_all") <(echo -e "$graph_all") <(echo -e "$hash_all") <(echo -e "$message_all")

3) come alias git :

Forse il modo più comodo è aggiungere un alias git nel tuo .gitconfig

[color "decorate"]
    HEAD = bold blink italic 196
    branch = 214
    tag = bold 222

[alias]
    count-log = log --all --graph --pretty=format:' '
    tably-log = log --all --graph --decorate=short --color --pretty=format:'+%C(bold 214)%<(7,trunc)%h%C(reset)+%C(dim white)%>(12,trunc)%cr%C(reset)+%C(auto)%>(15,trunc)%D%C(reset)+%C(white)%s%C(reset)'
    tably     = !bash -c '"                                                                                                    \
                  while IFS=+ read -r graph;do                                                                                 \
                    chars_count=$(sed -nl1000 \"l\" <<< \"$graph\" | grep -Eo \"\\\\\\\\\\\\\\\\|\\||\\/|\\ |\\*|_\" | wc -l); \
                    [[ $chars_count -gt ${max_chars:-0} ]] && max_chars=$chars_count;                                          \
                  done < <(git count-log && echo);                                                                             \
                  while IFS=+ read -r graph hash time branch message;do                                                        \
                    chars=$(sed -nl1000 \"l\" <<< \"$graph\" | grep -Eo \"\\\\\\\\\\\\\\\\|\\||\\/|\\ |\\*|_\" | wc -l);       \
                    whitespaces=$(($max_chars-$chars));                                                                        \
                    whitespaces=$(seq -s\" \" $whitespaces|tr -d \"[:digit:]\");                                               \
                    graph_all=\"$graph_all$graph$whitespaces\n\";                                                              \
                    hash_all=\"$hash_all$(printf \"%7s\" \"$hash\")  \n\";                                                     \
                    time_all=\"$time_all$(printf \"%12s\" \"$time\") \n\";                                                     \
                    branch_all=\"$branch_all$(printf \"%15s\" \"$branch\")\n\";                                                \
                    message_all=\"$message_all$message\n\";                                                                    \
                  done < <(git tably-log && echo);                                                                             \
                  paste -d\" \" <(echo -e \"$time_all\") <(echo -e \"$branch_all\") <(echo -e \"$graph_all\")                  \
                                <(echo -e \"$hash_all\") <(echo -e \"$message_all\");                                          \
                '"

Basta chiamare git tablysotto qualsiasi percorso del progetto.

Git è così potente che puoi cambiare testa, tag, ... direttamente come mostrato sopra e preso da qui .

Un'altra fantastica opzione è quella di selezionare i colori degli alberi che preferisci

[log]
    graphColors = bold 160, blink 231 bold 239, bold 166, bold black 214, bold green, bold 24, cyan

che ti dà output di log git dall'aspetto pazzo ma sempre tablelike

fanciest_git_tree_tablelike_image

Lampeggia troppo! Giusto per dimostrare ciò che è possibile. Troppi pochi colori specificati portano a ripetizioni di colore.

Un riferimento .gitconfig completo è a portata di clic.

ANCORA: divertiti a modellare il tuo output pulito simile a quello di un tablel secondo le tue esigenze.


Dovresti spiegare nella tua risposta come questi frammenti di bash si trasformeranno in fantasiosi comandi simili a log di git. Si può capire usando la risposta che hai collegato, ma le risposte dovrebbero essere autosufficienti
Andras Deak

Vuoi dire che dovrei spiegare il registro git in dettaglio? O potresti darmi un esempio di cosa ti stai perdendo, per favore.
onemorequestion

Nota: l'output del fantastico comando git log viene utilizzato da questo snippet per ricevere l'output simile a una tabella su un terminale. Quindi, viceversa, come hai detto;)
onemorequestion

Ho pensato che non scrivessi 20 righe di bash ogni volta che ne hai bisogno. Ha senso definirlo come una funzione bash o un alias git. La maggior parte dei lettori non si preoccuperà di provare a completare il codice per renderlo facilmente utilizzabile. Ecco cosa intendevo. Se hai appena inserito il codice in un file sh casuale sul tuo percorso, puoi ignorarmi.
Andras Deak

1
Vedo. Grazie per il tuo consiglio. Modificherò la mia risposta e aggiungerò un tale alias. Normalmente uso i file per comandi "lunghi" come hai menzionato. Ma avere entrambi i modi scritti qui è molto più comodo, sono d'accordo.
onemorequestion

5

alcuni alias 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'

4

Per gli utenti di OSX, ho preso l'esempio di @gospes e l'ho leggermente modificato per gsed ( gnu-sedinstallato tramite homebrew) e ho regolato i colori (per lavorare con uno sfondo nero, non sono sicuro di come l'esempio originale potrebbe renderlo come nel esempio poiché specifica il testo nero su un terminale con uno sfondo nero).

[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 chiave per OSX è installare prima gnu sed (che ha l'opzione -r). Il più facilmente possibile con homebrew, che non sovrascriverà sed installato nel sistema, ma installerà invece gnu sed come "gsed". Spero che questo aiuti @ SlippD.Thompson che ha commentato sopra su OSX che non funziona.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.