Visualización de topología de rama en Git

884

Estoy jugando con Git de forma aislada en mi propia máquina, y me resulta difícil mantener un modelo mental de todas mis ramas y compromisos. Sé que puedo hacer git logpara ver el historial de confirmación desde donde estoy, pero ¿hay alguna manera de ver toda la topografía de la rama, algo como estos mapas ASCII que parecen usarse en todas partes para explicar las ramas?

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

Se siente como si alguien viniera y tratara de recoger mi repositorio tendría dificultades para resolver exactamente lo que estaba sucediendo.

Supongo que estoy influenciado por el navegador de flujo de AccuRev ...

Benjol
fuente
duplicado de stackoverflow.com/questions/1064361/…
Leif Gruenwoldt
1
@ leif81, un medio duplicado, para mí. @Masi excluyó explícitamente a gitk en su pregunta.
Benjol

Respuestas:

1083

Use git log --grapho gitk. (Ambos también aceptan --all, lo que mostrará todas las ramas en lugar de solo la actual).

Para nombres de sucursales y una vista compacta, intente:

git log --graph --decorate --oneline
jrockway
fuente
47
Esto ni siquiera etiqueta los commits con las ramas. No llamaría a esto una buena visualización tal como está.
Roman Starkov
77
¡Gracias! gitg también tiene la --allopción y también etiqueta las confirmaciones. Tampoco vi en el menú desplegable que puede seleccionar todas las ramas allí.
Thomas
210
Recomiendo git log --graph --decorate --oneline: muestra una confirmación por línea y decora con nombres de rama.
sleske
8
tig (un cliente ncurse git) también proporciona la --allopción. ¡Muy útil!
Pierre-Adrien Buisson
55
Ver también la respuesta de Andrew con respecto a la --simplify-by-decorationopción.
ruvim
483

Yo suelo usar

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

Con colores (si su caparazón es Bash):

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

Esto imprimirá una representación basada en 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

(Podría usar git log --format=oneline, pero vinculará los mensajes de confirmación con los números, lo que se ve menos bonito en mi humilde opinión).

Para crear un acceso directo para este comando, es posible que desee editar su ~/.gitconfigarchivo:

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

Sin embargo, como Sodel the Vociferous señala en los comentarios, ese comando de formateo largo es difícil de memorizar. Por lo general, no es un problema, ya que puede incluirlo en el ~/.gitconfigarchivo. Sin embargo, si a veces tiene que iniciar sesión en una máquina remota donde no puede modificar el archivo de configuración, puede usar una versión más simple pero más rápida para escribir:

git log --graph --oneline
P Shved
fuente
10
Si le gustan las fechas: git log --graph --full-history --all --color --date = short --pretty = format: "% x1b [31m% h% x09% x1b [32m% d% x1b [ 0m% x20% ad% s "
sehugg
77
--oneline es un sustituto más memorable para toda esa magia profunda de formato bonito.
Daniel Ralston
1
@SodeltheVociferous, de hecho, no abordé el problema desde el lado del que hablas; Extendí mi respuesta.
P Shved
2
Nota: --full-historysolo es relevante cuando se utiliza --simplify-by-decorationo especifica una ruta de archivo.
Slipp D. Thompson
2
¿Puedo preguntar de dónde sacaste la cadena de formato? ¿O cómo diablos inventaste esa cosa?
elliotwesoff
444

Tengo 3 alias (y 4 alias-alias para uso rápido) que normalmente incluyo en mi ~/.gitconfigarchivo:

