¿Cómo determinar cuándo se creó una rama Git?

327

¿Hay alguna manera de determinar cuándo se creó una rama Git? Tengo una rama en mi repositorio y no recuerdo haberla creado, y pensé que tal vez ver la marca de tiempo de la creación podría activar mi memoria.

paxos1977
fuente
3
encontré esto que fue muy útil commandlinefu.com/commands/view/2345/…
Brendon-Van-Heyzen
1
Cuando esta pregunta, eran lo que realmente interesado en obtener la fecha y hora de creación de la rama, o estuvo también interesado en saber donde en el historial de cometer se creó la primera rama, es decir, que comprometen su rama fue ramificado primera fuera ¿de?
3
@ Cupcake, la pregunta es bastante clara. Estaba interesado cuando creé la sucursal. Dicho esto, conocer el commit sería información útil en el caso general.
paxos1977

Respuestas:

151

Utilizar

git show - resumen `git merge-base foo master`

Si prefieres verlo en contexto usando gitk, entonces usa

gitk --all --select-commit = `git merge-base foo master`

(donde foo es el nombre de la sucursal que está buscando).

Captura de pantalla

Greg Bacon
fuente
24
Para aclarar la respuesta, hay dos pasos para el proceso. (1) obtenga el treesh usando "git merge-base <branch> master" donde branch es la rama de interés. (2) Use el treesh como entrada en git show para obtener la fecha: "git show --summary <treesh>"
paxos1977
11
Esta respuesta parece excepto que la rama ha sido creada desde master. Pero, ¿y si no es el caso? ¿Hay alguna manera de encontrar el primer commit de la rama que tiene más de 1 hijo?
Manitra Andriamitondra
20
Esta no es la fecha en la que se creó la rama , esta es la confirmación de "ramificación".
Marco
44
La solución solo funcionará si 'branch' nunca se fusionó con 'master'. ¿Hay alguna manera de encontrar la primera base de fusión para dos ramas universalmente?
Ilya Ivanov
22
Esto muestra la base de fusión, no la creación de ramas.
Hedley
139

Como se señaló en los comentarios y en la respuesta de Jackub , siempre que su rama sea más joven que la cantidad de días establecida en la configuracióngc.reflogexpire (el valor predeterminado es 90 días), puede utilizar su registro para averiguar cuándo fue una referencia de sucursal Primero creado.

Tenga en cuenta que git reflogpuede tomar la mayoría de las git logbanderas. Además, tenga en cuenta que los HEAD@{0}selectores de estilo son efectivamente nociones de tiempo y, de hecho, se manejan (de forma pirateada) como cadenas de fecha. Esto significa que puede usar la bandera --date=localy obtener resultados como este:

$ git reflog --date = local
763008c HEAD @ {vie 20 de agosto 10:09:18 2010}: pull: avance rápido
f6cec0a HEAD @ {Tue Aug 10 09:37:55 2010}: pull: Fast-forward
e9e70bc HEAD @ {jue 4 de febrero 02:51:10 2010}: pull: avance rápido
836f48c HEAD @ {jue 21 de enero 14:08:14 2010}: pago: pasar de maestro a maestro
836f48c HEAD @ {jue 21 de enero 14:08:10 2010}: pull: avance rápido
24bc734 HEAD @ {Wed Jan 20 12:05:45 2010}: finalización de la compra: pasar de 74fca6a42863ffacaf7ba6f1936a9f228950f657 
74fca6a HEAD @ {mié 20 de enero 11:55:43 2010}: pago: pasar de maestro a v2.6.31
24bc734 HEAD @ {mié 20 de enero 11:44:42 2010}: pull: avance rápido
964fe08 HEAD @ {Lun Oct 26 15:29:29 2009}: finalización de la compra: pasar de 4a6908a3a050aacc9c3a2f36b276b46c0629ad91 
4a6908a HEAD @ {Lun Oct 26 14:52:12 2009}: pago: pasar de maestro a v2.6.28

También puede ser útil en ocasiones usar --date=relative:

