Mi guía esencial de GIT – Primera parte


githubCon este post pretendo crear mi propia guía de GIT para poder consultar y tener en un punto todos los comando necesarios que voy utilizando en mi día a día, si también te sirve a ti, pues mejor. Por si no sabes lo que es GIT, unas breves palabras de introducción. GIT viene a ser un sistema de control de versiones distribuidos (DVCS) que está escrito en el lenguaje de programación C, también podríamos decir que GIT es un sistema de archivos (filesystem) con una interface de usuario (VCS). GIT te permite disponer de un control de versiones y la creación de un histórico para el repositorio del código fuente que estás trabajando, además, GIT mantiene un registro de todas las versiones. Por lo tanto es posible volver a cualquier punto del histórico del código fuente registrado.

El flujo de trabajo básico en Git es que primero modificas una serie de ficheros en el directorio de trabajo, después preparas dichos ficheros  añadiendo como una instantánea (SnapShot) en un área de preparación por así decirlo y por último confirmas los cambios dentro del área de preparación y almacena los ficheros de forma permanente en GIT. Si una versión de un fichero está en el directorio GIT, se considera confirmada (committed), si ha sufrido cambios desde el inicio, pero ha sido añadida al área de preparación, está preparada (staged) y finalmente ha habido cambios y no se ha preparado, está modificada (modified).

Arrancamos, pero quizás necesites algo de configuración esencial

Lo primero que hay que hacer cuando te instalas GIT es establecer el nombre de usuario y dirección de correo electrónico. Esto es importante porque en cada commit de GIT utiliza esta información:

# git config –global user.name “Carlos Sánchez Pérez”

# git config –global csanchez@example.com (email real que tengas)

Por ejemplo, si necesitas saber la configuración que tienes, debes usar el comando siguiente:

# git config –list

cuyo resultado puedes obtener alguno parecido a este:

user.name=Carlos Sánchez Pérez
user.email=csanchez@example.com
core.repositoryformatversion=0
core.filemode=true
core.bare=false
core.logallrefupdates=true
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
remote.origin.url=https://carlossanchezp@example.org/example/example-web.git
branch.master.remote=origin
branch.master.merge=refs/heads/master

Si en algún momento necesitas ayuda usando GIT, existen tres formas:
# git help <comando>
# git <comando> –help
# man git-<comando>

Por ejemplo:
# git help config

Cómo obtener un repositorio

Para obtener un repositorio GIT, lo puedes hacer de dos maneras, una es importar un repositorio en un directorio de trabajo local y la segunda clonar un repositorio GIT existente en otro servidor como podría ser GitHub o BitBucket, depende de lo que te guste o las necesidades actuales.

Si arrancamos un proyecto y necesitamos hacer el seguimiento en GIT debemos ir al directorio del proyectos y teclear el comando:

# git init

Nos va ha crear un nuevo subdirectorio llamado .git que contiene todos los archivos de nuestro repositorio, pero con esto no tenemos nada aún bajo seguimiento por así decirlo, hemos arrancado únicamente. Para eso lo que tenemos que hacer por ejemplo es añadir los primeros pasos con:

# git add . o podemos añadir algún tipo de fichero *.rb
# git add README
# git commit -m ‘My first commit version 1.0’

Ahora tenemos un repositorio GIT con nuestros archivos bajo seguimiento, y una confirmación inicial con los commit. Con la opción -m añadimos un mensaje con una breve descripción del lo que incluye el commit hecho, además es mejor que entre los commit que hagas, sean de pequeños cambios cada uno de ellos.

Ahora vamos a clonar un repositorio existente para colaborar con el protocolo https. pero antes ve al directorio raíz donde estás trabajando, ya que con clone crea el nombre del proyecto:

# git clone https://carlossanchezp@example.org/example/example-web.git

# git clone https://carlossanchezp@example.org/example/example-web.git Nuevo_Proyecto (tercer parámetro: nombre de directorio destino si quieres otro)

Los cambios y estados de nuestros archivos

Voy a aclarar los estados en los que puede encontrarse un fichero para controlar la situación y no llevarnos sorpresas. Tenemos un estado bajo seguimiento (tracked), o sin seguimiento (untracked). Un fichero bajo seguimiento es aquel que existía en el último commit realizado; puede estar sin modificación, modificado, o preparado. El fichero que está sin seguimiento, el resto. Por lo tanto, si hemos hecho una clonación de nuestro repositorio, entonces todos los ficheros estarán bajo seguimiento y sin modificaciones.

