¿Cómo puedo obtener una lista de las ramas de Git, ordenadas por la confirmación más reciente?


1324

Quiero obtener una lista de todas las ramas en un repositorio de Git con las ramas "más frescas" en la parte superior, donde la rama "más fresca" es la que se ha comprometido más recientemente (y, por lo tanto, es más probable que sea una Quiero prestar atención a).

¿Hay alguna manera de usar Git para (a) ordenar la lista de ramas por último compromiso, u (b) obtener una lista de ramas junto con la última fecha de compromiso de cada uno, en algún tipo de formato legible por máquina?

En el peor de los casos, siempre podría ejecutar git branchpara obtener una lista de todas las ramas, analizar su salida y luego, git log -n 1 branchname --format=format:%cipara cada una, obtener la fecha de confirmación de cada rama. Pero esto se ejecutará en un cuadro de Windows, donde acelerar un nuevo proceso es relativamente costoso, por lo que iniciar el ejecutable de Git una vez por rama podría ralentizarse si hay muchas ramas. ¿Hay alguna manera de hacer todo esto con un solo comando?


2
stackoverflow.com/a/2514279/1804124 Tiene una mejor respuesta.
Spundun

12
@Spundun, me perdiste allí. ¿Cómo es "mejor" una combinación de múltiples comandos, incluyendo cosas canalizadas a través de perl y sed, que usar un comando que Git ya tiene?
Joe White el

37
@Spundun con respecto a la respuesta git for-each-refde Jakub Narębski: puede hacer que pasen ramas remotas en refs/remotes/lugar de refs/heads/(o puede pasar ambas, separadas por espacios en blanco); refs/tags/para etiquetas, o solo refs/para los tres tipos.
jakub.g

44
A partir de git 2.7 (cuarto trimestre de 2015), ¡no más for-each-ref! Utilizará directamente git branch --sort=-committerdate: vea mi respuesta a continuación
VonC

1

Respuestas:


1874

Use la --sort=-committerdateopción de git for-each-ref;

También disponible desde Git 2.7.0 para git branch:

Uso Básico:

git for-each-ref --sort=-committerdate refs/heads/

# Or using git branch (since version 2.7.0)
git branch --sort=-committerdate  # DESC
git branch --sort=committerdate  # ASC

Resultado:

Result

Uso avanzado:

git for-each-ref --sort=committerdate refs/heads/ --format='%(HEAD) %(color:yellow)%(refname:short)%(color:reset) - %(color:red)%(objectname:short)%(color:reset) - %(contents:subject) - %(authorname) (%(color:green)%(committerdate:relative)%(color:reset))'

Resultado:

Result


15
¡Perfecto! Incluso puedo restringir la salida solo a los nombres de referencia agregando --format=%(refname).
Joe White

35
Esto es mejor para mí:git for-each-ref --sort=-committerdate refs/heads/ --format='%(refname) %(committerdate) %(authorname)' | sed 's/refs\/heads\///g'
saeedgnu

2
@ilius: ¿por qué no usar :shortname?
Jakub Narębski

37
@ilius: Como @BeauSmith escribió: git for-each-ref --sort=-committerdate --format='%(refname:short)' refs/heads/. La página de manual de git-for-each-ref (1) dice: Para un nombre corto no ambiguo de la referencia anexar :short.
Jakub Narębski

76
Esta es una versión coloreada que incluye hashes, mensajes, ordenados ascendentemente según la fecha de confirmación, con la edad relativa de la última confirmación en cada rama. Les robé todas las ideas de ustedes arriba. Está en mi .gitconfig en la [alias]sección y me encanta. br = for-each-ref --sort=committerdate refs/heads/ --format='%(HEAD) %(color:yellow)%(refname:short)%(color:reset) - %(color:red)%(objectname:short)%(color:reset) - %(contents:subject) - %(authorname) (%(color:green)%(committerdate:relative)%(color:reset))'
Michael Percy

124

Lista de nombres de sucursales de Git, ordenados por la confirmación más reciente ...

Ampliando la respuesta de Jakub y el consejo de Joe , lo siguiente eliminará los "refs / heads /" para que la salida solo muestre los nombres de las ramas:


Mando:

git for-each-ref --count=30 --sort=-committerdate refs/heads/ --format='%(refname:short)'

