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 branch
para obtener una lista de todas las ramas, analizar su salida y luego, git log -n 1 branchname --format=format:%ci
para 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?
fuente
git for-each-ref
de Jakub Narębski: puede hacer que pasen ramas remotas enrefs/remotes/
lugar derefs/heads/
(o puede pasar ambas, separadas por espacios en blanco);refs/tags/
para etiquetas, o solorefs/
para los tres tipos.for-each-ref
! Utilizará directamentegit branch --sort=-committerdate
: vea mi respuesta a continuaciónRespuestas:
Use la
--sort=-committerdate
opción degit for-each-ref
;También disponible desde Git 2.7.0 para
git branch
:Uso Básico:
Resultado:
Uso avanzado:
Resultado:
fuente
--format=%(refname)
.git for-each-ref --sort=-committerdate refs/heads/ --format='%(refname) %(committerdate) %(authorname)' | sed 's/refs\/heads\///g'
:shortname
?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
.[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))'
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:
Resultado:
fuente
--format=%(refname:short)
lugar de confiarcut
.git rb
recordar rodear el comando entre comillas:git config --global alias.rb "for-each-ref --count=20 --sort=-committerdate refs/heads/ --format=\'%(refname:short)\'"
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))'
Aquí está el código óptimo, que combina las otras dos respuestas:
fuente
git for-each-ref --sort=-committerdate refs/heads/ --format='%(committerdate:short) %(authorname) %(refname:short)'
Aquí hay un comando simple que enumera todas las ramas con los últimos commits:
Para ordenar por confirmación más reciente, use
Fuente: http://git-scm.com/book/en/Git-Branching-Branch-Management
fuente
git branch -av
si quieres ver sucursales no locales también.git branch -v
incluir la fecha de cada confirmación en la lista?git branch -va --sort=-committerdate
mostrar sucursales no locales, con las sucursales cambiadas más recientemente en la parte superior.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:
Use '|' separar.
fuente
column -ts'|'
y caracteres de canalización si la coma puede ocurrir dentro de marcas de tiempo relativas en su localidad.'%(HEAD) ...'
al comienzo de la cadena de formato para obtener el mismo efecto sin pasar por elsed
comando[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'|'
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'|'}
Pude hacer referencia a los ejemplos anteriores para crear algo que funcione mejor para mí.
fuente
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))'
También necesitaba colores, etiquetas y referencias remotas sin duplicados:
Como las citas pueden ser difíciles, aquí está el alias de Bash:
fuente
| head -n20
al final. Si está utilizando el alias, asegúrese de que esté entre comillas.Las otras respuestas no parecen permitir pasar
-vv
para obtener resultados detallados.Así que aquí hay una línea que ordena
git branch -vv
por fecha de confirmación, preservando el color, etc.Si además desea imprimir la fecha de confirmación, puede usar esta versión en su lugar:
Salida de muestra:
Probablemente sea más legible dividido en varias líneas:
Esto también debería funcionar con otros argumentos para
git branch
, por ejemplo,-vvr
enumerar ramas de seguimiento remoto, o-vva
para enumerar ramas locales y de seguimiento remoto.fuente
-vv
puede ser útil de hecho, gracias. Sin embargo, esta solución aún genera nuevos procesos para cada rama, que el OP quería evitar.git branch
no define específicamente el significado de-vv
, sino solo de-v
, por lo que-vv
debería tener el mismo que-v
.-v, -vv, --verbose
contiene lo siguiente:If given twice, print the name of the upstream branch, as well
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 :
Haga API de
branch.c
"uso"ref-filter
para 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 laref-filter
biblioteca ' '.Se añade la opción
--sort=<key>
:Aquí:
O (ver más abajo con Git 2.19)
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)Con Git 2.19, el orden de clasificación se puede establecer de forma predeterminada.
git branch
admite una configuraciónbranch.sort
, comogit tag
, que ya tenía una configuracióntag.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)Para enumerar ramas remotas, use
git branch -r --sort=objectsize
. La-r
bandera 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)fuente
-r
Me gusta usar una fecha relativa y acortar el nombre de la rama de esta manera:
Lo que te da salida:
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:
Luego puede hacer esto para obtener una lista de sucursales locales bien formateada y ordenada:
Actualización: haz esto si quieres colorear:
fuente
fatal: unknown field name: '-authordate:iso8601'
refs/heads
conrefs/remotes
para echar un vistazo a las ramas remotas.expansion of alias 'branches' failed; 'echo' is not a git command
(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)$|$"
A partir de Git 2.19 puedes simplemente:
Tú también puedes:
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:
Descargo de responsabilidad: soy el autor de esta función en Git, y la implementé cuando vi esta pregunta.
fuente
Agrega algo de color (ya
pretty-format
que no está disponible)fuente
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:
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/
fuente
Se me ocurrió el siguiente comando (para Git 2.13 y posterior):
Si no tiene
column
, puede reemplazar la última línea conLa salida se ve como
Escribí una publicación de blog sobre cómo funcionan las diferentes piezas.
fuente
git branch --sort
que mencioné en stackoverflow.com/a/33163401/6309 .Para su información, si desea obtener una lista de sucursales recientemente desprotegidas (en lugar de confirmadas recientemente), puede usar el registro de Git:
Ver también: ¿Cómo puedo obtener una lista de sucursales de Git que he revisado recientemente?
fuente
Aquí hay un pequeño script que uso para cambiar entre ramas recientes:
Usando esos dos alias:
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:
fuente
Normalmente consideramos las ramas remotas recientemente. Así que prueba esto
fuente
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).
fuente
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":
fuente
Mi mejor resultado como script:
fuente
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.
fuente
La respuesta de línea de comandos aceptada es genial, pero si quieres algo más bonito, como una GUI, y tu origen === "github".
Puede hacer clic en "Ramas" en el repositorio. O presione la URL directamente: https://github.com/ORGANIZATION_NAME/REPO_NAME/branches
fuente
Aquí está la variación que estaba buscando:
Eso
tail -r
invierte la lista para que el más recientecommiterdate
sea el último.fuente
tail
tiene-r
?Canalizo la salida de la respuesta aceptada en
dialog
, para darme una lista interactiva:Guardar como (por ejemplo)
~/bin/git_recent_branches.sh
ychmod +x
él. Entoncesgit config --global alias.rb '!git_recent_branches.sh'
para darme un nuevogit rb
comando.fuente
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):
Esto le dará una buena visión general de sus últimas 15 ramas, en color, con su rama actual resaltada (y tiene un asterisco).
fuente
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:
PD: No puedo comentar debido a mi reputación.
fuente
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 necesitasfuente
Git v2.19 presenta la
branch.sort
opción de configuración (ver branch.sort ).Por
git branch
lo tanto, se ordenará por fecha de confirmación (desc) de forma predeterminada conguión:
Actualizar:
Entonces,
y
fuente