Para saber qué archivos están en qué estado y en qué rama nos encontramos, tenemos un comando interesante:

# git status

En ocasiones necesitamos que ciertos ficheros no estén incluidos,  no quieras que GIT los incluya automáticamente o muestre como no versionado. Para estos casos nos creamos un archivo llamado .gitignore, en el que incorporaremos los nombres que deseas que sean ignorados.

En ocasiones el comando git status puede parecernos insuficiente para lo que necesitamos saber con la información que nos proporciona, por ejemplo si quiero saber que ha cambiado y no únicamente los modificados, debemos ejecutar el comando git diff que nos muestra exactamente las líneas añadidas y eliminadas y nos ayuda a responder a: ¿qué he cambiado que aún no he preparado?, y ¿qué he preparado y voy a confirmar?

Confirmar nuestros cambios

Para confirmar nuestros cambios debemos ejecutar un nuevo comando:

# git commit  -m “message”

Para un recordatorio todavía más explícito de lo que has modificado, puedes pasar la opción -v. Otra opción interesante es -a que hace que prepare todo fichero en seguimiento antes de la confirmación para obviar, por ejemplo, el comando de git add .

# git commit -v -m “message”

# git commit  -a -m “message”

Eliminar ficheros

Para eliminar un fichero de GIT, hay que eliminarlo de nuestros archivos bajo seguimiento, es decir del área de preparación para después confirmar. Para eso tenemos el comando git rm que se encarga eliminar el fichero de nuestra área y también elimina el archivo del directorio de trabajo. Desaparece entre los archivos sin seguimiento.

# git rm fichero.html

Cuando confirmemos, el fichero “fichero.html” desaparecerá y dejará de estar bajo seguimiento, ahora bien imagina que el fichero ya estaba modificado y estaba en preparación, en ese caso hay que forzar la eliminación con -f.

# git rm -f fichero.html

Puede darse el caso que un fichero lo queramos mantener en nuestro directorio de trabajo, pero necesitamos eliminarlo del área de preparación, es decir, que quiero mantenerlo en mi disco duro, pero no quiero que esté en GIT por las razones que sean o que necesitas incluirlo en .gitignore, un fichero de claves por ejemplo,  un log que ocupa cada vez más espacio enorme, etc. Para hacer esto, usa la opción –cached:

# git rm –cached fichero.html

Renombrar ficheros

Si quieres renombrar un archivo en GIT,  ejecutamos:

# git mv fichero_origen fichero_destino

# git status (ver la salida de los cambios que hemos hecho)

Un histórico de confirmaciones que puede servirnos de mucho

Después de haber hecho unas cuantas confirmaciones, o hemos clonado un repositorio que ya tenía un histórico de confirmaciones, seguro que necesitaremos echar un vistazo hacia atrás en un momento determinado y observar que se ha hecho o confirmar alguna operación, con git log lo tenemos resuelto. Por otro lado también disponemos de algunas opciones como -p si queremos saber las diferencias introducidas en cada confirmación y la opción -n siendo n el número a mostrar por ejemplo -4 para mostrar únicamente las cuatro últimas entradas del histórico:

# git log -p -4

# git log –stat (estadísticas de cada confirmación)

# git log –pretty=format:”%h – %an, %ar : %s” (especificar tu propio formato de salida)

# git log –pretty=online (en una línea)

# git log –since=2.weeks (limitando la salida a dos semanas)

Modificar una confirmación hecha

Uno de los casos que se te puede plantear es querer deshacer cambios cuando confirmas demasiado pronto o se me ha pasado añadir un fichero importante o el mensaje está en español y debe ser en inglés. Para eso tenemos la opción –amend del commit:

# git commit -m “First commit”

# git add newfile

# git commit -ammed

Deshacer una preparación de un fichero

Por ejemplo, hemos modificado dos ficheros y sólo queremos uno de ellos, el otro no, pero por error hemos tecleamos git add * con lo que tenemos preparados a los dos. Para eso necesito ejecutar el siguiente comando:

# git status (nos proporciona alguna pista del HEAD)
# git reset HEAD fichero.rb (nuestro fichero a sacar del área)

Si ahora necesitamos descartar las modificaciones hechas:

# git checkout — file.rb (descarta las modificaciones que he hecho con la perdida claro de las mismas)

En el siguiente post hablaré de las ramas que son muy interesantes para evitar interrupciones o esperas. Mi guía esencial de GIT – Segunda parte

2 comentarios en “Mi guía esencial de GIT – Primera parte

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s