Los branches son un tipo de referencia, pero el simple hecho de estar en "branches" los transforma en cabezas de las ramas. Así:
* (A) * (C,HEAD)
| |
* * (B) *
| | |
* *------´
\ /
*
|
*
Siendo los asteriscos los commits, el branch A estaría apuntado por branches/A, el branch B, por branches/B, y el branch C, por branches/C y por HEAD. Estar apuntado por HEAD significa que es el commit sobre el que estamos trabajando.
Cuando safa-rev-log quiere leer todas las ramas, simplemente verifica las referencias existentes en branches/, y con referencias me refiero a archivos que simplemente tienen un nombre dentro.
Los TAGS no son referencias solamente, son objetos más completos. Contienen una referencia al commit al que pertenecen, pero también tienen comentarios, pueden tener firmas criptográficas para validar el commit, etcétera. Son una pequeña pieza de información que etiqueta a un commit y se leen de forma diferente al resto de las referencias, que normalmente serán archivos de una sola línea. Pero sin importar si es un tag, un ref simple como HEAD, o un branch, cualquier referencia es abstraída como tal por safa-resolve-ref.
Saludos
--
Dario