Saída do ramo git na árvore como moda

161

Agora, quando digito "git branch"

lista minhas filiais em uma ordem arbitrária.

O que eu preferiria seria se "git branch" listasse minha saída em uma árvore como fasion, algo como:

master
|-- foo
  |-- foo1
  |-- foo2
|-- bar
  |-- bar4

Onde aqui, foo & bar eram ramificados do mestre; foo1 e foo2 foram ramificados a partir de foo; bar4 foi ramificado do bar.

Isso é fácil de realizar?

[Apenas utilitários de linha de comando. Isso precisa se encaixar no meu fluxo de trabalho zsh / vim.]

anon
fonte
Nenhuma das respostas aqui (incluindo a minha) parece fornecer uma solução adequada para o que eu acho que você realmente deseja e para o que eu sei que quero. Vou escrever um novo utilitário para resolver isso quando tiver a chance. Provavelmente chamará isso git_tree. Ele produzirá algo como arc flowfaz aqui: stackoverflow.com/questions/54227968/… . Talvez um dia eu possa mesclá-lo ao próprio git.
Gabriel Staples
Essa pessoa também parece querer a mesma coisa: reddit.com/r/git/comments/282c1f/…
Gabriel Staples
git log --graphé o suficiente, eu acho.
DawnSong 17/07

Respostas:

204

A resposta abaixo usagit log :

Mencionei uma abordagem semelhante em 2009 com " Incapaz de mostrar uma árvore Git no terminal ":

git log --graph --pretty=oneline --abbrev-commit

Mas o completo que tenho usado está em " Como exibir o nome da marca e o nome da filial usando o git log --graph " (2011):

git config --global alias.lgb "log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset%n' --abbrev-commit --date=relative --branches"

git lgb

Resposta original (2010)

git show-branch --list chega perto do que você está procurando (com o pedido topo)

--topo-order

Por padrão, os desvios e seus commits são mostrados em ordem cronológica inversa.
Essa opção faz com que eles apareçam em ordem topológica (ou seja, confirmações descendentes são mostradas antes dos pais).

Mas a ferramenta git wtf também pode ajudar . Exemplo:

$ git wtf
Local branch: master
[ ] NOT in sync with remote (needs push)
    - Add before-search hook, for shortcuts for custom search queries. [4430d1b] (edwardzyang@...; 7 days ago)
Remote branch: origin/master ([email protected]:sup/mainline.git)
[x] in sync with local

Feature branches:
{ } origin/release-0.8.1 is NOT merged in (1 commit ahead)
    - bump to 0.8.1 [dab43fb] (wmorgan-sup@...; 2 days ago)
[ ] labels-before-subj is NOT merged in (1 commit ahead)
    - put labels before subject in thread index view [790b64d] (marka@...; 4 weeks ago)
{x} origin/enclosed-message-display-tweaks merged in
(x) experiment merged in (only locally)

NOTE: working directory contains modified files

git-wtf mostra a você:

  • Como sua filial se relaciona com o repositório remoto, se for uma filial de rastreamento.
  • Como sua ramificação se relaciona com ramificações sem recurso ("versão"), se for uma ramificação de recurso.
  • Como o seu ramo se relaciona com os ramos do recurso, se for um ramo da versão
VonC
fonte
Utilizou uma variação do seu formato bonito que também mostra o e-mail do autor, usando% ae. Também prefiro chamar o alias por "sl" para se parecer com o smartlog da hg.
Fiorix
Muito obrigado pelo link para a git-wtfferramenta, é incrivelmente útil. Parece essencialmente quebrar as conclusões que eu tiraria olhando para uma git logárvore chique , mas em um bom resumo.
Luke Davis
Eu estava esperando para descobrir uma maneira para que ramo de check-out deve mostrar a partir do qual ramo foi check-out do
Chang Zhao
@ChangZhao Isso é semelhante a "encontrar a ramificação pai", e isso não é fácil de fazer: stackoverflow.com/a/3162929/6309 , stackoverflow.com/a/56452713/6309
VonC
147

Não é exatamente o que você pediu, mas

git log --graph --simplify-by-decoration --pretty=format:'%d' --all

faz um bom trabalho. Também mostra tags e ramificações remotas. Isso pode não ser desejável para todos, mas acho útil. --simplifiy-by-decorationé o grande truque aqui para limitar as referências mostradas.

Eu uso um comando semelhante para visualizar meu log. Consegui substituir completamente meu gitkuso por ele:

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

Eu o uso incluindo esses aliases no meu arquivo ~ / .gitconfig:

[alias]
    l = log --graph --oneline --decorate
    ll = log --graph --oneline --decorate --branches --tags
    lll = log --graph --oneline --decorate --all

Editar: comando / aliases de log sugeridos atualizados para usar sinalizadores de opção mais simples.

nocash
fonte
1
Na IMO, essa é a melhor resposta aqui, mas acho que o SourceTree, o Gitk ou algo semelhante é o caminho a seguir para esse tipo de coisa.
JaKXz
Isso exibe as ramificações na origem. Existe alguma maneira de exibir isso para as filiais locais?
Jeff
@ Jeff substituir --allcom --branches --tagsprovavelmente faria isso.
nocash
resposta perfeita. O que eu estava procurando, encontrei aqui. Ótimo.
AMIC MING
12

O exemplo a seguir mostra os pais comprometidos também:

git log --graph --all \
--format='%C(cyan dim) %p %Cred %h %C(white dim) %s %Cgreen(%cr)%C(cyan dim) <%an>%C(bold yellow)%d%Creset'
Ben
fonte
10

Você pode usar uma ferramenta chamada gitk.

Vladimir Prudnikov
fonte
Eu amo o gitk, mas não descobri gitkno Mac. Se você tiver alguma sugestão, entre em contato. Comecei a usar, Github Desktopmas adoro trabalhar na linha de comando.
AMIC MING
6

Testado no Ubuntu:

sudo apt install git-extras
git-show-tree

Isso produz um efeito semelhante às 2 respostas mais votadas aqui.

Fonte: http://manpages.ubuntu.com/manpages/bionic/man1/git-show-tree.1.html


Além disso, se você tiver o arcanist instalado (correção: o fork do arcanista do Uber instalado - veja a parte inferior desta resposta aqui para obter instruções de instalação), arc flowmostra uma bela árvore de dependências de dependências upstream (ou seja: que foram definidas anteriormente via arc flow new_branchou manualmente via git branch --set-upstream-to=upstream_branch).

Truques de bônus do git:

Palavras-chave:

  1. Qual é a diferença entre `arc graft` e` arc patch`?
Gabriel Staples
fonte
-1

Para quem usa o Github, eles têm um visualizador de rede de filial que parece mais fácil de ler

kip2
fonte