miércoles, 29 de agosto de 2012

Un primer vistazo a Git

De la teoría y esas cosas

Git es un administrador de versiones simple, elegante, y extremadamente flexible, lo que puede resultar difícil de manejar o de aprender (Mejor dicho, de dominar). Pero quien en estos tiempos tiene tiempo para querer una vida fácil.

Git es un control de versiones distribuido, lo que significa en palabras simples: Ya no es necesario tener un servidor como en el caso de CVS o SVN, si no que ahora puedes tener tu control de versiones en tu maquina y posterior mente pasar todo esos cambios a un servidor central. Pero como diablos hacemos eso? como es que ahora puedo tener mi repositorio en mi maquina y así?

De los install y otras maravillas

Si usas windows, te recomiendo que bajes el ejecutable desde la pagina de git: dale aquí, si usas linux, existen paquetes precompilados para la mayoría de las distribuciones, por lo que ya no tendras que bajarte las fuentes y pasarte toda la noche peleándote con el make y gcc, así que abran sus consolas, sean todos poderosos (o sea, sean root) y dejen que su gestor de paquetes haga magia.

Fedora: # yum install git
ubuntu: apt-get install git-core
ArchLinux: # pagman -s git
Solais:# pkg install developer/versioning/git

En dado caso que no exista un precompilado para su linux o unix, descargen en source y hagan lo siguiente: 

# tar -zxf git-.tar.gz
# cd git-
# make prefix=/usr/local all
# make prefix=/usr/local install
Opcional: 
# make prefix=/usr/local clear

si quieren un cliente grafico, les recomiendo darle click aquí y bajar el que mas les acomode según su OS y perversiones personales.

Git es divertido

Para su desgracia, crear un repositorio es cosa fácil, por lo que las excusas quedan para CVS, mercury y otros. Pueden hacerlo con la GUI de su preferencia, por lo mientras, lo haremos de la forma artesanal (O sea, a manita desde la terminal.)

No es necesario que sean root para esto, git puede ser usado para todo usuario mortal del sistema.

Antes que nada, es importante que configuren git, eso es bueno para no ser el developer anónimo y sepamos a quien torturar en caso de subir bugs y demas cosas raras. Para ello hagan lo siguiente:

Díganle a git quien eres y dale un correo para futuros reclamos:

$ git config --global user.name "Sugizo"
$ git config --global user.email "sugi.sugi@sugimail.com"

Git también te permite indicarle cual es tu editor de confianza, como nano, vi, emacs etc, esto es opcional, pero si quieres hacerlo, estaría genial: 

$ git config --global core.editor vim

Si quieres ver tu configuración global, sólo teclea el siguiente comando:

$ git config --list
ó
$ vim ~/.gitconfig

Recuerda algo importante, si tienes duda de algún comando, git tiene un help y un man para esos casos.

$ git help
usage: git [--version] [--exec-path[=]] [--html-path] [--man-path] [--info-path]
           [-p|--paginate|--no-pager] [--no-replace-objects] [--bare]
           [--git-dir=] [--work-tree=] [--namespace=]
           [-c name=value] [--help]
            []

The most commonly used git commands are:
   add        Add file contents to the index
   bisect     Find by binary search the change that introduced a bug
   branch     List, create, or delete branches
   checkout   Checkout a branch or paths to the working tree
   clone      Clone a repository into a new directory
   commit     Record changes to the repository
   diff       Show changes between commits, commit and working tree, etc
   fetch      Download objects and refs from another repository
   grep       Print lines matching a pattern
   init       Create an empty git repository or reinitialize an existing one
   log        Show commit logs
   merge      Join two or more development histories together
   mv         Move or rename a file, a directory, or a symlink
   pull       Fetch from and merge with another repository or a local branch
   push       Update remote refs along with associated objects
   rebase     Forward-port local commits to the updated upstream head
   reset      Reset current HEAD to the specified state
   rm         Remove files from the working tree and from the index
   show       Show various types of objects
   status     Show the working tree status
   tag        Create, list, delete or verify a tag object signed with GPG

See 'git help ' for more information on a specific command.


Del init, add y otras maravillas

Antes, para crear un repositorio tenias que sacrificar una cabra a media noche y con luna llena. Pero ahora, invocar al demonio es cosa de un par de comandos simples: 

$ cd miProyecto
$ git init

Esto te va a crear una carpeta oculta .git donde tendrás una estructura parecida a esta

.git/
|-- branches
|-- COMMIT_EDITMSG
|-- config
|-- description
|-- HEAD
|-- hooks
|   |-- applypatch-msg.sample
|   |-- commit-msg.sample
|   |-- post-update.sample
|   |-- pre-applypatch.sample
|   |-- pre-commit.sample
|   |-- prepare-commit-msg.sample
|   |-- pre-rebase.sample
|   `-- update.sample
|-- index
|-- info
|   `-- exclude
|-- logs
|   |-- HEAD
|   `-- refs
|       |-- heads
|       |   `-- master
|       `-- remotes
|           `-- origin
|               `-- master


Es recomendable que hagas un primer commit a tu repo, ya sea que tengas código o puedes agregar un simple README, da igual, la cosa es que sepas como se hace.

$ git add *.java
$ git commit -m "agregado algo al repo feliz"

El -m indica que es necesario un mensaje para identificar al commit que estas subiendo, es recomendable que ese mensaje sea la descripción de lo que subes, ya sea una nueva funcion, una modificación o una buena excusa para decir que corre con problemas y tiene muchos bugs y que es mejor no ejecutar para no borrar toda la base de datos, digo, por si las dudas, mejor que este bien claro. XD

Vieron, no fue cosa del otro mundo.

De los ejércitos imperiales y las guerras clon.

Pero que pasa si ya hay un repositorio en un server o en github y yo quiero descargarlo en mi maquina para poder modificarlo a cuchillo cincel y martillo??

Bueno, para estos casos, git es igual de amable y flexible, y no es necesario mas que el comando clon para poder clonar el repositorio a nuestra compu para poder trabajar.

git clone https://github.com/sugisugi/unProyecto.git []

En dado caso de que ustedes no especifiquen una carpeta, git creara una carpeta con el nombre del proyecto.

Por último y no menos importante. Supongamos que ya hicimos muchos commits en nuestro git local y todo bien padre, pero tenemos un github al cual quieremos subir todo el desmadre que hicimos en nuestra computadora, pero como demonios invoco a la fuerza para que haga tan noble labor sin necesidad de llamar al lado obscuro?

No necesitas mas que decirle al git de tu proyecto cual es el repositorio remoto al cual conectaras tu master:

$ git remote add origin https://github.com/sugisugi/unProyecto.git
Y para subir tus cambios del local al github, usa el parámetro push
$ git push -u origin master
te pedirá el usuario y el password.

Y con esto, ustedes ya pueden jugar con git felizmente toda la noche. En un post posterior explicare como hacer algunas funciones un poco mas avanzadas. Es recomendable que se den un tiempo para leer la documentación oficial para que sepan mas sobre como funciona un control de versiones y como git hace todo su trabajo como las ramas, los tags y otras maravillas que esta herramienta les puede ofrecer. 

Puedes hacer todo esto con la GUI o con el plugin para ti IDE de confianza. Si eres usuario de windows, no tienes excusa, git te instala un emulador de bash con los comando básicos de linux y los comandos de git para que puedas replicar los vistos aquí sin ningún problema.

Con amor, Sugizo.