Visualizzazione della topologia di diramazione in Git


884

Sto giocando con Git in isolamento sulla mia macchina, e trovo difficile mantenere un modello mentale di tutti i miei rami e impegni. So di poter fare un git logper vedere la cronologia del commit da dove mi trovo, ma c'è un modo per vedere l'intera topografia del ramo, qualcosa come queste mappe ASCII che sembrano essere usate ovunque per spiegare i rami?

      .-A---M---N---O---P
     /     /   /   /   /
    I     B   C   D   E
     \   /   /   /   /
      `-------------'

È come se qualcuno stesse arrivando e provando a ritirare il mio repository avrebbe difficoltà a capire esattamente cosa stava succedendo.

Immagino di essere influenzato dal browser di streaming di AccuRev ...



1
@ leif81, un mezzo duplicato, per me. @Masi ha esplicitamente escluso gitk nella sua domanda.
Benjol,

Risposte:


1083

Usa git log --grapho gitk. (Entrambi accettano anche --all, che mostrerà tutti i rami invece di quello attuale.)

Per i nomi delle filiali e una vista compatta, prova:

git log --graph --decorate --oneline

47
Questo non identifica nemmeno i commit con i rami. Non lo definirei una buona visualizzazione così com'è.
Roman Starkov,

7
Grazie! gitg ha anche l' --allopzione e identifica anche i commit. Inoltre non ho mai visto nel menu a discesa che puoi selezionare tutti i rami lì.
Thomas,

210
Consiglierei git log --graph --decorate --oneline: mostra un commit per riga e decora con i nomi delle filiali.
sleske,

8
tig (un client ncurse git) fornisce anche l' --allopzione. Abbastanza utile!
Pierre-Adrien Buisson,

5
Vedi anche la risposta di Andrew riguardo --simplify-by-decorationall'opzione.
ruvim,

483

Di solito uso

git log --graph --full-history --all --pretty=format:"%h%x09%d%x20%s"

Con i colori (se la tua shell è Bash):

git log --graph --full-history --all --color \
        --pretty=format:"%x1b[31m%h%x09%x1b[32m%d%x1b[0m%x20%s"

Questo stamperà una rappresentazione testuale come questa:

* 040cc7c       (HEAD, master) Manual is NOT built by default
* a29ceb7       Removed offensive binary file that was compiled on my machine and was hence incompatible with other machines.
| * 901c7dd     (cvc3) cvc3 now configured before building
| * d9e8b5e     More sane Yices SMT solver caller
| | * 5b98a10   (nullvars) All uninitialized variables get zero inits
| |/
| * 1cad874     CFLAGS for cvc3 to work successfully
| *   1579581   Merge branch 'llvm-inv' into cvc3
| |\
| | * a9a246b   nostaticalias option
| | * 73b91cc   Comment about aliases.
| | * 001b20a   Prints number of iteration and node.
| |/
|/|
| * 39d2638     Included header files to cvc3 sources
| * 266023b     Added cvc3 to blast infrastructure.
| * ac9eb10     Initial sources of cvc3-1.5
|/
* d642f88       Option -aliasstat, by default stats are suppressed

(Potresti semplicemente usare git log --format=oneline, ma legherà i messaggi di commit ai numeri, che sembra meno carino IMHO).

Per creare una scorciatoia per questo comando, potresti voler modificare il tuo ~/.gitconfigfile:

[alias]
  gr = log --graph --full-history --all --color --pretty=tformat:"%x1b[31m%h%x09%x1b[32m%d%x1b[0m%x20%s%x20%x1b[33m(%an)%x1b[0m"

Tuttavia, come osserva Sodel the Vociferous nei commenti, è difficile memorizzare un comando di formattazione così lungo. Di solito, non è un problema in quanto è possibile inserirlo nel ~/.gitconfigfile. Tuttavia, se a volte è necessario accedere a un computer remoto in cui non è possibile modificare il file di configurazione, è possibile utilizzare una versione più semplice ma più veloce per digitare:

git log --graph --oneline

10
Se ti piacciono le date: git log --graph --full-history --all --color --date = short --pretty = format: "% x1b [31m% h% x09% x1b [32m% d% x1b [ 0m% x20% ad% s "
sehugg l'

7
--oneline è un sostituto più memorabile di tutta quella magia magica di formattazione.
Daniel Ralston,

1
@SodeltheVociferous, in effetti, non ho affrontato il problema dal lato di cui parli; Ho ampliato la mia risposta.
P Shved,

2
Nota: --full-historyè rilevante solo quando si utilizza --simplify-by-decorationo si specifica un percorso file.
Slipp D. Thompson,

2
Potrei chiederti da dove hai preso la stringa di formato? O come mai hai inventato quella cosa?
elliotwesoff,

444

Ho 3 alias (e 4 alias per un rapido utilizzo) che normalmente tiro nel mio ~/.gitconfigfile:

[alias]
    lg = lg1
    lg1 = lg1-specific --all
    lg2 = lg2-specific --all
    lg3 = lg3-specific --all

    lg1-specific = 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(auto)%d%C(reset)'
    lg2-specific = 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(auto)%d%C(reset)%n''          %C(white)%s%C(reset) %C(dim white)- %an%C(reset)'
    lg3-specific = 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 cyan)(committed: %cD)%C(reset) %C(auto)%d%C(reset)%n''          %C(white)%s%C(reset)%n''          %C(dim white)- %an <%ae> %C(reset) %C(dim white)(committer: %cn <%ce>)%C(reset)'

git lg/ git lg1assomiglia a questo:

git lg1

git lg2 Somiglia a questo:

git lg2

e si git lg3presenta così:

git lg3

Va notato che questo non è inteso come una soluzione universale: è un modello per te da modificare, aggiungere e correggere a tuo piacimento. Se si desidera utilizzare questi, la mia raccomandazione è di:

  1. Aggiungili al tuo .gitconfig,
  2. Personalizza a tuo piacimento (diverse scelte di colore, diverse disposizioni di linea per le versioni a 2 e 3 linee, ecc.),
  3. Quindi salva una copia in un Gist o in un altro strumento per lo snippet di codice in modo da poterlo copiare e incollare in .gitconfigs in futuro (o in alternativa controlla la versione dei tuoi dotfile, ovviamente) .

Nota: risposta copiata da e migliorata sulla risposta su stackoverflow.com/questions/1057564/pretty-git-branch-graphs poiché è molto più appropriato qui di quanto non fosse lì. Ha lasciato la copia sull'altra domanda per motivi storici: ora è chiusa e la risposta è citata da un mucchio di altre risposte.


10
Suggerimento: sostituire %C(bold yellow)con %C(auto)per avere colori diversi per HEAD, filiali locali e remote ( rif ).
Atcold,

2
Nota che puoi evitare di aggiungere manualmente il rientro nella tua stringa di formato usando %w(); in questo modo è anche possibile avvolgere correttamente i messaggi di commit più lunghi o multilinea senza incasinare il grafico.
charliegreen,

1
@ mbadawi23 Sono ridondanti per motivi di coerenza tra le piattaforme e le installazioni Git. --abbrev-commitè lì perché la 2a-3a riga è indentata a mano con spazi, e volevo essere assolutamente sicuro che avrebbe usato il SHA corto, quindi più sicuro che dispiaciuto. --decorateè anche lì perché, sebbene le impostazioni predefinite di Git facciano la stessa cosa, ciò potrebbe essere configurato in modo diverso o diverso nelle diverse versioni di Git - per questi, voglio assolutamente la decorazione. In definitiva, i flag extra / ridondanti non sono male qui - questo va in un file; non è qualcosa che scrivi tutto il tempo.
Slipp D. Thompson,

1
@TimothyPulliam Alla fine di ogni riga che rappresenta la punta di ogni ramo / tag, vedrai i nomi di ramo / tag associati tra parentesi, ad es. Nelle schermate lg1& lg2puoi vedere (origin/test_on_10.8)mostrando il ramo remoto e nello lg2screenshot puoi vedere la (HEAD -> master, origin/master, origin/HEAD)visualizzazione delle posizioni sia locali che remote della masterfiliale e HEAD. Ciò corrisponde a ciò che fanno i più popolari strumenti GUI di visualizzazione dei rami per Git (gitk, SourceTree, TortoiseGit, Tower, Fork, GitX), sebbene con un po 'più di verbosità (alcuni strumenti della GUI usano la codifica a colori) .
Slipp D. Thompson,

2
@TimothyPulliam Per capire quali commit fanno “parte di ogni ramo”, devi tracciare visivamente la linea colorata. Quasi tutti gli strumenti non ti aiutano molto perché Git si impegna a non appartenere intrinsecamente a nessun ramo - sono impliciti (al momento della visualizzazione dei grafici) di appartenere a qualsiasi ramo o tag che li ha nella loro origine padre . Se nessun ramo / tag fa riferimento a un commit e questo scompare (ma non viene raccolto per circa 2 settimane); aggiungi un ramo / tag che fa riferimento a un commit precedentemente non referenziato e ricompare. Spero che tutto ciò abbia un senso.
Slipp D. Thompson,

236

A una qualsiasi di queste ricette (basata su git log o gitk), puoi aggiungere --simplify-by-decorationper comprimere le parti lineari poco interessanti della storia. Questo rende molto più visibile la topologia contemporaneamente. Ora posso capire grandi storie che sarebbero incomprensibili senza questa opzione!

Ho sentito il bisogno di pubblicare questo perché non sembra essere così noto come dovrebbe essere. Non appare nella maggior parte delle domande di Stack Overflow sulla visualizzazione della cronologia e mi ci è voluto un bel po 'di ricerca per trovare - anche dopo aver saputo che lo volevo! L'ho finalmente trovato in questo rapporto sui bug di Debian . La prima menzione su Stack Overflow sembra essere questa risposta di Antoine Pelisse.


3
Perfetto - esattamente quello che stavo cercando! Dovrebbe ottenere più voti; quasi tutti già conoscono gitk / gitg / git log --graph, ma quelli non sono affatto molto utili se si desidera visualizzare la topologia della filiale e non ci si preoccupa dei singoli commit.
imolit

4
Questo è esattamente ciò di cui avevo bisogno, fantastico. È l'unica cosa che mi ha aiutato, tra tutte le risposte. --simplify-by-decorationchiarisce cosa sta succedendo.
Ela782,

9
Questa dovrebbe davvero essere la risposta. git log --graph --all --simplify-by-decorationfunziona anche.
Irfy,

Se solo potessimo usare --simplify-by-decorationmentre aggiungiamo n commit prima / dopo ogni commit deocrato (like -Be -Afor grep).
Junvar

Uso questa soluzione così frequentemente da averlo come "git tree".
user16973,

76

Gitk a volte doloroso per me leggere.

inserisci qui la descrizione dell'immagine

Motivami a scrivere GitVersionTree .

inserisci qui la descrizione dell'immagine


3
@exhuma Ho una PR con l'autore per supportare Mono (testato su Ubuntu 13.10 contro Mono 2.10)
Max Ehrlich

1
Ho scoperto che GitVersionTree mantiene i rami nello stesso posto con il tempo, il che rende più facile vedere come cambiano le cose.
sfranky,

48

Il 99,999% del mio tempo guarda la storia git lge lo 0,001% lo è git log.

Voglio solo condividere due alias di log che potrebbero essere utili (configurare da .gitconfig):

[Alias]
     lg = log --graph --pretty=format:'%Cred%h%Creset %ad %s %C(yellow)%d%Creset %C(bold blue)<%an>%Creset' --date=short
     hist = log --graph --full-history --all --pretty=format:'%Cred%h%Creset %ad %s %C(yellow)%d%Creset %C(bold blue)<%an>%Creset' --date=short
  • git lg vedrà l'attuale cronologia delle filiali.
  • git hist vedrà la storia di tutto il ramo.

44

Dai un'occhiata a Gitkraken , una GUI multipiattaforma che mostra la topologia in modo lucido.

Topologia

Ecco un breve video tutorial su alcune funzionalità avanzate.


6
In che modo questo thread ha GitKraken, ma non ha SourceTree precedente e gratuito? (Lo so, lo so, Atlassian non sempre fa tutto bene. Ma SourceTree è un ottimo strumento per la visualizzazione.)
XML

43

Mi piace, con git log, fare:

 git log --graph --oneline --branches

(anche con --all, anche per visualizzare filiali remote)

Funziona con le recenti versioni git: introdotte dal 1.6.3 ( Gio 7 Mag 2009 )

  • " --pretty=<style>" L'opzione per la famiglia di comandi dei log ora può essere scritta come " --format=<style>".
    Inoltre, --format=%formatstringè una scorciatoia per --pretty=tformat:%formatstring.

  • " --oneline" è sinonimo di " --pretty=oneline --abbrev-commit".

PS D:\git\tests\finalRepo> git log --graph --oneline --branches --all
* 4919b68 a second bug10 fix
* 3469e13 a first bug10 fix
* dbcc7aa a first legacy evolution
| * 55aac85 another main evol
| | * 47e6ee1 a second bug10 fix
| | * 8183707 a first bug10 fix
| |/
| * e727105 a second evol for 2.0
| * 473d44e a main evol
|/
* b68c1f5 first evol, for making 1.0

È inoltre possibile limitare l'intervallo della visualizzazione del registro (numero di commit):

PS D:\git\tests\finalRepo> git log --graph --oneline --branches --all -5
* 4919b68 a second bug10 fix
* 3469e13 a first bug10 fix
* dbcc7aa a first legacy evolution
| * 55aac85 another main evol
| | * 47e6ee1 a second bug10 fix

(mostra solo gli ultimi 5 commit)


Quello che non mi piace della soluzione attualmente selezionata è:

 git log --graph

Ha visualizzato troppe informazioni (quando voglio solo guardare un breve riepilogo):

PS D:\git\tests\finalRepo> git log --graph
* commit 4919b681db93df82ead7ba6190eca6a49a9d82e7
| Author: VonC <vonc@laposte.net>
| Date:   Sat Nov 14 13:42:20 2009 +0100
|
|     a second bug10 fix
|
* commit 3469e13f8d0fadeac5fcb6f388aca69497fd08a9
| Author: VonC <vonc@laposte.net>
| Date:   Sat Nov 14 13:41:50 2009 +0100
|
|     a first bug10 fix
|

gitk è fantastico, ma mi costringe a lasciare la sessione della shell per un'altra finestra, mentre visualizzare gli ultimi n commit rapidamente è spesso sufficiente.


Ho scelto anche questo metodo, ma ho creato un alias in modo che digitare "git graph" sia lo stesso dell'esecuzione di "git log --graph --decorate --oneline".
Will Pike,

@ConnerPike buona idea. Ho l'alias 'LG' me stesso: si veda stackoverflow.com/a/3667139/6309
VonC

35

Gitg è un ottimo strumento per Linux, simile a Gitx per OS X. Basta eseguire 'gitg' sulla riga di comando da qualche parte all'interno della struttura ad albero del proprio repository (lo stesso con gitx).


3
In così tante parole: gitg ha un menu a discesa in cui è possibile scegliere quale ramo visualizzare. Questo menu a discesa ha anche un'opzione "Tutto".
Phluks,

1
Oppure puoi iniziare con gitg --all, se vuoi evitare di perdere tempo nel menu a discesa.
imolit

25

Ho trovato "git-big-picture" abbastanza utile: https://github.com/esc/git-big-picture

Crea graziosi grafici 2D usando dot / graphviz invece delle viste piuttosto lineari "unidimensionali" prodotte da gitk e dagli amici. Con l'opzione -i mostra i punti di diramazione e le operazioni di unione ma esclude tutto il resto.


abbastanza semplice da usare, se non hai molti commit e vuoi una soluzione semplice, forse potresti provare.
visita il

Dovrebbe ridimensionarsi con il numero di commit giusto (se usi -i), potrebbe diventare illeggibile se hai rami complessi e fusioni (ma poi, quale strumento non lo fa)
Frank Osterfeld

1
Con il nostro progetto di media scala, questo genera un'immagine enorme con tonnellate di linee. Posso limitare la profondità a cui arriva? Cioè commette dagli ultimi N giorni circa.
Ondra Žižka,

25

Un bel strumento basato sul web è ungit . Funziona su qualsiasi piattaforma supportata da node.js e git. C'è un video su come funziona per coloro che trovano quel tipo di cose più facile della lettura ...

inserisci qui la descrizione dell'immagine


21

Dai un'occhiata a BranchMaster .

L'ho scritto per visualizzare la struttura di un ramo complesso, comprimendo tutti i commit tra loro su una sola riga. I numeri indicano il numero di commit.

inserisci qui la descrizione dell'immagine


1
Questo è quello che sto cercando. Ci sono comandi / strumenti alternativi per farlo?
Aalex Gabi,

3
@AalexGabi Metti questo nel tuo gitconfig, fa la stessa cosa, ma nella riga di comando gbranch = log --graph --simplify-by-decoration --pretty = format: '% C (giallo)% h% C (bianco)% d% C (grassetto nero)% ar% C (ripristina)% n '--all
kracejic

Come stai ottenendo i dati per visualizzare i rami?
Snowfish,

15

Nessuno menzionato tig? Non piega rami come "BranchMaster", ma ...

È veloce, funziona nel terminale.

Perché è così veloce (+ controllo da tastiera) che ottieni un ottimo UX, è quasi come il mio " ls" per le directory che contengono repository git.

https://jonas.github.io/tig/

Ha le solite scorciatoie, /da cercare, ecc.

Il grafico di revisione

(ps. è il terminale sullo sfondo di questo screenshot, al giorno d'oggi sembra migliore, ma il mio computer si rifiuta di fare uno screenshot, scusa)

(pps. Uso anche gitkraken e ha visualizzazioni molto chiare, ma è molto più pesante di tig)


Sono un amante dei terminali e Tig (interfaccia in modalità testo per Git) è un ottimo strumento per interagire con i repository Git, è molto utile tra cui la visualizzazione dei grafici e la cronologia di Git. Lo consiglio agli amanti dei terminali come strumento aggiuntivo alla riga di comando Git.
hermeslm,

15

Tortoise Git ha uno strumento chiamato "Revision Graph". Se sei su Windows è facile come fare clic destro sul repository -> Tortoise Git -> Revision Graph.


1
che caratteristica fantastica, usare git tartaruga da molto tempo ma non conosco questa funzione.
Kreamik,

Questo è molto più semplice. Grazie.
Anoop,


12

Uso i seguenti alias.

[alias]
    lol = log --graph --decorate --pretty=oneline --abbrev-commit
    lola = log --graph --decorate --pretty=oneline --abbrev-commit --all

Ha più informazioni nella combinazione di colori degli alias che ho visto sopra. Sembra anche abbastanza comune, quindi potresti avere la possibilità che esista nell'ambiente altrui o che sia in grado di menzionarlo in una conversazione senza doverlo spiegare.

Con schermate e una descrizione completa qui: http://blog.kfish.org/2010/04/git-lola.html


12

Per gli utenti Mac, controlla (senza gioco di parole) lo strumento gratuito e open source GitUp: http://gitup.co/

Mi piace il modo in cui i grafici sono visualizzati, è più chiaro di alcuni degli altri strumenti che ho visto.

Il progetto è qui: https://github.com/git-up/GitUp

Schermata di GitUp


Questo è l'unico grafico in cui vengono visualizzati i rami sull'asse xe il tempo sull'asse y. È molto intuitivo GitUp è assolutamente fantastico! macOS non lo è più, quindi sto passando a Windows e mi mancherà molto Gitup.
wt

11

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 l'alias attivo, git lmostrerà qualcosa del genere:

inserisci qui la descrizione dell'immagine

In Git 2.12 + puoi persino personalizzare i colori delle linee del grafico usandolog.graphColors opzione 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
È la prima volta che vedo la data dell'autore realistica ed è abbastanza bello! grazie, lo aggiungerò al mio gitconfig!
Simon C.

Gli utenti di Windows dovrebbero sostituire le virgolette singole con le virgolette doppie
PierDipi

11

Ho trovato questo post sul blog che mostra un modo conciso:

git log --oneline --abbrev-commit --all --graph --decorate --color

Di solito creo un alias per il comando sopra:

alias gl='git log --oneline --abbrev-commit --all --graph --decorate --color'

e semplice da usare gl.

Puoi anche aggiungere l'alias alla configurazione di git. Apri ~/.gitconfige aggiungi la seguente riga all'alias

[alias]
        lg = log --oneline --abbrev-commit --all --graph --decorate --color

e usalo così: git lg


8

Il mio alias preferito personale, tramite .gitconfig, è:

graph = log --graph --color --all --pretty=format:"%C(yellow)%H%C(green)%d%C(reset)%n%x20%cd%n%x20%cn%x20(%ce)%n%x20%s%n"

6
Una piccola spiegazione di come apparirà il comando sarebbe stata grandiosa.
Max


7

Gitx è anche un fantastico strumento di visualizzazione se ti trovi su OS X.


3
gitk (per tutti) è molto simile. non esattamente lo stesso, ma abbastanza simile.
xero,

Ci sono un paio di forchette di Gitx - questa (rowanj) sembra essere la migliore al momento.
rjmunro,

7

Un altro comando git log. Questo con colonne a larghezza fissa :

git log --graph --pretty=format:"%x09%h | %<(10,trunc)%cd |%<(25,trunc)%d | %s" --date=short



2

Ho provato --simplify-by-decorationma tutte le mie fusioni non sono mostrate. Quindi, invece, elastico solo le linee senza simboli "\" e "/" nelle intestazioni, mantenendo sempre le linee con "(" che indica i rami immediatamente dopo quello. Quando si mostra la cronologia dei rami, in generale non sono interessato ai commenti di commit, quindi Li rimuovo anch'io e finisco con il seguente alias di shell.

gbh () { 
    git log --graph --oneline --decorate "$@" | grep '^[^0-9a-f]*[\\/][^0-9a-f]*\( [0-9a-f]\|$\)\|^[^0-9a-f]*[0-9a-f]*\ (' | sed -e 's/).*/)/'
}

2

possiamo renderlo più complicato?

Che ne dite di semplice git log --all --decorate --oneline --graph (ricordate A Dog = --All --Decorate --Oneline --Graph)


1
È la stessa della risposta accettata. Comunque oggetti di scena per il mnemonico
aljgom il

1

Il sito ufficiale di Git ha arruolato alcuni strumenti della GUI specifici della piattaforma di terze parti. Clicca qui Strumenti GUI per la piattaforma Linux

Ho usato gitge GitKrakenper la piattaforma Linux. Entrambi bravi a capire l'albero di commit

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.