Como usar GIT +
Seguro que muchos de ustedes han usado o usan alguna herramienta de versionamiento como GIT, Mercurial, Subversion u otras herramientas de versionamiento, particularmente solo he tenido la experiencia de usar Subversion y GIT. Si desean ver una comparación donde obviamente tiene una opinión a favor de GIT vean esta página http://whygitisbetterthanx.com/, por mi experiencia creo que definitivamente GIT es superior que Subversion por:
- GIT no es centralizado como Subversion, puede uno tener un repositorio centralizado pero permite un funcionamiento mas al estilo peer to peer
- GIT es mucho mas rápido que Subversion, no les puedo decir cuanto mas rápido es pero les aseguro que la diferencia es abismal
- Es mucho mas fácil crear branches (ramas) de un proyecto en GIT
Bueno existen muchas razones por las cuales prefiero a GIT que Subversion pero comencemos el tutor, debo recalcar que no voy a enseñar como instalar GIT, existe una gran cantidad de tutores para eso.
Iniciando un proyecto en GIT
para poder inciar un proyecto comenzaremos con un proyecto vacío, primero creen un carpeta con el nombre proyecto (en caso de que quieran crear un proyecto con rails no es necesario crear la carpeta proyecto solo ejecutando el comando rails proyecto)
mkdir proyecto
ahora deben ingresar a la carpeta cd proyecto y ejecutar el siguiente comando
git init
Lo cual inicializa GIT creando una carpeta .git, ahora deben crear un archivo que tenga algún contenido ya que GIT no es muy bueno manejando archivos vacíos, creen el archivo uno.txt y escriban cualquier contenido. Antes de realizar nuestro primer commit con GIT les recomiendo crear dentro de la carpeta proyecto que creamos el archivo .gitignore que es un archivo de texto que nos servirá para ignorar todo los que no queremos comitar, osea que no versionara los archivos que no queramos pero los mismos podrán residir dentro de nuestro proyecto, abran el archivo .gitignore con un editor y aumenten las siguientes líneas
*.log tmp/* archivo.txt
Lo que quiero decir es que cuando guardemos no almacenaremos los archivos que terminen con la extensión .log, todos los archivos de la carpeta tmp y finalmente el archivo.txt ahora adicionemos como primer commit este archivo (.gitignore), (Nota, todos los comandos los ejecutamos dentro la carpeta proyecto y no dentro de alguna subcarpeta del mismo)
git-add .gitignore git-status
Lo primero que hicimos fue adicionar el archivo .gitignore para versionarlo, luego si ejecutamos el comando git-status nos muestra el estado actual de nuestro repositorio así:
# On branch master # # Initial commit # # Changes to be committed: # (use "git rm --cached ..." to unstage) # # new file: .gitignore # # Untracked files: # (use "git add ..." to include in what will be committed) # # uno.txt
Ahora tenemos que adicionar todos los archivos que queremos versionar, yo se que seria muy tedioso hacerlo uno por uno pero en este caso lo que hacemos es ejecutar los siguientes comandos
git-add . git-commit -m "Primer commit"
Les mostrara un mensaje similar a este
Created initial commit c31fbbc: Primer commit 2 files changed, 5 insertions(+), 0 deletions(-) create mode 100644 .gitignore create mode 100644 uno.txt
Lo que hemos hecho es adicionar todos los archivos con git-add . el punto (.) indica que se adicionan todos los archivos, claro que son excluidos todos los que indicamos en el archivo .gitignore, y luego realizamos nuestro primer git-commit -m “Primer commit” commit con el mensaje “Primer commit”, hasta ahora todo es muy sencillo como ven y cada ves que hagan un commit todo se guarda en un log que indica las versiones, ahora adicionemos un archivo que se llame prueba.txt con algo de texto y hagamos nuestro segundo commit
git-add . git-commit -m "Adición de prueba.txt"
Ahora realicemos modificaciones a los archivos prueba.txt y uno.txt y hacemos un commit
git-commit -a -m "Tercer commit"
Esto nos permite realizar el commit si solo hemos modificado archivos y no hemos adicionado ningun nuevo archivo evitando ejecutar el comando git-add ., pero ahora que tal si queremos regresar al punto anterior, osea al segundo commit, para esto es necesarios aprender que son los branches (en muchas ocasiones realizamos cambios que puede que no sirven a nuestra aplicación y quisieramos regresar al pasado y en caso de que no hayamos hecho una copia anterior de nuestra aplicación esto se hace imposible, esta es una de las razones principales de versionar el código de una aplicación)
Branches (Ramas)
Las ramas son como copias del proyecto, en las cuales podemos probar cambios. Hasta ahora hemos trabajado sin branches, en el master branch, si uno trabaja con GIT no hay que trabajar en el master branch, siempre se debe crear un branch para trabajar y después unirlo con el branch que queremos, para este caso lo que haremos es crear un branch para poder regresar al segundo commit con el mensaje “Adición de prueba.txt”, lo que hacemos es primero hacer un git-log, lo cual nos retorna:
commit e5d71fb967c75cb93c2989dec4ac6a3272bcc250
Author: Boris Barroso
Date: Fri Feb 27 11:41:46 2009 -0400
Tercer commit
commit d6947fe4e4fe33524ac97c00bacd217b49fbc2b1
Author: Boris Barroso
Date: Fri Feb 27 11:25:55 2009 -0400
Adición de prueba.txt
commit c31fbbce2c30147a7d9db82712ab545146c52d64
Author: Boris Barroso
Date: Fri Feb 27 10:32:31 2009 -0400
Primer commit
donde commit tiene el id del commit que realizaron, Author el autor que realizo el commit y Date la fecha que se realizo el commit y al final muestra el mensaje que ingresamos en ese commit, como pueden ver muestra en orden descendente por fecha, ahora lo que queremos es ir al commit “Adición de preba.txt”, para ello copiamos el id del commit y ejecutamos
git-checkout -b atras d6947fe4e4fe33524ac97c00bacd217b49fbc2b1
Nos mostrara un mensaje que indica que estamos ahora en el branch atras, y ahora estamos en el pasado cuando hicimos nuestro segundo commit. Para poder comparar primero verifiquen de que esten en el branch atras con git-branch y luego vean el contenido de sus archivos, veran que es justo lo que se comito en el segundo commit, ahora para poder ver que está en el master hagan git-checkout master, lo cual nos cambia a la rama principal o tronco y revisemos los archivos ahora, como veran estan las últimas versiones de los archivos, ahora escribamos git-chekout atras, y volvemos a la rama atras, ahora quiero que creen una rama, escriban git-checkout otro-atras, lo que han creado ahora es una subrama que parte desde la rama atras, vean el contenido es igual al branch atras, lo que uno hace cuando crea una rama es crear una copia del proyecto que es reconocida por GIT y ahí podemos hacer los cambios, en caso de que queramos volver hacia atras en el tiempo es necesario crear un branch con el id del commit al cual queremos ir.
Trabajando con ramas
Ahora que sabemos como ir al pasado y crear ramas, como debemos trabajar???, bueno la razón es tener una versión lo mas estable de nuestro código en el master branch y crear una rama cada ves que hagamos modificaciones o añadamos nuevas características, esta es una buena práctica, junto con el uso de algún tipo de herramienta para control de errores (issue tracking), pero veamos como podemos hacer nuestras modificaciones, primero vayan al la rama principal al master git-checkout master, una ves ahi hangan git-checkout -b nuevo y hagan modificaciones a los archivos, cuando hayan terminado de hacer las modificaciones ejecuten
git-add . git-commit -m "Modificaciones en nuevo"
Hasta este punto habremos guardado las modificaciones y es probable de que estemos seguros de que las modificaciones son correctas en el branch nuevo, entonces cambiamos al master branch git-checkout master y ejecutamos el siguiente comando
git-merge nuevo
Lo que seguro que les mostrara un mensaje similar a este
Updating 8cb8557..cc515cd Fast forward otro.txt | 2 ++ prueba.txt | 1 + uno.txt | 1 + 3 files changed, 4 insertions(+), 0 deletions(-)
Lo que sucedió es de que unimos el código de la rama nuevo con el código del master branch y ahora nuestro master branch está actualizado, por ahora el tutor nos permite trabajar en un ambiente local, pero no en un ambiente compartido, eso lo mostraré en un próximo tutor donde mostrare gitosis una herramienta para poder trabajar en un ambiente con varios usuarios.
Estimado Boris, muy bueno tu tutorial, quisiera hacerte unas preguntas:
Con Subversion tuve problemas al subir documentos binarios, no se como GIT maneja ese asunto, quisiera subir documentos (doc, xls, etc, etc).
No se si tambien puedo manejar versiones de dichos documentos?
Como maneja el repositorio, vi que subversion crece demasiado cuando tienes mucho movimiento.
Gracias, suerte.
Boris otra pregunta… Algun cliente recomendable para GIT?
Tanto en windows como linux? o si hay en mac?
no me molestaria manejarlo con la linea de comandos, subversion la manejo asi, pero tengo gente trabajando aqui que no le da a eso.
Hola Eddy en cuanto a manejo de archivos binarios, no existe forma de versionarlos ya que cuando cambian, cambia toda el contenido, no pasa asi en archivos txt o de codigo fuente, asi que igual que en SVN consumen tu disco en cada commit, esto a mi entender.
Clientes graficos hay uno que se pinta bien en windows es Tortoise GIT http://code.google.com/p/tortoisegit/ que es igual a su similar para SVN.
Bueno Eddy no hice la prueba con el versinamiento de archivos como esxcel o Word y creo que para eso es mejor usar el control de cambio que tienen este tipo de programas, seguro de que GIT va a reconocer un cambio y guardarlo. Con respecto al cliente gráfico el único que use fue un plugin de Netbeans pero que ofrece muy pocas caracteristicas.
Saludos
Para poder descargar un excelente tutor de git haganlo de aqui.
http://edgyu.excess.org/git-tutorial/2008-07-09/intro-to-git.pdf
Hi, nice posts there
hold responsible’s concerning the gripping advice
hola, disculpa pero te voy a hacer una pregunta muy tonta, uso rails y estaba buscando descargar el plugin de restul-authentication, pero a traves de protocolo http siempre me tiraba error que ese plugin no se encontraba, probe con git y lo descargo bien:
git clone git://github.com/technoweenie/restful-authentication.git vendor/plugins/restful-authentication
el detalle es que no se ahora que hacer..esto queda en una carpeta y tengo que mover el archivo?..ya lo puedo usar directment dentro de rails?…disculpa la pregunta tonta, gracias
Bueno lo que te recomiendo para que no te compliques la vida es instalar la gema de resful_authentication
http://rubygems.org/gems/restful_authentication
gem install gemcutter
gem install restful_authentication