[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/ se git lg1ve así:

git lg1

git lg2 Se ve como esto:

git lg2

y se git lg3ve así:

git lg3

Debe tenerse en cuenta que esto no pretende ser una solución final: es una plantilla que puede cambiar, agregar y arreglar a su gusto. Si desea utilizar estos, mi recomendación es:

  1. Añádelos a tu .gitconfig,
  2. Personalice a su gusto (diferentes opciones de color, diferentes arreglos de línea para las versiones de 2 y 3 líneas, etc.),
  3. Y luego guarde una copia en un Gist u otra herramienta de fragmento de código para que pueda copiarla y pegarla en .gitconfigs en el futuro (o, alternativamente, controlar la versión de sus archivos de puntos, por supuesto) .

Nota: La respuesta copiada y mejorada de la respuesta en stackoverflow.com/questions/1057564/pretty-git-branch-graphs ya que es mucho más apropiada aquí que allí. Dejó la copia en la otra pregunta por razones históricas: ahora está cerrada, y la respuesta está referenciada por un montón de otras respuestas.

Slipp D. Thompson
fuente
10
Sugerencia: sustituir %C(bold yellow)con %C(auto)por tener diferentes colores para HEAD, locales y sucursales remotas ( ref ).
Atcold
2
Tenga en cuenta que puede evitar agregar manualmente la sangría en su cadena de formato utilizando %w(); de esta manera también puede ajustar correctamente los mensajes de confirmación más largos o de varias líneas sin desordenar el gráfico.
charliegreen
1
@ mbadawi23 Son redundantes en aras de la coherencia entre la plataforma y las instalaciones de Git. --abbrev-commitestá ahí porque las líneas 2da-3ra están marcadas a mano con espacios, y quería asegurarme absolutamente de que usaría el SHA corto, así que es mejor prevenir que curar. --decoratetambién está ahí porque, aunque los valores predeterminados de Git hacen lo mismo, eso podría configurarse de manera diferente o diferente en diferentes versiones de Git: para estos, absolutamente quiero decoración. En última instancia, los indicadores adicionales / redundantes no son malos aquí; esto va en un archivo; no es algo que escribes todo el tiempo.
Slipp D. Thompson
1
@TimothyPulliam Al final de cada línea que representa la punta de cada rama / etiqueta, verá los nombres de las ramas / etiquetas asociadas entre paréntesis, por ejemplo, en las capturas de pantalla lg1& lg2que puede ver (origin/test_on_10.8)mostrando la rama remota, y en la lg2captura de pantalla puede Consulte (HEAD -> master, origin/master, origin/HEAD)las posiciones locales y remotas de la mastersucursal y HEAD. Esto coincide con las populares herramientas de GUI de visualización de ramas para Git do (gitk, SourceTree, TortoiseGit, Tower, Fork, GitX), aunque con un poco más de verbosidad (algunas herramientas de GUI usan códigos de colores) .
Slipp D. Thompson
2
@TimothyPulliam Para comprender qué confirmaciones son "parte de cada rama", debe trazar visualmente la línea de color. Casi todas las herramientas no le ayudan mucho con esto porque las confirmaciones de Git no pertenecen intrínsecamente a ninguna rama, están implicadas (en el momento de visualización de gráficos) para pertenecer a cualquier rama o etiqueta que las tenga en su ascendencia principal . Si no hay una rama / etiqueta que haga referencia a una confirmación y desaparece (pero no se recolecta basura durante aproximadamente 2 semanas) agregue una rama / etiqueta que haga referencia a un compromiso previamente no referenciado y vuelva a aparecer. Espero que todo esto tenga sentido.
Slipp D. Thompson
236

Para cualquiera de estas recetas (basadas en git log o gitk), puede agregar --simplify-by-decorationpara contraer las partes lineales poco interesantes de la historia. Esto hace que se vea mucho más de la topología a la vez. ¡Ahora puedo entender grandes historias que serían incomprensibles sin esta opción!

Sentí la necesidad de publicar esto porque no parece ser tan conocido como debería ser. No aparece en la mayoría de las preguntas de Stack Overflow sobre la visualización del historial, y me llevó bastante buscarlo, ¡incluso después de saber que lo quería! Finalmente lo encontré en este informe de error de Debian . La primera mención en Stack Overflow parece ser esta respuesta de Antoine Pelisse.

Andrés
fuente
3
Perfecto, ¡exactamente lo que estaba buscando! Debería recibir más votos a favor; casi todo el mundo ya sabe acerca de gitk / gitg / git log --graph, pero eso no es muy útil si desea visualizar la topología de la rama y no le importan las confirmaciones individuales.
imolit
44
Esto es exactamente lo que necesitaba, fantástico. Es lo único que me ayudó, de todas las respuestas. --simplify-by-decorationdeja muy claro lo que está pasando.
Ela782
99
Esta realmente debería ser la respuesta. git log --graph --all --simplify-by-decorationfunciona igual de bien
Irfy
Si solo pudiéramos usar --simplify-by-decorationmientras agregamos n commits antes / después de cada commit desocupado (like -By -Afor grep).
junvar
Utilizo esta solución con tanta frecuencia que la llamo 'git tree'.
user16973
76

Gitk a veces me duele leer

ingrese la descripción de la imagen aquí

Motívame a escribir GitVersionTree .

ingrese la descripción de la imagen aquí

suma de comprobación
fuente
3
@exhuma Tengo un RP con el autor para admitir Mono (probado en Ubuntu 13.10 contra Mono 2.10)
Max Ehrlich
1
Descubrí que GitVersionTree mantiene las ramas en el mismo lugar con el tiempo, lo que facilita ver cómo cambian las cosas.
sfranky
48

El 99.999% de mi tiempo está mirando la historia por git lgy el 0.001% está por git log.

Solo quiero compartir dos alias de registro que podrían ser útiles (configurar desde .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á el historial actual de la sucursal.
  • git hist Verá toda la historia de la sucursal.
Yeo
fuente
44

Eche un vistazo a Gitkraken , una GUI multiplataforma que muestra la topología de manera lúcida.

Topología

Aquí hay un video tutorial rápido sobre algunas funciones avanzadas.

pylang
fuente
66
¿Cómo tiene este hilo GitKraken, pero no tiene el SourceTree más antiguo y gratuito? (Lo sé, lo sé, Atlassian no siempre hace las cosas bien. Pero SourceTree es una herramienta bastante buena para visualizar.)
XML
43

Me gusta, con git log, hacer:

 git log --graph --oneline --branches

(también con --todos, para ver ramas remotas también)

Funciona con versiones recientes de Git: introducidas desde 1.6.3 ( jue, 7 de mayo de 2009 )

  • La --pretty=<style>opción " " para la familia de comandos de registro ahora se puede deletrear como " --format=<style>".
    Además, --format=%formatstringes una abreviatura de --pretty=tformat:%formatstring.

  • " --oneline" es 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

También puede limitar la duración de la visualización del registro (número de confirmaciones):

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 solo los últimos 5 commits)


Lo que no me gusta de la solución seleccionada actual es:

 git log --graph

Mostraba demasiada información (cuando solo quiero ver un resumen 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 es genial, pero me obliga a abandonar la sesión de shell para otra ventana, mientras que mostrar los últimos n commits rápidamente suele ser suficiente.

VonC
fuente
Elijo este método también, pero hice un alias para que escribir "git graph" sea lo mismo que ejecutar "git log --graph --decorate --oneline".
Will Pike
@ConnerPike buena idea. Tengo el alias 'lg': consulte stackoverflow.com/a/3667139/6309
VonC
35

Gitg es una gran herramienta para Linux, similar a Gitx para OS X. Simplemente ejecute 'gitg' en la línea de comando desde algún lugar dentro de la estructura de árbol de su repositorio (lo mismo con gitx).

Jack Senechal
fuente
3
En muchas palabras: gitg tiene un menú desplegable donde se puede elegir qué rama visualizar. Este menú desplegable también tiene una opción "Todos".
Phluks
1
O puede comenzar con gitg --all, si desea evitar perder el tiempo en el menú desplegable.
imolit
25

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

Crea bonitos gráficos 2D usando dot / graphviz en lugar de las vistas bastante lineales y "unidimensionales" que producen gitk y sus amigos. Con la opción -i, muestra los puntos de bifurcación y las confirmaciones de fusión, pero omite todo lo que está en el medio.

Frank Osterfeld
fuente
bastante simple de usar, si no tiene muchas confirmaciones y desea una solución simple, tal vez podría intentarlo.
wiswit
Debería escalar con el número de confirmaciones bien (si usa -i), podría volverse ilegible si tiene ramas complejas y fusiones (pero entonces, qué herramienta no)
Frank Osterfeld
1
Con nuestro proyecto de escala media, esto genera una imagen enorme con toneladas de líneas. ¿Puedo limitar la profundidad a la que va? Es decir, se compromete desde los últimos N días más o menos.
Ondra Žižka
25

Una buena herramienta basada en la web es ungit . Se ejecuta en cualquier plataforma compatible con node.js & git. Hay un video de cómo funciona para aquellos que encuentran ese tipo de cosas más fácil que leer ...

ingrese la descripción de la imagen aquí

Sardathrion - contra el abuso SE
fuente
21

Echa un vistazo a BranchMaster .

Lo escribí para visualizar una estructura de rama compleja, al contraer todas las confirmaciones entre ellas en una sola línea. Los números indican el número de confirmaciones.

ingrese la descripción de la imagen aquí

stroyer
fuente
1
Esto es lo que estoy buscando. ¿Hay comandos / herramientas alternativas para hacer esto?
Aalex Gabi
3
@AalexGabi Ponga esto en su gitconfig, hace lo mismo, pero en la línea de comando gbranch = log --graph --simplify-by-decoration --pretty = format: '% C (amarillo)% h% C (blanco)% d% C (negrita)% ar% C (restablecer)% n '
--todos
¿Cómo está obteniendo los datos para visualizar las ramas?
Snowfish
15

Nadie mencionó tig? No dobla ramas como "BranchMaster", pero ...

Es rápido, se ejecuta en la terminal.

Debido a que es tan rápido (+ control de teclado) obtienes una gran experiencia de usuario, es casi como mi " ls" para directorios que contienen repositorios git.

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

Tiene los atajos habituales, /para buscar, etc.

El gráfico de revisión

(ps. es el terminal en el fondo de esta captura de pantalla, se ve mejor hoy en día, pero mi computadora se niega a tomar una captura de pantalla, lo siento)

(pps. Yo también uso gitkraken y tiene visualizaciones muy claras, pero es mucho más pesado que tig)

alambres
fuente
Soy un amante de los terminales y Tig (interfaz de modo de texto para Git) es una buena herramienta para interactuar con los repositorios de Git, es muy útil, incluida la vista gráfica y el historial de Git. Se lo recomiendo a los amantes de los terminales como una herramienta adicional para la línea de comandos de Git.
hermeslm
15

Tortoise Git tiene una herramienta llamada "Gráfico de revisión". Si estás en Windows es tan fácil como hacer clic derecho en tu repositorio -> Tortoise Git -> Revision Graph.

cSn
fuente
1
qué característica fantástica, usar tortuga git durante mucho tiempo, pero no conozco esta característica.
kreamik
Esto es mucho más simple. Gracias.
Anoop
15

Risita dibuja gráficos muy bonitos.

Renat
fuente
Grittle también lo hace , si usa OmniGraffle
Nueva Alejandría
Lo probé y veo una línea por confirmación y no una línea por rama / etiqueta. Es demasiado detallado cuando tienes docenas de ramas / etiquetas.
Aalex Gabi
12

Yo uso los siguientes alias.

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

Tiene más información en el esquema de color que los alias que vi arriba. También parece ser bastante común, por lo que puede tener la posibilidad de que exista en el entorno de otros o de que pueda mencionarlo en una conversación sin tener que explicarlo.

Con capturas de pantalla y una descripción completa aquí: http://blog.kfish.org/2010/04/git-lola.html

Lokist
fuente
12

Para usuarios de Mac, realice el pago (sin juego de palabras) de la herramienta gratuita de código abierto GitUp: http://gitup.co/

Me gusta la forma en que se muestran los gráficos, es más claro que algunas de las otras herramientas que he visto.

El proyecto está aquí: https://github.com/git-up/GitUp

Captura de pantalla de GitUp

Edward Tan
fuente
Este es el único gráfico donde puede ver las ramas en el eje xy el tiempo en el eje y. Es muy intuitivo ¡GitUp es absolutamente increíble! macOS ya no lo es, así que me estoy cambiando a Windows y extrañaré mucho a Gitup.
w00t
11

Tengo este git logalias ~/.gitconfigpara ver el historial del gráfico:

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

Con el alias en su lugar, git lmostrará algo como esto:

ingrese la descripción de la imagen aquí

En Git 2.12 + incluso puedes personalizar los colores de línea del gráfico usando la log.graphColorsopción de configuración.

En cuanto al formato de los registros, es similar --oneline, con la adición del nombre del autor (respetando .mailmap) y la fecha relativa del autor . Tenga en cuenta que la %C(auto)sintaxis, que le dice a Git que use los colores predeterminados para commit hash, etc., es compatible con Git> = 1.8.3 .

Eugene Yarmash
fuente
1
¡Es la primera vez que veo la fecha real del autor y es bastante agradable! gracias, lo agregaré a mi gitconfig!
Simon C.
Los usuarios de Windows deben reemplazar con comillas simples comillas dobles
PierDipi
11

Encontré esta publicación de blog que muestra una manera concisa:

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

Por lo general, creo un alias para el comando anterior:

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

y simple solo uso gl.

También puede agregar el alias a la configuración de git. Abra ~/.gitconfigy agregue la siguiente línea al [alias]

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

y úsalo así: git lg

Sadegh
fuente
8

Mi alias favorito personal, a través de .gitconfig, es:

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
fuente
66
Una pequeña explicación de cómo se verá el comando hubiera sido genial.
Max
8

Para aquellos que usan el editor de texto VSCode , considere la extensión Git History Extension de D. Jayamanne:

ingrese la descripción de la imagen aquí

pylang
fuente
Esta extensión es un poco lenta en mi opinión. Tampoco se actualiza automáticamente y se ve sin pulir. Pero hace un buen trabajo visualizando el árbol de confirmación ...
aljazerzen
2
Otra extensión para Visual Studio Code es Git Graph de mhutchie. Lo uso junto con GitLens.
Josef.B
7

Gitx también es una herramienta de visualización fantástica si estás en OS X.

kEND
fuente
3
gitk (para todos) es muy similar. no exactamente lo mismo, pero bastante similar.
xero
Hay un par de tenedores de Gitx: este (rowanj) parece ser el mejor en este momento.
rjmunro
7

Otro comando de registro de git. Este con columnas de ancho fijo :

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

Echa un vistazo SmartGit. Me recuerda mucho a la visualización de la rama TortoiseHg y es gratis para uso no comercial.

Frederik Struck-Schøning
fuente
3

En Windows hay una herramienta muy útil que puedes usar: extensiones git. Es una herramienta gui y hace que las operaciones de git sean muy fáciles.

También es de código abierto.

http://gitextensions.github.io

loneshark99
fuente
2

Lo intenté --simplify-by-decorationpero no se muestran todas mis fusiones. Por lo tanto, simplemente elimino las líneas sin símbolos "\" y "/" en los encabezados, mientras que siempre mantengo líneas con "(" que indican ramas inmediatamente después de eso. Cuando se muestra el historial de ramas, en general no me interesan los comentarios de confirmación, así que También los elimino y termino con el siguiente 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 a
fuente
2

¿podemos hacerlo más complicado?

¿Qué tal un simple registro de git?

píxel
fuente
1
Esto es lo mismo que la respuesta aceptada. Sin embargo, accesorios para la mnemotecnia
aljgom
1

El sitio oficial de Git alistó algunas herramientas GUI específicas de la plataforma de terceros. Pulse aquí Herramientas GUI de git para la plataforma Linux

He usado gitgy GitKrakenpara la plataforma Linux. Ambos son buenos para entender el árbol de confirmación

rookie4evr
fuente