Git: Primeros Pasos

Crea un repositorio de Git

Empezar un nuevo proyecto

Para poder ofrecer una mejor ejemplificación de los comandos tratados, he decidido crear un repositorio en GitHub con un programa básico de C que simula una taquilla de venta electrónica de billetes para un tren. Con este repositorio pretendo que trabajes y experimentes a lo largo de este curso a medida que vamos viendo los comandos que podemos utilizar con Git.

Por otro lado, vamos a estar trabajando en todo momento desde la terminal y utilizando el sistema operativo Linux, por lo que te recomiendo encarecidamente saber utilizarlo. No hace falta conocer cómo funciona Linux en profundidad, pero al menos sí es importante que sepas crear archivos, crear directorios, moverte por el sistema de archivos y otra serie de comandos básicos. Si todavía no sabes cómo hacer esto, te recomiendo aprender un poco sobre ello antes de seguir leyendo. No te llevará mucho tiempo y la mejora que experimentarás será increíble.

Crear repositorio Git

En primer lugar debes saber transformar un directorio normal en un repositorio de Git completamente funcional para poder almacenar y guardar tu trabajo. Para ello, accede desde la terminal al directorio donde se encuentra tu proyecto y ejecuta el comando git init. En este momento se creará en el directorio de trabajo otro directorio con el nombre .git, el cual va a contener toda la información referente a tu repositorio de trabajo de Git. Gracias a este nuevo directorio .git podrás moverte por el historial de cambios, actualizar tu repositorio local e incluso cargar tus cambios al repositorio remoto. En definitiva, con el comando git init consigues que tu proyecto empiece a utilizar Git.


git clone https://github.com/pgomez-a/ianotes_git.git

Clonar repositorio existente

No obstante, puede darse el caso de que quieras copiar el repositorio remoto de tu proyecto en tu máquina local. Esta acción es lo que se conoce como clonar el repositorio remoto. Para ello, deberás utilizar el comando git clone más la dirección en la que se encuentre dicho repositorio. Esto permite que tengas una copia total del proyecto en tu ordenador. Cualquier cambio realizado solo será visible desde tu ordenador, a no ser que decidas cargar todos tus cambios al repositorio remoto con la ayuda de un comando que veremos más adelante. Además, si nos fijamos en el contenido del directorio clonado, podremos observar que contiene .git, que como veíamos antes contiene toda la información correspondiente con la estructura que Git maneja del proyecto.

Como curiosidad, el comando git clone admite un argumento más referente al nombre que quieras darle al repositorio clonado. Este argumento es opcional y en caso de no ser especificado, el repositorio clonado adquiere el nombre asociado al repositorio remoto.

Cargar los cambios en el repositorio

Cargar datos en el repositorio

Una vez que tenemos nuestro repositorio de Git, ya sea o bien porque lo hemos creado o bien porque hemos clonado el proyecto, tenemos que saber distinguir entre los dos estados en los que se encontrarán los archivos del proyecto a partir de este momento: rastreado y no rastreado.

Que un archivo esté rastreado significa que Git sabe sobre la existencia y estado de dicho archivo. Cuando recién clonamos un repositorio, todos los archivos de este estarán rastreados, dado que todavía no se ha producido ninguna modificación sobre ninguno de los archivos. En el momento en el que un archivo es editado, o incluso si se crea o elimina un archivo, este pasa a ser no rastreado.

Que un archivo no esté rastreado significa que Git no tiene constancia sobre el estado del mismo. Esto implica que el estado del archivo en su última versión no coincide con el estado del archivo en el momento de compararlos. De este modo, a medida que vayamos modificando más archivos, la cantidad de archivos no rastreados irá aumentando. A su vez, podemos decidir qué archivos cargar en Git, los cuales pasarían de ser no rastreados a rastreados.

Comprobar el estado del proyecto

Para saber el estado en el que se encuentra cada uno de los archivos de nuestro proyecto utilizamos el comando git status. Este comando nos muestra la rama sobre la que estamos trabajando y, a continuación, lista todos los archivos que han sido modificados con respecto de la última versión del proyecto. Si ningún archivo ha sido modificado o añadido, git status nos dirá que el proyecto está actualizado. En caso de haber al menos un archivo añadido no rastreado, se mostrará en una lista bajo el título ‘Untracked files’. Para archivos modificados, el mensaje que se muestra por pantalla es ‘Changes not staged for commit’. Bajo este mensaje se mostrarán los archivos que han sido modificados.