Resultado:

Recent Git branches


44
También puede usar en --format=%(refname:short)lugar de confiar cut.
Chaitanya Gupta

3
¿Hay alguna forma de hacer esto para el repositorio REMOTE?
Allan Bowe

10
aah - @ jakub.g ya explicó: puede obtener ramas remotas pasando referencias / controles remotos / en lugar de referencias / cabezas /. ¡¡Perfecto!!
Allan Bowe

Me gusta este, si estás tratando de alias, lo cual hice, para git rbrecordar rodear el comando entre comillas:git config --global alias.rb "for-each-ref --count=20 --sort=-committerdate refs/heads/ --format=\'%(refname:short)\'"
Michael Discenza

2
Y ahora puede hacer esto con git branch, así que obtener ramas locales, remotas o todas funciona como en git-branch (es decir, -r, -a). git branch -r --sort=committerdate --format='%(HEAD) %(color:yellow)%(refname:short)%(color:reset) - %(color:red)%(objectname:short)%(color:reset) - %(contents:subject) - %(authorname) (%(color:green)%(committerdate:relative)%(color:reset))'
Phord

89

Aquí está el código óptimo, que combina las otras dos respuestas:

git for-each-ref --sort=-committerdate refs/heads/ --format='%(committerdate:short) %(authorname) %(refname:short)'

10
Incluso un poco más optimizado para obtener una salida tabular:git for-each-ref --sort=-committerdate refs/heads/ --format='%(committerdate:short) %(authorname) %(refname:short)'
schoetbi

2
Por alguna razón, tuve que usar comillas dobles en Windows, pero de lo contrario, funcionan bien :)
comenta

1
@schoetbi Ese código se ve exactamente como el de nikolay, ¿qué cambiaste para hacerlo tabular?
Enrico

@Enrico y otros que pueden preguntarse sobre lo mismo. nikolay cambió su respuesta usando la sugerencia de schoetbis. Al mover primero la fecha, que siempre tiene la misma longitud, el resultado parece más tabular.
Johnny

83

Aquí hay un comando simple que enumera todas las ramas con los últimos commits:

git branch -v

Para ordenar por confirmación más reciente, use

git branch -v --sort=committerdate

Fuente: http://git-scm.com/book/en/Git-Branching-Branch-Management


11
git branch -avsi quieres ver sucursales no locales también.
Scott Stafford

34
Esto no ordena por fecha de confirmación según la pregunta.
Cas

1
¿Es fácil git branch -vincluir la fecha de cada confirmación en la lista?
dumbledad

1
¿qué tal <pre> git branch -v --sort = committerdate </pre>?
iraj jelodari

2
Esto es asombroso Me gusta git branch -va --sort=-committerdatemostrar sucursales no locales, con las sucursales cambiadas más recientemente en la parte superior.
Clinton Blackmore

61

Yo uso el siguiente alias:

recent = "!r(){git for-each-ref --sort=-committerdate refs/heads --format='%(HEAD)%(color:yellow)%(refname:short)|%(color:bold green)%(committerdate:relative)|%(color:blue)%(subject)|%(color:magenta)%(authorname)%(color:reset)'|column -ts'|'}; r"

que produce:

Resultado

Use '|' separar.


1
Gran alias! Sugeriría column -ts'|'y caracteres de canalización si la coma puede ocurrir dentro de marcas de tiempo relativas en su localidad.
Björn Lindqvist

1
gran alias, muchas gracias ¿Puedes mejorarlo para mostrar la rama actual con otro color o con * al principio?
elhadi dp ıpɐɥ ן ǝ

2
Al menos en la última versión de git, puede agregar '%(HEAD) ...'al comienzo de la cadena de formato para obtener el mismo efecto sin pasar por el sedcomando
Joshua Skrzypek

55
No podría hacer que esto funcione como un alias de git. Tuve que usar[alias] recent = !git for-each-ref --sort=-committerdate refs/heads --format='%(HEAD)%(color:yellow)%(refname:short)|%(color:bold green)%(committerdate:relative)|%(color:blue)%(subject)|%(color:magenta)%(authorname)%(color:reset)'|column -ts'|'
Wesley Smith el