$ git reflog --date = relativo
763008c HEAD @ {hace 4 semanas}: pull: avance rápido
f6cec0a HEAD @ {hace 6 semanas}: pull: avance rápido
e9e70bc HEAD @ {hace 8 meses}: pull: avance rápido
836f48c HEAD @ {hace 8 meses}: pago: pasar de maestro a maestro
836f48c HEAD @ {hace 8 meses}: pull: avance rápido
24bc734 HEAD @ {hace 8 meses}: pago: pasar de 74fca6a42863ffacaf7ba6f1936a9f228950f657 a master
74fca6a HEAD @ {hace 8 meses}: pago: pasar de master a v2.6.31
24bc734 HEAD @ {hace 8 meses}: pull: avance rápido
964fe08 HEAD @ {hace 11 meses}: pago: pasar de 4a6908a3a050aacc9c3a2f36b276b46c0629ad91 a master
4a6908a HEAD @ {hace 11 meses}: pago: pasar de master a v2.6.28

Una última nota: el --allindicador (que es realmente un indicador de git-log entendido por git-reflog) mostrará los registros de todas las referencias conocidas en refs/( en lugar de simplemente HEAD) , que le mostrará claramente los eventos de ramificación:

git reflog --date = local --todos
860e4e4 refs / heads / master @ {dom sep 19 23:00:30 2010}: commit: Second.
17695bc refs / heads / example_branch @ {Mon Sep 20 00:31:06 2010}: branch: Creado desde HEAD
Aaron
fuente
3
Muy interesante. +1. Siempre que, por supuesto, esto tenga lugar en unos gc.reflogexpiredías.
VonC
2
@VonC: tienes razón. El valor predeterminado para gc.reflogexpire es de 90 días.
Aaron
1
¡Finalmente! la única respuesta en la que git dice: "rama: creada desde HEAD". Así que esa esquiva "rama" de git PUEDE ser rastreada hasta su fecha y hora de creación ... Gracias, premio +1. Pero, ¿qué pasa con esa cosa gc.reflogexpire, y cómo hacer esto en sucursales remotas?
Motti Shneor
60

Pro Git § 3.1 Git Branching: qué es una rama tiene una buena explicación de lo que realmente es una rama git

Una rama en Git es simplemente un puntero móvil ligero para [a] commit.

Dado que una rama es solo un puntero liviano, git no tiene una noción explícita de su historial o fecha de creación. "Pero espera", te escucho decir, "¡por supuesto que Git conoce la historia de mi sucursal!" Especie de.

Si ejecuta alguno de los siguientes:

git log <branch> --not master
gitk <branch> --not master

verá lo que parece el "historial de su rama", pero es realmente una lista de confirmaciones accesibles desde 'rama' a las que no se puede acceder desde el maestro. Esto le brinda la información que desea, pero si y solo si nunca ha fusionado 'rama' de nuevo a maestro, y nunca ha fusionado maestro a 'rama' desde que lo creó. Si se ha fusionado, entonces este historial de diferencias colapsará.

Afortunadamente, el reflog a menudo contiene la información que desea, como se explica en varias otras respuestas aquí. Utilizar este:

git reflog --date=local <branch>

para mostrar la historia de la sucursal. La última entrada en esta lista es (probablemente) el punto en el que creó la rama.

Si la rama se ha eliminado, entonces 'rama' ya no es un identificador git válido, pero puede usar esto en su lugar, que puede encontrar lo que desea:

git reflog --date=local | grep <branch>

O en un shell de cmd de Windows:

git reflog --date=local | find "<branch>"

Tenga en cuenta que reflog no funcionará de manera efectiva en sucursales remotas, solo en aquellas en las que haya trabajado localmente.

