martes, 24 de julio de 2012

git

Git, es un increíble software creado nada mas y nada menos que por el mismísimo Linus Torvals. Si esta primera oración no te convence, pasemos a la explicación formal.

Git es un programa de control de versiones. Aveces; sobre todo los programadores; van generando código y modificando sus aplicaciones, para bien o para mal. Si tienes la costumbre de ir haciendo copias de tu código antes de trabajar, ya tiene tu mente lista para git y veras que es la herramienta que siempre has soñado.

Yo por mi parte no programo pero me muy util para las configuraciones. Mis carpetas home y etc tienen un repo git. También me creo escritor y lo uso para mis porquerías. En muchas ocaciones he querido retroceder la historia porque no me a gustado un matiz y git es muy útil como verán pronto.

Para no volvernos locos con la configuracion, hagamos un sencilla. Creamos un fichero en nuestro home con el nombre ~/.gitconfig y le ponemos esto:


[user]
name = Tunombre
email = tudireccion@dominio.tld

[alias]
co = checkout
cm = commit
st = status
br = branch
hist = log --pretty=format:\"%h %ad | %s%d [%an]\" --graph --date=short

[color]
status = auto
branch = auto
diff = auto
interactive = auto

La linea user es vital. Las demás son opcionales. El caso de los alias noten el alias "hist". Con estamos listo para irle a arriba a la caliente.

Primero y principioso: Crear el repositorio git.

:~$ git init

Eso nos creara en el directorio que lo ejecutamos, todo un carreton de
cosas en un directorio nombrado: .git/ es decir, oculto y ente
directorio. Dicho directorio no nos interesa en lo absoluto.

Para ver a git en accion. Podemos probar un ejemplo sencillo.

:~$ echo "una linea" > fichero.txt
:~$ git add fichero.txt

Aparentemente no paso nada. Pero si paso. Git está pendiente a todos
nuestros cambios continuamente. En este momento le dijismos que añada y
vigile el fichero fichero.txt. Ahora volvemos a escribir en el fichero.

:~$ echo "otra linea" >> fichero.txt

Nuestor fichero esta ahora así:

:~$ cat fichero.txt
una linea
otra linea

Entonces veamos que dicen git al respecto.

:~$ git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
#
#       new file:   fichero.txt
#
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   fichero.txt
#

Dice que fichero.txt ha sido modificado. Bueno pues nada, le diremos a
git que esos cambios queremos almacenarlos. Simplemente esa sera nuestra
primera version del archivo.

:~$ git commit

Ahi nos tirara a un editor de texto para agregar una linea con la descripción del camio. Pongamosle a esa linea "mi primer cambio". Al salvar y cerrar, los cambios habrán sido conciliados con el repositorio.

[master (root-commit) e0070b3] mi primer cambio
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 fichero.txt

Dique que la versio se llama e0070b3, que un fichero ha sido cambiado, con una linea insertada y cero borradas. Esto puede verse así.

:~$ git hist
* e0070b3 2012-07-23 | mi primer cambio (HEAD, master) [lazaro]

Ahi tenemos lo que acabamos de hacer. Pero sigamos cacharreando.

:~$ echo "esta linea no me gusta" >> fichero.txt
:~$ git add fichero.txt
:~$ git commit -a -m "meti la pata"
[master 50c33c2] meti la pata
 1 files changed, 2 insertions(+), 0 deletions(-)


Al usar el parametro "-m" git No nos mostrara el editor de texto, por el contrario, insertara los cambios directo con el texto entrecomillado. La "-a" es para que todos los ficheros añadidos se concilien. Ahora veamos que situación tenemos...

:~$ git hist
* 50c33c2 2012-07-23 | meti la pata (HEAD, master) [lazaro]
* e0070b3 2012-07-23 | mi primer cambio [lazaro]

Ahora tenemos dos versiones. Note que hay una que dice HEAD y master entre paréntesis. Esto se debe a que master es nuestro branch, algo así como la distribución actual, una señal que dice "este punto es estable"
o "hasta aqui llega una version lista"

Por otra parte, tenemos un "HEAD". Eso nos indica en donde estamos parados. Actualmente estamos en 50c33c2.

Digamos que queremos virar para la versio anterior, porque los nuevos cambios no nos gustaron. Eso lo hacemos así:

:~$ git checkout e0070b3
Note: checking out 'e0070b3'.


You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.


If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:


  git checkout -b new_branch_name


HEAD is now at e0070b3... mi primer cambio

Dice que ahora el HEAD esta en mi primer cambio. Veamos:

:~$ git hist
* e0070b3 2012-07-23 | mi primer cambio (HEAD) [lazaro]

En efecto, viramos para e0070b3. Miren:

:~$ cat fichero.txt
una linea

Tal y como los conciliamos la primera vez. Bueno pero... y la segunda linea? Se perdio?

:~$ git hist
* e0070b3 2012-07-23 | mi primer cambio (HEAD) [lazaro]

OH! DIOS MIO, no tengo la version anterior! Eso es una gran porqueria en mi opinón, pero no se preocupen ahí está, solo que no se ve. Solo es cuestion de volver de donde vinimos. Pero antes de irnos. Marcaremos esta versión porque el numero es muy complicado de recordar.

:~$ git tag 0.1

Ahora vallamos de regreso al futuro a buscar la segunda linea.

:~$  git checkout master
Previous HEAD position was e0070b3... mi primer cambio
Switched to branch 'master'

:~$ cat fichero.txt
una linea
otra linea
esta linea no me gusta

Copiamos la segunda linea (hagase la idea que es una funcion de 40lineas) y la llevamos a nuestra versión que mas nos gusta; la que habíamos etiquetado como 0.1. Con la linea copiada podemos volver.

:~$ git co 0.1
Note: checking out '0.1'.


You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.


If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:


git checkout -b new_branch_name


HEAD is now at e0070b3... mi primer cambio

Bueno usamos el comando "co" pero no es mas que un alias que le declaramos a checkout en el fichero .gitconf .Ahora que estamos como queremos, hagamos nuestra valiosa linea.

:~$ echo "otra linea" >> fichero.txt

y creamos una nueva version

:~$ cat fichero.txt
una linea
otra linea
:~$ git add fichero.txt
:~$ git cm -a -m "primera version estable"
:~$ git tag 1.0

Ahora que esta lieta la version 1.0 de nuestro software. Podemos crear un branch con el nombre.

:~$ git branch uno_punto_cero
:~$ git co uno_punto_cero

Ya estamos con la vesion catual en el branch uno_punto_cero, podemos seguir creando a partir de aquí, seguros que de que uno_punto_cero es nuestra ultima versión estable. Cuando querramos darle nuestro software a alguien, solo tenemos que empaquetar el ultimo que funciono.

:~$ git archive -o paquete_verion-1.zip

Y no creara un fichero .zip con el contenido de los fichero en el branch estable, sin importar en que metedura de pata andemos en este momento.

Con esto ya vimos mas menos la dinamica base. En proximas entradas veremos este negocio de empujar y alar repos. Git tiene muchas herramientas, si es amante de diff, encontrara una potente herramienta
en git.

No hay comentarios:

Publicar un comentario

Si vas a decir groserias, aclara el significado para los que no somos de tu mismo país.