Visualizando a topologia do ramo em git

I'estou brincando com o git em isolamento na minha própria máquina, e eu acho difícil manter um modelo mental de todos os meus ramos e compromissos. Eu sei que posso fazer um git log para ver o histórico de commits de onde estou, mas existe uma maneira de ver toda a topografia dos ramos, algo como esses mapas ascii que parecem ser usados em todos os lugares para explicar os ramos?

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

Parece que alguém vindo junto e tentando pegar meu repositório teria dificuldade em entender exatamente o que estava acontecendo.

Acho que I'm influenciado pelo AccuRev's navegador de streaming...

Solução

git log --graph ou gitk. (Ambos também aceitam `--tudo', que mostrará todos os ramos em vez de apenas o atual).

Editar: Para nomes de ramos e uma vista compacta, tente: git log --graph --decorate --oneline

Comentários (7)

Eu costumo usar

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

Com cores (se a sua concha for Bash):

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

Isto irá imprimir uma representação baseada em texto como esta:

* 040cc7c       (HEAD, master) Mannual 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 succesfully
| *   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

(Você poderia apenas usar git log --format=oneline, mas isso ligará mensagens de commit a números, o que parece menos bonito IMHO).

Para fazer um atalho para este comando, você pode querer editar seu arquivo ~/.gitconfig:

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

Entretanto, como Sodel the Vociferous observa nos comentários, é difícil memorizar um comando de formatação tão longo. Normalmente, it'não é um problema, pois você pode colocá-lo no arquivo ~/.gitconfig. Entretanto, se você às vezes tem que entrar em uma máquina remota onde você pode't modificar o arquivo de configuração, você poderia usar uma versão mais simples, mas mais rápida para digitar:

git log --graph --oneline
Comentários (5)

Eu gosto, com git log, de fazer:

 git log --graph --oneline --branches

(também com -- tudo, para ver as filiais remotas também)

Funciona com lançamentos recentes da Git: introduzido desde **1.6.3*** (Qui, 7 de Maio de 2009)

  • "--pretty=" opção para a família de comandos de log agora pode ser escrita como "--format=".
    Além disso, --formato=%formatstring é um curto-tempo para --pretty=tformat:%formatstring.
  • "--oneline" é sinônimo de "--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

Você também pode limitar o alcance da exibição do log (número de commits):

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

(mostrar apenas os últimos 5 commits)


O que eu não gosto na actual solução seleccionada é:

 git log --graph

Ele exibia muita informação (quando eu quero apenas olhar para um resumo rápido):

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

O gitk é ótimo, mas me obriga a deixar a sessão de shell para outra janela, enquanto que exibir os últimos n commits rapidamente é o suficiente.

Comentários (2)