yoyó
fuente
Hmm, todavía no estoy seguro de cuán útil es esta respuesta, tendré que estudiarla más tarde. Sin embargo, por lo que vale, definitivamente hizo un buen trabajo al esforzarse por escribir algo completo , y no solo una respuesta parcial breve y perezosa, por lo que definitivamente es bueno. Además, es importante tener en cuenta que solo puede usar el registro de registro para esto siempre que su rama no sea anterior a gc.reflogexpiredías, como se señala en esta respuesta y esta respuesta .
44
No quería duplicar toda la buena información sobre reflogs de las otras respuestas, pero estoy feliz de agregar gc.reflogexpire si crees que es útil. Mi respuesta tenía la intención de (1) proporcionar más claridad sobre qué es una rama git y por qué su "historial" es algo nebuloso, (2) poner comandos útiles al frente y al centro, incluyendo (3) mostrar commits en una rama y no master y (4) greping el reflog para una rama eliminada. Comentarios bienvenidos.
yoyo
Gracias @ Cupcake. Curiosamente, originalmente tenía corchetes angulares alrededor de 'rama', pero eso estaba quitando toda la palabra de mi vista previa de respuesta, por lo que asumí que se trató por error como html en línea (no válido).
yoyo
Este método ha funcionado bien a través de intellij y BitBucketgit reflog --date=local <branch>
Isaac resiste
41

Primero, si su bifurcación se creó dentro de los gc.reflogexpiredías (por defecto 90 días, es decir, alrededor de 3 meses), puede usar git log -g <branch>o git reflog show <branch>para encontrar la primera entrada en el registro de registros, que sería un evento de creación, y se parece a lo siguiente (para git log -g):

Reflog: <branch>@{<nn>} (C R Eator <[email protected]>)
Reflog message: branch: Created from <some other branch>

Obtendría quién creó una rama, cuántas operaciones hace y desde qué rama (bueno, podría ser simplemente "Creado desde HEAD", lo que no ayuda mucho).

Eso es lo que MikeSep dijo en su respuesta .


En segundo lugar, si tiene una rama por más tiempo gc.reflogexpirey se ha ejecutado git gc(o se ejecutó automáticamente), tendría que encontrar un antepasado común con la rama a partir de la cual se creó. Eche un vistazo al archivo de configuración, tal vez haya una branch.<branchname>.mergeentrada, que le dirá en qué rama se basa este.

Si sabe que la rama en cuestión se creó fuera de la rama maestra (bifurcación de la rama maestra), por ejemplo, puede usar el siguiente comando para ver un ancestro común:

git show $(git merge-base <branch> master)

También puedes probar git show-branch <branch> master, como alternativa.

Esto es lo que dijo gbacon en su respuesta .

Jakub Narębski
fuente
3
"git reflog show <branch>" funciona bien, muestra muy explícitamente cuándo se creó la rama. Treesh se alimenta de "git show --summary <treesh>"
paxos1977
1
El 'git log -g <branch>' fue el que funcionó para mí: muchos detalles. Necesita estar en la sucursal para usar cualquiera de estos.
Lidia
18

Todavía no estoy seguro del comando git para él, pero creo que puedes encontrarlos en los reflogs.

.git/logs/refs/heads/<yourbranch>

Mis archivos parecen tener una marca de tiempo de Unix en ellos.

Actualización: parece haber una opción para usar el historial de reflog en lugar del historial de confirmación al imprimir los registros:

git log -g

También puede seguir este registro, desde el momento en que creó la rama. git logmuestra la fecha de la confirmación, sin embargo, no la fecha en la que realizó la acción que hizo una entrada en el registro. Todavía no lo he encontrado, excepto al buscar en el registro real en la ruta anterior.

Mike Seplowitz
fuente
12

Prueba esto

  git for-each-ref --format='%(committerdate) %09 %(authorname) %09 %(refname)'
Sireesh Yarlagadda
fuente
3
probablemente necesite %antes(refname)
Vor
1
@Vor hice el cambio
biniam
Pasé esto | cut -c 5- | sort -r |y luego pasé por grep durante el mes, dándome una lista en orden cronológico inverso, más o menos.
Noumenon el
2
@Noumenon: for-each-ref puede ordenar por usted agregando, por ejemplo, --sort='-committerdate'(tenga en cuenta el '-' antes de la fecha de confirmación para el orden cronológico inverso).
Pete
9

Utilizar:

git reflog

para mostrar todo el ciclo de vida de su repositorio en la carpeta actual. El nombre de la rama que aparece por primera vez (de abajo a arriba) es la fuente que se creó.

