Visualizando a topologia de ramificação no Git

884

Estou brincando com o Git isoladamente em minha própria máquina e acho difícil manter um modelo mental de todas as minhas ramificações e confirmações. Sei que posso fazer um git logpara ver o histórico de consolidação de onde estou, mas existe uma maneira de ver toda a topografia do ramo, algo como esses mapas ASCII que parecem ser usados ​​em todos os lugares para explicar ramos?

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

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

Acho que sou influenciado pelo navegador de stream do AccuRev ...

Benjol
fonte
duplicata de stackoverflow.com/questions/1064361/…
Leif Gruenwoldt
1
@ leif81, meio duplicado, para mim. @Masi excluiu explicitamente o gitk em sua pergunta.
Benjol 28/01

Respostas:

1083

Use git log --graphou gitk. (Ambos também aceitam --all, o que mostrará todas as ramificações em vez da atual).

Para nomes de ramificações e uma visão compacta, tente:

git log --graph --decorate --oneline
jrockway
fonte
47
Isso nem rotula os commits com os branches. Eu não chamaria isso de uma boa visualização como está.
Roman Starkov
7
Obrigado! O gitg também tem a --allopção e também rotula os commits. Eu também nunca vi no menu suspenso que você pode selecionar todos os ramos lá.
Thomas
210
Eu recomendo git log --graph --decorate --oneline- mostra um commit por linha e decora com nomes de ramificações.
sleske
8
tig (um cliente ncurse git) também fornece a --allopção. Bastante útil!
Pierre-Adrien Buisson
5
Veja também a resposta de Andrew sobre a --simplify-by-decorationopção.
Ruvim
483

Eu costumo usar

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

Com cores (se o seu shell for Bash):

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

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

* 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

(Você pode simplesmente usar git log --format=oneline, mas isso vinculará as mensagens de confirmação aos números, o que parece menos bonito no IMHO).

Para criar um atalho para esse comando, convém editar seu ~/.gitconfigarquivo:

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

No entanto, como Sodel the Vociferous observa nos comentários, esse comando de formatação longo é difícil de memorizar. Normalmente, não é um problema, pois você pode colocá-lo no ~/.gitconfigarquivo. No entanto, se você às vezes precisar fazer login em uma máquina remota em que não possa modificar o arquivo de configuração, poderá usar uma versão mais simples, mas mais rápida, para digitar:

git log --graph --oneline
P Shved
fonte
10
Se você gosta de datas: git log --graph --full-history --all --color --date = short --pretty = format: "% x1b [31m% h% x09% x1b [32m% d% x1b [ 0m% x20% ad% s "
sehugg 11/12/10
7
--oneline é um substituto mais memorável para toda essa bonita formatação profunda da magia.
Daniel Ralston
1
@SodeltheVociferous, de fato, não abordei o problema do lado de que você fala; Eu ampliei minha resposta.
usar o seguinte comando
2
Nota: --full-historyé relevante apenas ao usar --simplify-by-decorationou especificar um caminho de arquivo.
Slipp D. Thompson
2
Posso perguntar de onde você tirou a string de formato? Ou como você inventou essa coisa?
Elliotwesoff # 6/16
444

Eu tenho 3 aliases (e 4 aliases-aliases para uso rápido) que normalmente uso no meu ~/.gitconfigarquivo:

