Registrando todo

Antes de avanzar hay que revisar nuestro trabajo. Para ello empleamos log.

$ git log
commit b7bbecf3622b94e79ac5e5ff37e2beae9cfb28f6
Author: [email protected]
Date: Thu Nov 17 16:17:13 2011 -0600

El primer spec funciona, y muy bien

commit 953de57c91e88ba5641def12b17ba66041971add
Author: [email protected]
Date: Thu Nov 17 15:54:55 2011 -0600

Especificaciones para config()

commit 14d857892b6f97be52ef6413d653d937eca5290b
Author: [email protected]
Date: Fri Nov 11 12:31:25 2011 -0600

Primer commit; agregue la estructura de archivos

Si aún no recordamos lo último que hicimos la mejor manera de averiguarlo es revisando los cambios por cada commit hecho.

El buen hábito

La utilidad de log es tan solo una vista rápida de los cambios, si no escribimos mensajes de commit que hagan sentido pierde su finalidad y tendremos que buscar otras alternativas. Mi rutina comienza por revisar el repo, luego la rama donde me encuentro, la lista de cambios, los cambios individuales y finalmente las diferencias. Todo un ritual.

$ git status
# On branch develop
nothing to commit (working directory clean)

$ git branch
* develop
master

$ git log
...

Tampoco hay que ser tan estricto, nadie tiene tan mala memoria como yo.

Lo siento git pero, ¿Qué acabo de hacer?

Si deseamos observar los últimos cambios registrados en el commit mas reciente debemos usar show sin argumentos.

...
$ git show

commit b7bbecf3622b94e79ac5e5ff37e2beae9cfb28f6
Author: [email protected]
Date: Thu Nov 17 16:17:13 2011 -0600

El primer spec funciona, y muy bien

diff --git a/include/funciones.php b/include/funciones.php
index efea0e2..438a62c 100644
--- a/include/funciones.php
+++ b/include/funciones.php
@@ -12,3 +12,30 @@ config(array('clave' => 'valor'));
config(function ($t) {
$t->clave = 'valor';
});
+
+
+/* Contenedor estático de configuraciones */
+
+function config($key = NULL, $val = NULL) {
+ static $bag = array();
+
+ if (func_num_args() === 0) {
+ // Si no hay argumentos devolvemos la configruación
+ return $bag;
+ } elseif (is_string($key)) {
+ if (func_num_args() === 1) {
+ // Si solo hay un argumento devolvemos la opción (getter)
+ return isset($bag[$key]) ? $bag[$key] : NULL;
+ } else {
+ // Si hay dos argumentos asignamos un único valor (setter)
+ $bag[$key] = $val;
+ }
+ }
+
+ // TODO: implementar los specs restantes
+}
+
+
+/* Pruebas */
+
+print_r(config());

La herramienta show puede mostrarnos cualquier cambio hecho, que en realidad es la diferencia del commit especificado contra el anterior. Si deseamos ver la diferencia en otro punto del historial debemos especificar también el hash del commit que buscamos.

$ git show 953de57
commit 953de57c91e88ba5641def12b17ba66041971add
Author: [email protected]
Date: Thu Nov 17 15:54:55 2011 -0600

Especificaciones para config()

diff --git a/include/funciones.php b/include/funciones.php
index 8b13789..efea0e2 100644
--- a/include/funciones.php
+++ b/include/funciones.php
@@ -1 +1,14 @@
+<?php

+/* Especificaciones */
+
+# asignación sencilla
+config('clave', 'valor');
+
+# asignación múltiple
+config(array('clave' => 'valor'));
+
+# asignación múltiple (fancy)
+config(function ($t) {
+ $t->clave = 'valor';
+});

Observamos precisamente lo que hicimos antes, tan solo las especificaciones.

Las diferencias marcan el cambio

Bien, la utilidad de diferencia es significativamente crucial al momento de hacer commit. Nos detenemos en un punto después de programar intensivamente aquella característica que hará increíble nuestro software pero de pronto no recordamos lo que hemos hecho… ¿les ha pasado algo igual?

En nuestro archivo include/funciones.php tenemos un error de ortografía, nada trivial. Así que simplemente lo corregimos y revisamos nuestros pasos con diff.

$ git diff
diff --git a/include/funciones.php b/include/funciones.php
index 438a62c..cee6be7 100644
--- a/include/funciones.php
+++ b/include/funciones.php
@@ -20,7 +20,7 @@ function config($key = NULL, $val = NULL) {
static $bag = array();

if (func_num_args() === 0) {
- // Si no hay argumentos devolvemos la configruación
+ // Si no hay argumentos devolvemos la configuración
return $bag;
} elseif (is_string($key)) {
if (func_num_args() === 1) {

Con esto ya nos damos una idea de lo que sucedió, así que simplemente lo indicamos en nuestro mensaje de commit y guardamos los cambios para conservar la referencia de que tan malos solos en gramática.

$ git commit -am "Error ortografico hombre, tu tranqui"
[develop d4ad04e] Error ortografico hombre, tu tranqui
1 files changed, 1 insertions(+), 1 deletions(-)

Al igual que show, la utilidad diff acepta distintos tipos de argumentos. Siempre podremos comparar un commit contra cualquier otro sin importar si son consecutivos o no. ¡Haz la prueba!

$ git diff 14d8578 b7bbecf
...

Resumen

  • Cada commit nos abre la posibilidad de revisar dicho cambio cuando se nos
    de la gana, al inspeccionar un bug, analizar las mejoras del software, calcular el tiempo de trabajo invertido, etc.
  • Revisar nuestros commits nos permite conocer mejor el software que desarrollamos, ayuda a reflexionar sobre la calidad del mismo y también a vislumbrar el rumbo de nuestros proyectos entre otras cosas.
  • Un registro de cambios eficiente se fundamenta no solo en los cambios de código, sino también en los humanos que revisan el código.

De verdad que es genial leer código bien desarrollado. O bien explicado.

No por nada GitHub es considerado, eso pienso, una representación colectiva de arte moderno.

Repositorio: Mi libreria