855a3ce HEAD@{0}: checkout: moving from development to feature-sut-46
855a3ce HEAD@{1}: checkout: moving from feature-sut-46 to development
855a3ce HEAD@{2}: checkout: moving from feature-jira35 to feature-sut-46
535dd9d HEAD@{3}: checkout: moving from feature-sut-46 to feature-jira35
855a3ce HEAD@{4}: checkout: moving from development to feature-sut-46
855a3ce HEAD@{5}: checkout: moving from feature-jira35 to development
535dd9d HEAD@{6}: commit: insert the format for vendor specific brower - screen.css
855a3ce HEAD@{7}: checkout: moving from development to feature-jira35
855a3ce HEAD@{8}: checkout: moving from master to development

Eso significa:

  • El desarrollo de la sucursal se crea (checkout -b) desde el maestro

  • Se crea la función Branch-jira35 (checkout -b) desde el desarrollo

  • La rama branch-jira-sut-46 se crea (checkout -b) a partir del desarrollo

De Nguyen
fuente
2
pero donde estan las fechas? y verás el check-out en cada sucursal muchas veces. ¿Significa esto que solo la PRIMERA aparición de cada rama es su creación?
Motti Shneor
4

Esto es algo que se me ocurrió antes de encontrar este hilo.

git reflog show --date=local --all | sed 's!^.*refs/!refs/!' | grep '/master' | tail -1
git reflog show --date=local --all | sed 's!^.*refs/!refs/!' | grep 'branch:'
Andrew Sohn
fuente
3

Este comando muestra la fecha de creación de la rama devdesdemain

$git reflog show --date=iso dev
$7a2b33d dev@{2012-11-23 13:20:28 -2100}: branch: Created from main
Sazzad Hissain Khan
fuente
"la fecha de creación de la sucursal" ... si es inferior a 90 días. Si se creó más de 90 días, esa información se eliminaría. Como se mencionó anteriormente en stackoverflow.com/a/3748722/6309 .
VonC
@Sazzad Hissain Khan Esto funcionó para nosotros, ya que queríamos proporcionar 'consejos amigables de hoja de trucos' a algunas personas no técnicas que se estaban perdiendo un poco con algunas de las complejidades de Git.
Chris22
2

Si desea obtener los detalles de todas las sucursales

for i in `git branch -r | tail -n +2 `;do git log --reverse $i|grep -A 2 -B 2 `echo $i | awk -F'origin/' '{print $2}'` |head -n 4; done
Anshul Agarwal
fuente
2

Encontré la mejor manera: siempre reviso la última sucursal creada de esta manera

git for-each-ref --sort=-committerdate refs/heads/
usuario838900
fuente
1

Combinado con la respuesta de Andrew Sohn ( https://stackoverflow.com/a/14265207/1929406 )

branchcreated=$(git reflog show --date=format:'%Y-%m-%d %H:%M:%S' --all | sed 's!^.*refs/!refs/!' | grep '/master' | tail -1| cut -d'{' -f 2| cut -d'}' -f 1 | xargs)
echo $branchcreated
kivagant
fuente
1

Esto lo hizo por mí: (10 años después)

git log [--remotes] --no-walk --decorate

Como no hay información almacenada sobre los tiempos de creación de sucursales, lo que hace es mostrar la primera confirmación de cada rama ( --no-walk), que incluye la fecha de la confirmación. Utilizar--remotes para las sucursales remotas u omítalo para las sucursales locales.

Como realizo al menos una confirmación en una rama antes de crear otra, esto me permitió rastrear algunos meses de creaciones de ramas (y función dev-start) para fines de documentación.

fuente: AnoE en stackexchange

Groo el asesino de insectos
fuente
0

sintaxis: git reflog --date=local | grep checkout: | grep ${current_branch} | tail -1

ejemplo: git reflog --date=local | grep checkout: | grep dev-2.19.0 | tail -1

resultado: cc7a3a8ec HEAD@{Wed Apr 29 14:58:50 2020}: checkout: moving from dev-2.18.0 to dev-2.19.0

Jamter
fuente