Mostrar git à frente e atrás de informações para todas as filiais, incluindo controles remotos

Em um projeto do github, você pode ir a uma página / branches e ver charts bonitos como este, que mostram, em cada ramificação, a que distância fica e a que distância cada ramificação está em relação ao mestre.

git branch adiante atrás

Existe uma ferramenta de linha de comando que faz algo semelhante? Algo que funciona com controles remotos também? Por exemplo,

git branch -v -v 

está perto do que estou procurando, mas só funciona para agências locais.

Também fiquei curioso sobre isso, então eu apenas peguei um script git branch-status que dá essa informação usando git for-each-ref

 #!/bin/bash # by http://github.com/jehiah # this prints out some branch status (similar to the '... ahead' info you get from git status) # example: # $ git branch-status # dns_check (ahead 1) | (behind 112) origin/master # master (ahead 2) | (behind 0) origin/master git for-each-ref --format="%(refname:short) %(upstream:short)" refs/heads | \ while read local remote do [ -z "$remote" ] && continue git rev-list --left-right ${local}...${remote} -- 2>/dev/null >/tmp/git_upstream_status_delta || continue LEFT_AHEAD=$(grep -c '^<' /tmp/git_upstream_status_delta) RIGHT_AHEAD=$(grep -c '^>' /tmp/git_upstream_status_delta) echo "$local (ahead $LEFT_AHEAD) | (behind $RIGHT_AHEAD) $remote" done 

Uso:

 $ git branch-status dns_check (ahead 1) | (behind 112) origin/master master (ahead 2) | (behind 0) origin/master 

Atualizar 2015

Minha resposta inicial abaixo não é a ideal, pois o branch upstream não é necessariamente o branch que você está pressionando. É apenas o ramo que você está tirando.

Com o Git 2.5+, o comando correto é:

 git for-each-ref --format="%(refname:short) %(upstream:track)" refs/heads 

Veja mais em ” Visualizando Commits do Git Unpushed “.

(como apontado por void.pointer nos comentários , upstream:track é mais preciso que push:track , dependendo da política de push padrão )


O Git 2.13 (Q2 2017) usa uma API de filtro ref mais genérica com um git for-each-ref push mais completo:

Veja cometer 3d9e4ce , cometer 949af06 , cometer 56b4360 , cometer 6eac70f , cometer 1a34728 , cometer 1a0ca5e , cometer 3a42980 , cometer 17938f1 , cometer 3ba308c , cometer a798410 , cometer b180e6f , cometer 01f9582 , cometer 7743fcc , cometer ffd921d , cometer 99c6a71 , cometer d4919bb , cometer 42d0eb0 , commit 4f3e3b3 , commit c58fc85 (10 Jan 2017) por Karthik Nayak ( KarthikNayak ) .
(Mesclado por Junio ​​C Hamano – gitster – em commit 93e8cd8 , 27 de fev de 2017)

 push: 

O nome de uma referência local que representa o local @{push} da referência exibida.
Respeito :short :lstrip :short :lstrip :rstrip :track e :trackshort como o upstream faz.
Produz uma string vazia se nenhum @{push} ref estiver configurado.

Se lstrip= ( rstrip= ) for anexado, retira componentes do caminho separados por barra da parte frontal (traseira) do nome
(por exemplo, %(refname:lstrip=2) transforma refs/tags/foo em foo e %(refname:rstrip=2) transforma refs/tags/foo em refs ).

Se for um número negativo, retire quantos componentes de caminho forem necessários da extremidade especificada para deixar - componentes de caminho
(por exemplo, %(refname:lstrip=-2) transforma refs/tags/foo em tags/foo e %(refname:rstrip=-1) transforma refs/tags/foo em refs )


Resposta original (2014)

Outra maneira estará disponível com o Git 1.9 / 2/0 (Q1 2014).
Veja commit b28061c de Ramkumar Ramachandra (artagnon) :

for-each-ref : introduza %(upstream:track[short])

Introduzir:

  • %(upstream:track) para exibir ” [ahead M, behind N] ” e
  • %(upstream:trackshort) para exibir ” = “, ” > “, ” < " ou " <> " apropriadamente (inspirado por contrib/completion/git-prompt.sh ).

Agora você pode usar o seguinte formato em for-each-ref:

 %(refname:short) %(upstream:trackshort) 

para exibir refs com informações de rastreamento concisas.

Note que :track e :trackshort funcionam apenas com " upstream ", e erros quando usados ​​com qualquer outra coisa.

Para este tipo de problemas, você pode usar “Gitk” `

 sudo apt-get update sudo apt-get install gitk 

Isso pode ajudá-lo muito. Você pode até ver git à frente para todos os ramos