11
Tuve que agregar --color = siempre para obtener color. git for-each-ref --sort=-committerdate refs/heads --format='%(HEAD)%(color:yellow)%(refname:short)|%(color:bold green)%(committerdate:relative)|%(color:blue)%(subject)|%(color:magenta)%(authorname)%(color:reset)' --color=always|column -ts'|'}
user3342930

40

Pude hacer referencia a los ejemplos anteriores para crear algo que funcione mejor para mí.

git for-each-ref --sort = -committerdate refs / heads / --format = '% (authordate: short)% (color: red)% (objectname: short)% (color: yellow)% (refname: short )% (color: reset) (% (color: verde)% (committerdate: relativo)% (color: reset)) '

Captura de pantalla de salida


1
Eso se ve bien, más colorido que usar directamente git branch como sugerí en stackoverflow.com/a/33163401/6309 . +1
VonC

2
Este me salió de la caja, a diferencia de algunos de los otros, así que voté a favor.
Casey

1
Funcionó como es realmente bien! ¡Gracias! :-)
FrozenTarzan

1
Ídem: este funcionó de forma inmediata, a diferencia de muchos otros que acabo de probar. Gracias.
Dan Nissenbaum

2
Este es limpio y ordenado. En algún momento agregaría el nombre remoto y el autor de esta manera: git for-each-ref --sort=-committerdate refs/heads/ refs/remotes --format='%(authordate:short) %(authorname) %(color:red)%(objectname:short) %(color:yellow)%(refname:short)%(color:reset) (%(color:green)%(committerdate:relative)%(color:reset))'
ywu

38

También necesitaba colores, etiquetas y referencias remotas sin duplicados:

for ref in $(git for-each-ref --sort=-committerdate --format="%(refname)" refs/heads/ refs/remotes ); do git log -n1 $ref --pretty=format:"%Cgreen%cr%Creset %C(yellow)%d%Creset %C(bold blue)<%an>%Creset%n" | cat ; done | awk '! a[$0]++'

Como las citas pueden ser difíciles, aquí está el alias de Bash:

alias glist='for ref in $(git for-each-ref --sort=-committerdate --format="%(refname)" refs/heads/ refs/remotes ); do git log -n1 $ref --pretty=format:"%Cgreen%cr%Creset %C(yellow)%d%Creset %C(bold blue)<%an>%Creset%n" | cat ; done | awk '"'! a["'$0'"]++'"

$ <su comando aquí> awk: error de sintaxis cerca de la línea 1 awk: rescate cerca de la línea 1
Jamie Mason

@GotNoSugarBaby ¿Está utilizando comillas simples como el ejemplo correcto? ¿Qué caparazón estás usando? Bash le da a ese personaje un significado especial de lo contrario.
estani

oye, ejecuté esto en / bin / bash (GNU bash, versión 4.0.28 (1) -release (i386-pc-solaris2.11)) con una copia directa y pego de su ejemplo, pero desde entonces he ejecutado está en / bin / bash (GNU bash, versión 3.2.48 (1) -release (x86_64-apple-darwin12)) y funciona, así que eliminaré el voto negativo. Muchas gracias estani.
Jamie Mason el

@GotNoSugarBaby Uso 4.2.25 (1) -release (x86_64-pc-linux-gnu) nad probé en 3.xy funcionó. No estoy seguro de qué problema era ... pero podría haber sido un problema relacionado con la versión git, en lugar de uno bash. En cualquier caso, me alegro de que funcione para ti.
Estani

1
@MichaelDiscenza simplemente conecta todo a la cabeza. eso sería agregar | head -n20al final. Si está utilizando el alias, asegúrese de que esté entre comillas.
estani

24

Las otras respuestas no parecen permitir pasar -vvpara obtener resultados detallados.

Así que aquí hay una línea que ordena git branch -vvpor fecha de confirmación, preservando el color, etc.

git branch -vv --color=always | while read; do echo -e $(git log -1 --format=%ct $(echo "_$REPLY" | awk '{print $2}' | perl -pe 's/\e\[?.*?[\@-~]//g') 2> /dev/null || git log -1 --format=%ct)"\t$REPLY"; done | sort -r | cut -f 2

Si además desea imprimir la fecha de confirmación, puede usar esta versión en su lugar:

git branch -vv --color=always | while read; do echo -e $(git log -1 --format=%ci $(echo "_$REPLY" | awk '{print $2}' | perl -pe 's/\e\[?.*?[\@-~]//g') 2> /dev/null || git log -1 --format=%ci)" $REPLY"; done | sort -r | cut -d ' ' -f -1,4-

Salida de muestra:

2013-09-15   master                  da39a3e [origin/master: behind 7] Some patch
2013-09-11 * (detached from 3eba4b8) 3eba4b8 Some other patch
2013-09-09   my-feature              e5e6b4b [master: ahead 2, behind 25] WIP

Probablemente sea más legible dividido en varias líneas:

git branch -vv --color=always | while read; do
    # The underscore is because the active branch is preceded by a '*', and
    # for awk I need the columns to line up. The perl call is to strip out
    # ansi colors; if you don't pass --color=always above you can skip this
    local branch=$(echo "_$REPLY" | awk '{print $2}' | perl -pe 's/\e\[?.*?[\@-~]//g')
    # git log fails when you pass a detached head as a branch name.
    # Hide the error and get the date of the current head.
    local branch_modified=$(git log -1 --format=%ci "$branch" 2> /dev/null || git log -1 --format=%ci)
    echo -e "$branch_modified $REPLY"
# cut strips the time and timezone columns, leaving only the date
done | sort -r | cut -d ' ' -f -1,4-

Esto también debería funcionar con otros argumentos para git branch, por ejemplo, -vvrenumerar ramas de seguimiento remoto, o -vvapara enumerar ramas locales y de seguimiento remoto.


-vvpuede ser útil de hecho, gracias. Sin embargo, esta solución aún genera nuevos procesos para cada rama, que el OP quería evitar.
musiphil

En realidad git branchno define específicamente el significado de -vv, sino solo de -v, por lo que -vvdebería tener el mismo que -v.
musiphil

2
Esto es lo mejor. Y agregar -avv hace que también tenga en cuenta las ramas remotas. ¡Gracias por esto!
Gopherkhan

@musiphil Mi página de manual de rama de git , la sección -v, -vv, --verbosecontiene lo siguiente:If given twice, print the name of the upstream branch, as well
Perleone

@Perleone: No sé cómo obtuve esa información, pero tienes razón y estoy corregido. ¡Gracias!
musiphil

23

git 2.7 (Q4 2015) introducirá la clasificación de sucursales usando directamente git branch:
ver commit aa3bc55 , commit aedcb7d , commit 1511b22 , commit f65f139 , ... (23 sep 2015), commit aedcb7d , commit 1511b22 , commit ca41799 (24 sep 2015), y commit f65f139 , ... (23 sep 2015) por Karthik Nayak ( KarthikNayak) .
(Fusionada por Junio ​​C Hamano - gitster- en commit 7f11b48 , 15 oct 2015)

En particular, comete aedcb7d :

branch.c: use ' ref-filter' API

Haga API de branch.c"uso" ref-filterpara iterar a través de la clasificación de referencias. Esto elimina la mayor parte del código utilizado en ' branch.c' reemplazándolo con llamadas a la ref-filterbiblioteca ' '.

Se añade la opción--sort=<key> :

Ordenar según la clave dada.
Prefijo -para ordenar en orden descendente del valor.

Puede usar la --sort=<key>opción varias veces, en cuyo caso la última clave se convierte en la clave principal.

Las teclas admitidas son las mismas que las degit for-each-ref .
El orden de clasificación predeterminado es la clasificación basada en el nombre de referencia completo (incluido el refs/...prefijo). Esto enumera HEAD separado (si está presente) primero, luego ramas locales y finalmente ramas de seguimiento remoto.

Aquí:

git branch --sort=-committerdate 

O (ver más abajo con Git 2.19)

# if you are sure to /always/ want to see branches ordered by commits:
git config --global branch.sort -committerdate
git branch

Ver también commit 9e46833 (30 de octubre de 2015) por Karthik Nayak ( KarthikNayak) .
Ayudado por: Junio ​​C Hamano ( gitster) .
(Fusionada por Junio ​​C Hamano - gitster- en commit 415095f , 03 nov 2015)

Al ordenar según los valores numéricos (p --sort=objectsize. Ej. ) No hay comparación de respaldo cuando ambas referencias tienen el mismo valor. Esto puede causar resultados inesperados (es decir, el orden de enumerar las referencias con valores iguales no se puede predeterminar) como lo señala Johannes Sixt ( $ gmane / 280117 ).