git status es un comando que nos ofrece una gran cantidad de información. Sin embargo, puede darse el caso de que únicamente queramos obtener la información más simple que este comando es capaz de ofrecernos. Para ello se utiliza el flag -s o –short. git status -s nos mostrará el estado de los archivos de una forma simplificada y sin comentarios extra.

Rastrear un archivo

Una vez que sabemos que un archivo no ha sido rastreado, podemos hacer que Git lo detecte con el comando git add. El comando git add más el nombre del archivo permite que un archivo no rastreado pase a estar rastreado. De esta forma estamos preparando al archivo para poder ser cargado en el repositorio remoto de Git. De hecho, si utilizamos el comando git status, nos mostrará un listado de los archivos listos para ser cargados en el repositorio remoto bajo el mensaje de ‘Changes to be committed’.

El motivo por el cual git add no carga directamente los cambios en el repositorio remoto es para evitar cargar archivos de forma accidental. Si primero elegimos los archivos a cargar y después se nos muestra un listado de dichos archivos, podemos verificar más fácilmente que los archivos que se pretenden cargar son los indicados.

Si tras utilizar git add para rastrear un archivo se modifica ese mismo archivo, será necesario volver a utilizar git add para rastrear el nuevo cambio. En caso de no hacerse, el archivo se subirá al repositorio remoto sin haber guardado el último cambio realizado tras la ejecución de git add.

Ignorar archivos

Puede haber ocasiones en las que queramos que ciertos archivos de nuestro proyecto no puedan ser subidos al repositorio remoto. Para evitar subir archivos de forma accidental se utiliza el archivo .gitignore. En este archivo especial vamos a poner el nombre de todos aquellos archivos que no queramos que se suban a nuestro proyecto remoto. Así, incluso cuando hagamos un git add del archivo que no queramos subir, Git nos mostrará un aviso de que no puede realizar la acción solicitada.

Por otro lado, Git nos da la oportunidad de utilizar wildcards para hacer referencia a varios archivos que comparten un patrón. En este punto se ve claramente la necesidad de utilizar un .gitignore. Por ejemplo, si tenemos 10 archivos con la extensión .c pero solo queremos subir 9 de ellos, podremos utilizar el comando git add *.c. Este comando rastreará todos los archivos cuya extensión sea .c. Sin embargo, si el archivo que no queremos subir está localizado en el .gitignore, conseguiremos que no sea rastreado por Git.

Del mismo modo, podremos trabajar con patrones dentro del .gitignore. Si queremos prohibir la subida de los archivos cuya extensión sea .a o .o, dentro del .gitignore utilizaremos el wildcard *.[oa]. Así, las reglas utilizadas para escribir un buen .gitignore son:

  • Las líneas en blanco o las que empiezan por # son ignoradas.
  • Un signo de exclamación niega la acción especificada
  • Un / al principio se aplica al directorio actual y no a todos los directorios
  • Un / al final hace referencia a un directorio
  • Los patrones se aplican de forma recursiva, es decir, afectan a todos los directorios.

Analizar cambios

El comando git status nos muestra los archivos que han sido modificados o añadidos con respecto de la versión anterior. Sin embargo, no nos muestra qué cambios han sido realizados. Por ello, para poder comparar los cambios realizados utilizamos el comando git diff. Este comando nos muestra las líneas de nuestro proyecto que han sido modificadas, mostrando tanto la línea antigua como la línea nueva. Todos estos cambios hacen referencia a aquellos que no han sido rastreados, por lo que si hacemos un git add de todo y después utilizamos git diff, el comando no arrojará ningún output.

Para ver los cambios existentes entre los archivos rastreados y la última versión (último commit), se utiliza el flag —staged. Es decir, una vez hecho git add los archivos pasan a estar rastreados pero todavía no forman parte del repositorio remoto. Para poder compararlos se utiliza git status —staged o git status —cached. Así, puede darse el caso de que git diff no arroje ningún output pero git status —staged sí.

Mover un archivo

Para mover un archivo basta con utilizar el comando git mv más el nombre del archivo actual y el nombre del nuevo archivo. Esta acción es igual a utilizar el comando mv, solo que con git mv el cambio se rastrea directamente sin necesidad de utilizar git add.

Realizar commit / Captura del proyecto

Una vez que ya tenemos los cambios rastreados, necesitamos subirlos al repositorio remoto. De este modo, la próxima vez que hagamos un git clone del proyecto nos aseguraremos de tener todos los cambios presentes. Para conseguir esto utilizamos el comando git commit. Este comando abre el editor de texto para que podamos escribir un mensaje con el que guardar nuestro proyecto a la hora de subirlo al repositorio remoto. Si queremos añadir el mensaje desde la propia terminal utilizamos el flag -m más el mensaje entre comillas dobles. Este paso evita que el editor de texto se abra.