[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 lg1fica assim:

git lg1

git lg2 se parece com isso:

git lg2

e git lg3fica assim:

git lg3

Note-se que isso não pretende ser uma solução completa - é um modelo para você alterar, adicionar e corrigir conforme seu gosto. Se você quiser usá-los, minha recomendação é:

  1. Adicione-os ao seu .gitconfig,
  2. Personalize ao seu gosto (diferentes opções de cores, diferentes disposições de linha para as versões de 2 e 3 linhas, etc.),
  3. E salve uma cópia em uma ferramenta Gist ou outra ferramenta de trecho de código para que você possa copiá-la e colá-la em .gitconfigs no futuro (ou, como alternativa, controlar seus arquivos de ponto, é claro) .

Nota: A resposta copiou e melhorou a resposta em stackoverflow.com/questions/1057564/pretty-git-branch-graphs, pois é muito mais apropriado aqui do que ali. Deixou a cópia na outra pergunta por razões históricas - ela está fechada agora e a resposta é mencionada por várias outras respostas.

Slipp D. Thompson
fonte
10
Sugestão: substitua %C(bold yellow)por %C(auto)por ter cores diferentes para HEAD, ramificações locais e remotas ( ref ).
Atcold
2
Observe que você pode evitar adicionar manualmente recuo na string de formato usando %w(); Dessa forma, você também pode agrupar corretamente as mensagens mais longas ou de confirmação de várias linhas sem atrapalhar o gráfico.
charliegreen
1
@ mbadawi23 Eles são redundantes por questões de consistência nas instalações da plataforma e do Git. --abbrev-commitestá lá porque as segundas e terceiras linhas são recuadas à mão com espaços, e eu queria ter certeza absoluta de que usaria o SHA curto - melhor prevenir do que remediar. --decoratetambém está lá porque, embora os padrões do Git façam a mesma coisa, isso pode ser configurado de maneira diferente ou diferente em diferentes versões do Git - para elas, eu quero absolutamente decoração. Por fim, sinalizadores extras / redundantes não são ruins aqui - isso ocorre em um arquivo; não é algo que você digita o tempo todo.
Slipp D. Thompson
1
@TimothyPulliam No final de cada linha que representa a ponta de cada ramificação / tag, você verá os nomes de ramificações / tags associados entre parênteses - por exemplo, nas lg1& lg2screenshots que você pode ver (origin/test_on_10.8)mostrando a ramificação remota e na lg2captura de tela você pode veja (HEAD -> master, origin/master, origin/HEAD)mostrando as posições local e remota da masterfilial e HEAD. Isso corresponde às ferramentas GUI de visualização de ramificações populares do Git do (gitk, SourceTree, TortoiseGit, Tower, Fork, GitX), embora com um pouco mais de detalhamento (algumas ferramentas da GUI usam código de cores) .
Slipp D. Thompson
2
@TimothyPulliam Para entender o que os commits são "parte de cada ramo", você precisa traçar visualmente a linha colorida. Quase todas as ferramentas não ajudam muito nisso, porque as confirmações do Git não pertencem intrinsecamente a nenhum ramo - elas estão implícitas (no momento da visualização do gráfico) a pertencerem a qualquer ramo ou marca que os possua na ancestralidade pai . Se nenhuma ramificação / tag referenciar uma confirmação e ela desaparecer (mas não for coletada pelo lixo por cerca de 2 semanas); adicione uma ramificação / tag referenciando uma confirmação anteriormente não referenciada e ela reaparece. Eu espero que tudo isto faça sentido.
Slipp D. Thompson
236

Em qualquer uma dessas receitas (com base no git log ou no gitk), você pode adicionar --simplify-by-decorationpara recolher as partes lineares desinteressantes da história. Isso torna muito mais visível a topologia de uma só vez. Agora posso entender grandes histórias que seriam incompreensíveis sem essa opção!

Senti a necessidade de postar isso, porque não parece ser tão conhecido quanto deveria ser. Ele não aparece na maioria das perguntas sobre o Stack Overflow sobre a visualização da história e demorei bastante para encontrar - mesmo depois que eu sabia que queria! Eu finalmente o encontrei neste relatório de bug do Debian . A primeira menção no Stack Overflow parece ser esta resposta de Antoine Pelisse.

Andrew
fonte
3
Perfeito - exatamente o que eu estava procurando! Deve receber mais votos; quase todo mundo já conhece o gitk / gitg / git log --graph, mas isso não é muito útil se você deseja visualizar a topologia de ramificação e não se importa com confirmações únicas.
imolit
4
Isso é exatamente o que eu precisava, fantástico. É a única coisa que me ajudou, de todas as respostas. --simplify-by-decorationdeixa tão claro o que está acontecendo.
Ela782
9
Esta deve realmente ser a resposta. git log --graph --all --simplify-by-decorationfunciona também.
Irfy 18/05/19
Se pudéssemos usar --simplify-by-decorationao adicionar n confirmações antes / depois de cada confirmação deocratizada (como -Be -Apor grep).
junvar 16/03
Eu uso essa solução com tanta frequência que tenho como apelido 'git tree'.
user16973 3/06
76

Gitk algum dia doloroso para eu ler.

insira a descrição da imagem aqui

Motive-me a escrever GitVersionTree .

insira a descrição da imagem aqui

soma de verificação
fonte
3
@exhuma Eu tenho um PR com o autor para apoiar Mono (testado no Ubuntu 13.10 contra Mono 2,10)
Max Ehrlich
1
Descobri que o GitVersionTree mantém ramificações no mesmo local com o tempo, o que facilita a visualização de como as coisas mudam.
sfranky
48

99,999% do meu tempo está olhando para o histórico git lge 0,001% é para git log.

Eu só quero compartilhar dois aliases de log que podem ser úteis (configure em .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 verá o histórico atual da ramificação.
  • git hist verá todo o histórico do ramo.
Yeo
fonte
44

Dê uma olhada no Gitkraken - uma GUI de plataforma cruzada que mostra a topologia de uma maneira lúcida.

Topologia

Aqui está um rápido tutorial em vídeo sobre alguns recursos avançados.

pylang
fonte
6
Como esse segmento tem o GitKraken, mas não possui o SourceTree mais antigo e gratuito? (Eu sei, eu sei, Atlassian nem sempre obter tudo certo Mas SourceTree é um muito grande ferramenta para visualização..)
XML
43

Eu gosto de, com git log, fazer:

 git log --graph --oneline --branches

(também com --all, para visualizar ramificações remotas)

Funciona com versões recentes do Git: introduzidas desde 1.6.3 ( quinta-feira, 7 de maio de 2009 )

  • A --pretty=<style>opção " " para a família de comandos do log agora pode ser escrita como " --format=<style>".
    Além disso, --format=%formatstringé uma abreviação de --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 confirmações):

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


O que eu não gosto na solução selecionada atualmente é:

 git log --graph

Ele exibiu muitas informações (quando eu quero apenas ver um resumo rápido):

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

gitk é ótimo, mas me obriga a deixar a sessão do shell para outra janela, enquanto exibir o último n commit rapidamente é suficiente.

VonC
fonte
Também escolhi esse método, mas criei um alias para que digitar "git graph" seja o mesmo que executar "git log --graph --decorate --oneline".
Will Pike
@ConnerPike good idea. Eu tenho o apelido 'lg': veja stackoverflow.com/a/3667139/6309
VonC
35

O Gitg é uma ótima ferramenta para Linux, semelhante ao Gitx para OS X. Basta executar 'gitg' na linha de comando de algum lugar dentro da estrutura em árvore do seu repositório (o mesmo com o gitx).

Jack Senechal
fonte
3
Em tantas palavras: o gitg possui um menu suspenso onde é possível escolher qual ramificação visualizar. Este menu suspenso também tem uma opção "Todos".
Phluks
1
Ou você pode começar com isso gitg --all, se quiser evitar mexer no menu suspenso.
imolit
25

Achei "git-big-picture" bastante útil: https://github.com/esc/git-big-picture

Ele cria belos gráficos 2D usando dot / graphviz em vez das visualizações "unidimensionais" bastante lineares que o gitk e os amigos produzem. Com a opção -i, ele mostra os pontos de ramificação e as confirmações de mesclagem, mas deixa de fora tudo no meio.

Frank Osterfeld
fonte
bastante simples de usar, se você não tem muitos commits e deseja uma solução simples, talvez possa tentar.
wiswit
Deve escalar com o número de commits muito bem (se você usa -i), pode se tornar ilegível se você tem complexantes ramos e fusões (mas então, qual ferramenta não)
Frank Osterfeld
1
Com o nosso projeto de média escala, isso gera uma imagem enorme com toneladas de linhas. Posso limitar a profundidade a que vai? Ou seja, confirma dos últimos N dias.
Ondra Žižka
25

Uma boa ferramenta baseada na Web não é pertinente . É executado em qualquer plataforma compatível com o node.js & git. Há um vídeo de como funciona para aqueles que acham esse tipo de coisa mais fácil do que ler ...

insira a descrição da imagem aqui

Sardathrion - contra o abuso de SE
fonte
21

Dê uma olhada no BranchMaster .

Eu escrevi para visualizar uma estrutura complexa de ramificação, recolhendo todos os commits entre eles em uma única linha. Os números indicam o número de confirmações.

insira a descrição da imagem aqui

stroyer
fonte
1
É isso que estou procurando. Existem comandos / ferramentas alternativas para fazer isso?
Aalex Gabi 07/07
3
@AalexGabi Coloque isso no seu gitconfig, ele faz a mesma coisa, mas na linha de comando gbranch = log --graph --simplify-by-decoration --pretty = format: '% C (amarelo)% h% C (branco)% d% C (preto negrito)% ar% C (redefinição)% n '- todos
kracejic
Como você está obtendo os dados para visualizar as ramificações?
Snowfish
15

Ninguém mencionou tig? Não dobra ramificações como "BranchMaster", mas ...

É rápido, roda no terminal.

Por ser tão rápido (+ controle do teclado) que você obtém um ótimo UX, é quase como o meu " ls" para diretórios que contêm repositórios git.

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

Possui os atalhos usuais, /para pesquisar etc.

O gráfico de revisão

(ps. é o terminal no fundo desta captura de tela, parece melhor hoje em dia, mas meu computador se recusa a tirar uma captura de tela, desculpe)

(pps. Eu uso o gitkraken também e tem visualizações muito claras, mas é muito mais pesado que tig)

fios
fonte
Eu sou um amante de terminais e o Tig (interface de modo de texto para o Git) é uma boa ferramenta para interagir com os repositórios do Git, é muito útil, incluindo visualização de gráficos e histórico do Git. Eu o recomendo aos amantes do terminal como uma ferramenta extra para a linha de comando do Git.
9139 hermeslm
15

O Tortoise Git possui uma ferramenta chamada "Gráfico de Revisão". Se você estiver no Windows, é tão fácil quanto clicar com o botão direito do mouse em seu repositório -> Tortoise Git -> Gráfico de revisão.

cSn
fonte
1
que recurso fantástico, usando o tartaruga git por um longo tempo, mas não o conheço.
kreamik
Isso é bem mais simples. Obrigado.
Anoop
15

O riso desenha gráficos realmente agradáveis.

Renat
fonte
O mesmo acontece com Grittle , se você usar o OmniGraffle
New Alexandria
Tentei e vejo uma linha por confirmação e não uma linha por ramo / tag. É muito detalhado quando você tem dezenas de ramos / tags.
Aalex Gabi
12

Eu uso os seguintes aliases.

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

Ele tem mais informações no esquema de cores do que os apelidos que eu vi acima. Também parece ser bastante comum; portanto, é possível que exista no ambiente de outras pessoas ou seja possível mencioná-lo na conversa sem precisar explicá-lo.

Com capturas de tela e uma descrição completa aqui: http://blog.kfish.org/2010/04/git-lola.html

Lokist
fonte
12

Para usuários de Mac, faça o checkout (sem trocadilhos) da ferramenta gratuita de código aberto GitUp: http://gitup.co/

Eu gosto da maneira como os gráficos são exibidos, é mais claro do que algumas das outras ferramentas que eu já vi.

O projeto está aqui: https://github.com/git-up/GitUp

Captura de tela do GitUp

Edward Tan
fonte
Este é o único gráfico em que você vê as ramificações no eixo x e o tempo no eixo y. É muito intuitivo. O GitUp é absolutamente incrível! O macOS não é mais, então estou mudando para o Windows e sentirei muita falta do Gitup.
w00t
11

Eu tenho esse git logalias ~/.gitconfigpara visualizar o histórico do gráfico:

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

Com o alias no lugar, git lmostrará algo como isto:

insira a descrição da imagem aqui

No Git 2.12 +, você pode personalizar as cores das linhas do gráfico usando a log.graphColorsopção de configuração.

Quanto ao formato dos logs, é semelhante a --oneline, com a adição do nome do autor (respeitando .mailmap) e a data relativa do autor . Observe que a %C(auto)sintaxe, que diz ao Git para usar as cores padrão para o hash de confirmação, etc., é suportada no Git> = 1.8.3 .

Eugene Yarmash
fonte
1
É a primeira vez que vejo a data do autor real e é muito legal! obrigado, vou adicionar isso ao meu gitconfig para!
Simon C.
Os usuários do Windows devem substituir aspas simples entre aspas
PierDipi
11

Encontrei este post do blog que mostra uma maneira concisa:

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

Normalmente, crio um alias para o comando acima:

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

e simples, basta usar gl.

Você também pode adicionar o alias à configuração do git. Abra ~/.gitconfige adicione a seguinte linha ao [alias]

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

e use-o assim: git lg

Sadegh
fonte
8

Meu alias favorito pessoal, via .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"
xero
fonte
6
Uma pequena explicação de como será o comando teria sido ótimo.
Max
8

Para aqueles que usam o editor de texto VSCode , considere a extensão de histórico do Git de D. Jayamanne:

insira a descrição da imagem aqui

pylang
fonte
esta extensão é meio lenta na minha opinião. Ele também não é atualizado automaticamente e parece polido. Mas ele faz um bom trabalho visualizar a árvore de cometer ...
aljazerzen
2
Outra extensão para o Visual Studio Code é o Git Graph da mhutchie. Eu uso isso junto com GitLens.
Josef.B
7

O Gitx também é uma ferramenta de visualização fantástica se você estiver no OS X.

kEND
fonte
3
O gitk (para todos) é muito semelhante. não exatamente o mesmo, mas bem parecido.
Xero 14/03
Existem alguns garfos de Gitx - este (rowanj) parece ser o melhor no momento.
Rjmunro 27/07/2014
7

Outro comando git log. Este com colunas de largura fixa :

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

Confira SmartGit. Isso me lembra muito a visualização do ramo TortoiseHg e é gratuito para uso não comercial.

Frederik Struck-Schøning
fonte
3

No Windows, existe uma ferramenta muito útil que você pode usar: extensões git. É uma ferramenta de interface gráfica e facilita muito as operações do git.

Também é de código aberto.

http://gitextensions.github.io

loneshark99
fonte
2

Eu tentei, --simplify-by-decorationmas todas as minhas mesclagens não são mostradas. Em vez disso, apenas removo as linhas sem os símbolos "\" e "/" nos cabeçalhos, mantendo sempre as linhas com "(" indicando ramos imediatamente depois disso. Ao mostrar o histórico dos ramos, em geral não estou interessado em enviar comentários, portanto Também os removo e termino com o seguinte alias de 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/).*/)/'
}
Isaac To
fonte
2

podemos torná-lo mais complicado?

Como sobre o simples git log --all --decorate --oneline --graph (lembre-se de A Dog = --All --Decorate --Oneline --Graph)

pixel
fonte
1
É o mesmo que a resposta aceita. No entanto, adereços para o mnemônico
aljgom 17/10
1

O site oficial do Git alistou algumas ferramentas GUI específicas da plataforma de terceiros. Clique aqui git GUI Tools for Linux Platform

Eu tenho usado gitge GitKrakenpara plataforma linux. Tanto é bom entender a árvore de confirmação

rookie4evr
fonte