Por lo tanto, recurra a la comparación alfabética basada en el nombre de referencia siempre que el otro criterio sea igual .

$ git branch --sort=objectsize

*  (HEAD detached from fromtag)
      branch-two
      branch-one
      master

Con Git 2.19, el orden de clasificación se puede establecer de forma predeterminada.
git branchadmite una configuración branch.sort, como git tag, que ya tenía una configuración tag.sort.
Ver commit 560ae1c (16 de agosto de 2018) por Samuel Maftoul (``) .
(Fusionada por Junio ​​C Hamano - gitster- en commit d89db6f , 27 de agosto de 2018)

branch.sort:

Esta variable controla el orden de clasificación de las ramas cuando se muestra por git-branch.
Sin la --sort=<value>opción " " provista, el valor de esta variable se usará como predeterminado.


Para enumerar ramas remotas, use git branch -r --sort=objectsize. La -rbandera hace que enumere ramas remotas en lugar de ramas locales.


Con Git 2.27 (Q2 2020), " git branch" y otras " for-each-ref" variantes aceptaron múltiples --sort=<key>opciones en el creciente orden de precedencia, pero tuvo algunas interrupciones "--ignore-case " manejo y el desempate con el nombre de referencia, que se han solucionado.

Ver commit 7c5045f , commit 76f9e56 (03 de mayo de 2020) por Jeff King ( peff) .
(Fusionada por Junio ​​C Hamano - gitster- en commit 6de1630 , 08 de mayo de 2020)

ref-filter: aplique el orden de cambio de nombre de reserva solo después de todo tipo de usuarios

Firmado por: Jeff King