Una vez ejecutado, todos los cambios que habían sido rastreados pasan a ser parte de la nueva versión del proyecto. Esta nueva versión tendrá su propio hash y un mensaje con el que poder identificarla del resto de versiones. Como curiosidad, si quieres evitar pasar por la fase de rastreo (git add), puedes utilizar el flag -a con git commit. Al hacer git commit -a, todos los cambios no rastreados y rastreados pasarán a formar parte de la nueva versión del proyecto.

Eliminar un archivo

Para eliminar un archivo de tu repositorio de Git tienes dos opciones. En primer lugar puedes eliminar tu archivo de forma normal y después hacer que el cambio sea rastreado con git add. Por otro lado, si quieres que el archivo se elimine al mismo tiempo que se rastrea el cambio, puedes utilizar git rm más el nombre del archivo en cuestión. Una vez hecho esto, solo tendrás que hacer un commit de los cambios rastreados y el archivo ya no formará parte de tu proyecto.

En caso de que el archivo que quieras eliminar se encuentre en la fase de rastreado, es decir, tras haber echo git add de dicho archivo, tendrás que forzar la eliminación del mismo. Puedes lograr esto con el flag -f, de modo que git rm -f eliminará el archivo sin ninguna excepción.

Si quieres hacer que un cambio rastreado deje de estarlo, deberás utilizar git rm —cached más el nombre del archivo. De este modo, no eliminarás el archivo del repositorio pero sí conseguirás que los cambios realizados no se carguen en el repositorio remoto.

Historial de cambios

Ya hemos visto que con git commit creamos una nueva versión de nuestro proyecto. Con el uso del comando git log podremos acceder a todo el historial de cambios de nuestro proyecto desde el momento en el que fue creado hasta el último commit que se subió. De este modo podremos restablecer una de estas versiones o comparar los cambios que hemos ido realizando a lo largo de todo el desarrollo del proyecto.

Al ejecutar git log obtenemos una lista de todas las versiones del proyecto. Cada versión viene acompañada de una serie de atributos que permiten diferenciarla del resto de versiones. Estos atributos incluyen un hash/identificador, el mensaje del commit, el nombre y el email del autor del cambio y la fecha del commit.

El comando git log incluye también la posibilidad de ser ejecutado con diferentes argumentos. Entre los más importantes y útiles destacamos:

  • git log -p muestra el historial de cambios incluyendo cada uno de los cambios que se han realizado en todas las versiones. Este comando es una mezcla de los comandos git log y git diff.
  • git log -n muestra las últimas n versiones del proyecto.
  • git log –stat se utiliza para incluir estadísticas de cada una de las versiones, como el número de archivos modificados.
  • git log –graph muestra las versiones del proyecto incluyendo un gráfico sobre la estructura de ramas que se ha utilizado en cada versión.

Por último, cabe destacar que podemos elegir el formato en el que git log nos muestra la información. Esto se consigue mediante el uso del comando git log –prety=format:»». Entre las dobles comillas especificaremos dicho formato, pudiendo utilizar los siguientes caracteres especiales:

  • %H hash del commit sin abreviar
  • %h hash del commit abreviado
  • %T hash del árbol sin abreviar
  • %t hash del árbol abreviado
  • %P hashes del padre sin abreviar
  • %p hashes del padre abreviados
  • %an nombre del autor
  • %ae email del autor
  • %ad fecha del commit
  • %ar tiempo transcurrido desde el commit
  • %cn nombre del committer
  • %ce email del committer

Resuelve tus dudas concepto a concepto

Documentación externa

Pro Git Book

Libro oficia de Git escrito por Scott Chacon y Ben Straub disponible de forma gratuita en la página oficial de Git. Este curso se basa en el contenido presente en este libro.

Manual Referencia

Manual oficial de Git para entender y estudiar los diferentes conceptos y comandos que podemos utilizar dentro de Git. Explicación paso a paso sobre cada término.

Videos de Git

Videos explicativos sobre qué es Git, qué es un sistema de control de versiones, cómo utilizar Git, etc. Los videos están disponibles desde la página oficial de Git.

Inspiración

Solo podemos ver poco del futuro, pero lo suficiente para darnos cuenta de que hay mucho que hacer.

— Alan Turing

Todo individuo considera que los límites de su propia visión son los límites del mundo.

— Arthur Schopenhauer

Contacto

pgomez-a@student.42madrid.com

GitHub: pgomez-a
Linkedin: pgomez-a

Anuncio publicitario
A %d blogueros les gusta esto: