Salida de git branch en árbol como moda

161

En este momento, cuando escribo "git branch"

enumera mis ramas en un orden arbitrario.

Lo que preferiría sería que "git branch" enumerara mi salida en un árbol como fasion, algo así como:

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

Donde aquí, foo & bar fueron ramificados del maestro; foo1 y foo2 se ramificaron de foo; bar4 fue ramificado de bar.

¿Es esto fácil de lograr?

[Solo utilidades de línea de comando. Esto debe encajar en mi flujo de trabajo zsh / vim.]

luego
fuente
Ninguna de las respuestas aquí (incluida la mía) parece proporcionar una solución adecuada para lo que creo que realmente quieres y para lo que sé que quiero. Voy a escribir una nueva utilidad para resolver esto cuando tenga la oportunidad. Probablemente lo llame git_tree. Producirá algo como lo arc flowhace aquí: stackoverflow.com/questions/54227968/… . Tal vez algún día incluso pueda fusionarlo con git.
Gabriel Staples
Esta persona también parece querer lo mismo: reddit.com/r/git/comments/282c1f/…
Gabriel Staples
git log --graphes suficiente, creo.
DawnSong

Respuestas:

204

La siguiente respuesta utiliza git log:

Mencioné un enfoque similar en 2009 con " No se puede mostrar un árbol Git en la terminal ":

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

Pero el completo que he estado usando está en " Cómo mostrar el nombre de la etiqueta y el nombre de la rama usando 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

Respuesta original (2010)

git show-branch --list se acerca a lo que está buscando (con el orden topográfico)

--topo-order

Por defecto, las ramas y sus confirmaciones se muestran en orden cronológico inverso.
Esta opción los hace aparecer en orden topológico (es decir, los commits descendientes se muestran antes que sus padres).

Pero la herramienta git wtf también puede ayudar . Ejemplo:

$ 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 te muestra:

  • Cómo se relaciona su rama con el repositorio remoto, si es una rama de seguimiento.
  • Cómo se relaciona su rama con ramas sin características ("versión"), si es una rama con características.
  • Cómo se relaciona su rama con las ramas de características, si es una rama de versión
VonC
fuente
He estado usando una variación de su bonito formato que también muestra el correo electrónico del autor, usando% ae. También prefiero llamar al alias por "sl" para parecerse al registro inteligente de hg.
fiorix
Muchas gracias por el enlace a la git-wtfherramienta, es increíblemente útil. Parece esencialmente romper las conclusiones que sacaría de mirar un git logárbol elegante , pero en un lindo resumen.
Luke Davis
Tenía la esperanza de encontrar una manera para que la sucursal de pago debería mostrar de qué sucursal se extrajo
Chang Zhao
@ChangZhao Eso es similar a "encontrar la sucursal principal", y eso no es fácil de hacer: stackoverflow.com/a/3162929/6309 , stackoverflow.com/a/56452713/6309
VonC
147

No es exactamente lo que pediste, pero

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

hace un muy buen trabajo Muestra etiquetas y ramas remotas también. Esto puede no ser deseable para todos, pero lo encuentro útil. --simplifiy-by-decorationes el gran truco aquí para limitar las referencias que se muestran.

Yo uso un comando similar para ver mi registro. He podido reemplazar completamente mi gitkuso con él:

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

Lo uso al incluir estos alias en mi archivo ~ / .gitconfig:

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

Editar: Se actualizaron los comandos / alias de registro sugeridos para usar indicadores de opción más simples.

sin efectivo
fuente
1
OMI, esta es la mejor respuesta aquí, pero creo que SourceTree o gitk o similares es el camino a seguir para este tipo de cosas.
JaKXz
Esto muestra las ramas en el origen. ¿Hay alguna forma de hacer que esto se muestre para las sucursales locales?
Jeff
@Jeff reemplazando --allcon --branches --tagsprobablemente lo haría.
nocash
Respuesta perfecta. Lo que estaba buscando, lo encontré aquí. Excelente.
AMIC MING
12

El siguiente ejemplo muestra a los padres comprometidos también:

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
fuente
10

Puedes usar una herramienta llamada gitk.

Vladimir Prudnikov
fuente
Me encanta Gitk, pero no me di cuenta gitken Mac. Si tiene alguna sugerencia, hágamelo saber. Empecé a usar Github Desktoppero me encanta trabajar en la línea de comandos.
AMIC MING
6

Probado en Ubuntu:

sudo apt install git-extras
git-show-tree

Esto produce un efecto similar a las 2 respuestas más votadas aquí.

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


Además, si tiene un arcanista instalado (corrección: la bifurcación del arcanista de Uber instalada; consulte la parte inferior de esta respuesta aquí para obtener instrucciones de instalación), arc flowmuestra un hermoso árbol de dependencias de dependencias ascendentes (es decir, que se configuraron previamente a través arc flow new_brancho manualmente git branch --set-upstream-to=upstream_branch).

Trucos extra de git:

Relacionado:

  1. ¿Cuál es la diferencia entre 'arc graft' y 'arc patch'?
Gabriel Staples
fuente
-1

Para aquellos que usan Github, tienen un visor de red de sucursales que parece más fácil de leer.

kip2
fuente