Commit 9e468334b4 (" ref-filter: retroceso en la comparación alfabética", 30/10/2015, Git v2.7.0-rc0 - fusión enumerada en el lote # 10 ) enseñó el tipo de filtro de ref para recurrir a la comparación de nombres de referencia.
Pero lo hizo en el nivel incorrecto, anulando el resultado de la comparación para una sola " --sort" clave del usuario, en lugar de después de que todas las claves de clasificación se hayan agotado.

Esto funcionó correctamente para una sola " --sort" opción, pero no para varias.
Romperíamos cualquier vínculo en la primera clave con el nombre de referencia y nunca evaluaríamos la segunda clave.

Para hacer las cosas aún más interesantes, ¡solo aplicamos este retroceso a veces!
Para un campo como " taggeremail" que requiere una comparación de cadenas, realmente devolveríamos el resultado de strcmp(), incluso si fuera 0.
Pero para " value" campos como " taggerdate" numéricos , aplicamos el respaldo. Y es por eso que nuestra prueba de clasificación múltiple se perdió esto: se utiliza taggeremailcomo la comparación principal.

Entonces, comencemos agregando una prueba mucho más rigurosa. Tendremos un conjunto de confirmaciones que expresan cada combinación de dos correos electrónicos, fechas y nombres de referencia. Luego podemos confirmar que nuestro orden se aplica con la precedencia correcta, y estaremos golpeando tanto la cadena como los comparadores de valores.

Eso muestra el error, y la solución es simple: compare_refs()después de todo, mover el respaldo a la función externa .ref_sorting teclas se hayan agotado.

Tenga en cuenta que en la función externa no tenemos una "ignore_case"bandera, ya que es parte de cada ref_sortingelemento individual . Es discutible lo que debería hacer tal respaldo, ya que no utilizamos las claves del usuario para que coincidan.
Pero hasta ahora hemos estado tratando de respetar esa bandera, por lo que lo menos invasivo es tratar de seguir haciéndolo.
Dado que todas las personas que llaman en el código actual establecen la bandera para todas las teclas o ninguna, podemos simplemente extraer la bandera de la primera tecla. En un mundo hipotético donde el usuario realmente puede voltear la mayúsculas y minúsculas de las teclas por separado, es posible que queramos extender el código para distinguir ese caso de una " --ignore-case" mantilla .


Para enumerar los controles remotos con esta opción, agregue-r
Troy Daniels

@TroyDaniels De acuerdo. Puedes editar la respuesta. Revisaré tu edición.
VonC

19

Me gusta usar una fecha relativa y acortar el nombre de la rama de esta manera:

git for-each-ref --sort='-authordate:iso8601' --format=' %(authordate:relative)%09%(refname:short)' refs/heads

Lo que te da salida:

21 minutes ago  nathan/a_recent_branch
6 hours ago     master
27 hours ago    nathan/some_other_branch
29 hours ago    branch_c
6 days ago      branch_d

Recomiendo hacer un archivo Bash para agregar todos sus alias favoritos y luego compartir el script con su equipo. Aquí hay un ejemplo para agregar solo este:

#!/bin/sh

git config --global alias.branches "!echo ' ------------------------------------------------------------' && git for-each-ref --sort='-authordate:iso8601' --format=' %(authordate:relative)%09%(refname:short)' refs/heads && echo ' ------------------------------------------------------------'"

Luego puede hacer esto para obtener una lista de sucursales locales bien formateada y ordenada:

git branches

Actualización: haz esto si quieres colorear:

#!/bin/sh
#
(echo ' ------------------------------------------------------------‌​' && git for-each-ref --sort='-authordate:iso8601' --format=' %(authordate:relative)%09%(refname:short)' refs/heads && echo ' ------------------------------------------------------------‌​') | grep --color -E "$(git rev-parse --abbrev-ref HEAD)$|$"

Esto me dafatal: unknown field name: '-authordate:iso8601'
Factor Mystic

1
La salida de color elegante es elegante, pero esto es simple y justo lo que estaba buscando. Reemplace refs/headscon refs/remotespara echar un vistazo a las ramas remotas.
Lambart

El comando en sí es encantador, pero el alias arroja un error:expansion of alias 'branches' failed; 'echo' is not a git command
Philip Kahn

Funciona para mi. ¿Qué sucede si solo copia y pega esto en la terminal? (echo ' ------------------------------------------------------------‌​' && git for-each-ref --sort='-authordate:iso8601' --format=' %(authordate:relative)%09%(refname:short)' refs/heads && echo ' ------------------------------------------------------------‌​') | grep --color -E "$(git rev-parse --abbrev-ref HEAD)$|$"
n8tr

17

A partir de Git 2.19 puedes simplemente:

git branch --sort=-committerdate

Tú también puedes:

git config branch.sort -committerdate

Por lo tanto, cada vez que enumere ramas en el repositorio actual, se mostrará ordenado por committerdate.

Si cada vez que enumera ramas, desea ordenarlas por fecha de comisión:

git config --global branch.sort -committerdate

Descargo de responsabilidad: soy el autor de esta función en Git, y la implementé cuando vi esta pregunta.


2
La respuesta más actualizada, mucho más fácil que usar scripts o alias complejos m
mtefi

¡Usar con precaución! Cuidado con todos, este no es un comando para enumerar las ramas. Es un comando para cambiar la configuración de Git y tendrá repercusiones globales permanentes.
Jazimov el

1
@Jazimov tienes razón, edité la respuesta para que sea más clara
usuario801247

11

Agrega algo de color (ya pretty-formatque no está disponible)

[alias]
    branchdate = for-each-ref --sort=-committerdate refs/heads/ --format="%(authordate:short)%09%(objectname:short)%09%1B[0;33m%(refname:short)%1B[m%09"

9

Tuve el mismo problema, así que escribí una gema Ruby llamada Twig . Enumera las ramas en orden cronológico (las más nuevas primero) y también puede permitirle establecer una edad máxima para que no enumere todas las ramas (si tiene muchas). Por ejemplo:

$ twig

                              issue  status       todo            branch
                              -----  ------       ----            ------
2013-01-26 18:00:21 (7m ago)  486    In progress  Rebase          optimize-all-the-things
2013-01-26 16:49:21 (2h ago)  268    In progress  -               whitespace-all-the-things
2013-01-23 18:35:21 (3d ago)  159    Shipped      Test in prod  * refactor-all-the-things
2013-01-22 17:12:09 (4d ago)  -      -            -               development
2013-01-20 19:45:42 (6d ago)  -      -            -               master

También le permite almacenar propiedades personalizadas para cada rama, por ejemplo, ID de ticket, estado, todos y filtrar la lista de ramas de acuerdo con estas propiedades. Más información: http://rondevera.github.io/twig/


55
Es posible que ese nombre no ayude, ya que estoy bastante seguro de que hay algunas piezas de software con el mismo nombre.
thoroc

8

Se me ocurrió el siguiente comando (para Git 2.13 y posterior):

git branch -r --sort=creatordate \
    --format "%(creatordate:relative);%(committername);%(refname:lstrip=-1)" \
    | grep -v ";HEAD$" \
    | column -s ";" -t

Si no tiene column, puede reemplazar la última línea con

    | sed -e "s/;/\t/g"

La salida se ve como

6 years ago             Tom Preston-Werner  book
4 years, 4 months ago   Parker Moore        0.12.1-release
4 years ago             Matt Rogers         1.0-branch
3 years, 11 months ago  Matt Rogers         1.2_branch
3 years, 1 month ago    Parker Moore        v1-stable
12 months ago           Ben Balter          pages-as-documents
10 months ago           Jordon Bedwell      make-jekyll-parallel
6 months ago            Pat Hawks           to_integer
5 months ago            Parker Moore        3.4-stable-backport-5920
4 months ago            Parker Moore        yajl-ruby-2-4-patch
4 weeks ago             Parker Moore        3.4-stable
3 weeks ago             Parker Moore        rouge-1-and-2
19 hours ago            jekyllbot           master

Escribí una publicación de blog sobre cómo funcionan las diferentes piezas.


Agradable. +1. Utiliza el git branch --sortque mencioné en stackoverflow.com/a/33163401/6309 .
VonC

@DanNissenbaum Asegúrese de estar usando Git 2.13 (lanzado en mayo de 2017) o posterior.
bdesham


5

Aquí hay un pequeño script que uso para cambiar entre ramas recientes:

#!/bin/bash
# sudo bash

re='^[0-9]+$'

if [[ "$1" =~ $re ]]; then
    lines="$1"
else
    lines=10
fi
branches="$(git recent | tail -n $lines | nl)"
branches_nf="$(git recent-nf | tail -n $lines | nl)"
echo "$branches"

# Prompt which server to connect to
max="$(echo "$branches" | wc -l)"
index=
while [[ ! ( "$index" =~ ^[0-9]+$ && "$index" -gt 0 && "$index" -le "$max" ) ]]; do
    echo -n "Checkout to: "
    read index
done

branch="$( echo "$branches_nf" | sed -n "${index}p" | awk '{ print $NF }' )"
git co $branch
clear

Usando esos dos alias:

recent = for-each-ref --sort=committerdate refs/heads/ --format=' %(color:blue) %(authorname) %(color:yellow)%(refname:short)%(color:reset)'
recent-nf = for-each-ref --sort=committerdate refs/heads/ --format=' %(authorname) %(refname:short)'

Simplemente llame a eso en un repositorio Git, y le mostrará las últimas N ramas (10 por defecto) y un número a un lado de cada una. Ingrese el número de la rama, y ​​se desprotege:

Ingrese la descripción de la imagen aquí


4

Normalmente consideramos las ramas remotas recientemente. Así que prueba esto

git fetch
git for-each-ref --sort=-committerdate refs/remotes/origin

4

Aquí hay otro script que hace lo mismo que todos los demás. De hecho, proporciona una función para su shell.

Su contribución es que extrae algunos colores de su configuración de Git (o usa valores predeterminados).

# Git Branch by Date
# Usage: gbd [ -r ]
gbd() {
    local reset_color=`tput sgr0`
    local subject_color=`tput setaf 4 ; tput bold`
    local author_color=`tput setaf 6`

    local target=refs/heads
    local branch_color=`git config --get-color color.branch.local white`

    if [ "$1" = -r ]
    then
        target=refs/remotes/origin
        branch_color=`git config --get-color color.branch.remote red`
    fi

    git for-each-ref --sort=committerdate $target --format="${branch_color}%(refname:short)${reset_color} ${subject_color}%(subject)${reset_color} ${author_color}- %(authorname) (%(committerdate:relative))${reset_color}"
}

3

Esto se basa en la versión de saeedgnu , pero con la rama actual que se muestra con una estrella y en color, y solo muestra algo que no se describió como hace "meses" o "años":

current_branch="$(git symbolic-ref --short -q HEAD)"
git for-each-ref --sort=committerdate refs/heads \
  --format='%(refname:short)|%(committerdate:relative)' \
  | grep -v '\(year\|month\)s\? ago' \
  | while IFS='|' read branch date
    do
      start='  '
      end=''
      if [[ $branch = $current_branch ]]; then
        start='* \e[32m'
        end='\e[0m'
      fi
      printf "$start%-30s %s$end\\n" "$branch" "$date"
    done

2

Mi mejor resultado como script:

git for-each-ref --sort=-committerdate refs/heads/ --format='%(refname:short)|%(committerdate:iso)|%(authorname)' |
    sed 's/refs\/heads\///g' |
    grep -v BACKUP  | 
    while IFS='|' read branch date author
    do 
        printf '%-15s %-30s %s\n' "$branch" "$date" "$author"
    done

1
¿Qué tipo de guión? ¿Golpetazo?
Peter Mortensen el

2

git branch --sort=-committerdate | head -5

Para cualquiera que esté interesado en ordenar solo los 5 nombres de sucursales principales según la fecha de confirmación.



1

Aquí está la variación que estaba buscando:

git for-each-ref --sort=-committerdate --format='%(committerdate)%09%(refname:short)' refs/heads/ | tail -r

Eso tail -rinvierte la lista para que el más reciente commiterdatesea ​​el último.


3
También puede cambiar --sort = -committerdate a --sort = committerdate para lograr esto.
reformular el

¿Qué tailtiene -r?
Christoffer Hammarström

1

Canalizo la salida de la respuesta aceptada en dialog, para darme una lista interactiva:

#!/bin/bash

TMP_FILE=/tmp/selected-git-branch

eval `resize`
dialog --title "Recent Git Branches" --menu "Choose a branch" $LINES $COLUMNS $(( $LINES - 8 )) $(git for-each-ref --sort=-committerdate refs/heads/ --format='%(refname:short) %(committerdate:short)') 2> $TMP_FILE

if [ $? -eq 0 ]
then
    git checkout $(< $TMP_FILE)
fi

rm -f $TMP_FILE

clear

Guardar como (por ejemplo) ~/bin/git_recent_branches.shy chmod +xél. Entonces git config --global alias.rb '!git_recent_branches.sh'para darme un nuevo git rbcomando.


1

Sé que ya hay muchas respuestas, pero aquí están mis dos centavos para un alias simple (me gusta tener mi rama más reciente en la parte inferior):

[alias]
        br = !git branch --sort=committerdate --color=always | tail -n15
[color "branch"]
        current = yellow
        local = cyan
        remote = red

Esto le dará una buena visión general de sus últimas 15 ramas, en color, con su rama actual resaltada (y tiene un asterisco).


1

Tuve algunos problemas para manejar comillas simples en Mac en bash_profile al intentar establecer un alias. Esta respuesta ayudó a resolverlo " Cómo escapar de comillas simples dentro de cadenas de comillas simples

Solución de trabajo:

alias gb='git for-each-ref --sort=committerdate refs/heads/ --format='"'"'%(HEAD) %(color:yellow)%(refname:short)%(color:reset) - %(color:red)%(objectname:short)%(color:reset) - %(contents:subject) - %(authorname) (%(color:green)%(committerdate:relative)%(color:reset))'"'"''

PD: No puedo comentar debido a mi reputación.


0

git for-each-ref --sort=committerdate refs/heads/ --format='%(HEAD) %(color:yellow)%(refname:short)%(color:reset) - %(color:red)%(objectname:short)%(color:reset) - %(contents:subject) - %(authorname) (%(color:green)%(committerdate:relative)%(color:reset))' esto es lo que necesitas


0

Git v2.19 presenta la branch.sortopción de configuración (ver branch.sort ).

Por git branchlo tanto, se ordenará por fecha de confirmación (desc) de forma predeterminada con

# gitconfig
[branch]
    sort = -committerdate     # desc

guión:

$ git config --global branch.sort -committerdate

Actualizar:

Entonces,

$ git branch
* dev
  master
  _

y

$ git branch -v
* dev    0afecf5 Merge branch 'oc' into dev
  master 652428a Merge branch 'dev'
  _      7159cf9 Merge branch 'bashrc' into dev
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.