Estados de un proyecto Git
Al trabajar en un proyecto Git existen 3 estados o áreas que están separadas lógicamente una de otra: archivos sin seguimiento, staging y archivos del repositorio. Estos estados conforman el ciclo de vida de un proyecto Git, y el tener una noción de ello ayuda a quienes trabajan en el proyecto a adecuarse a Git.
Al inicio del proyecto, Git no tiene idea de qué archivos van a estar bajo versionado; es decir, no le ha dado seguimiento a ningún archivo y está en espera de que el usuario los agregue. En este punto es conveniente definir cuáles archivos nos interesa proteger con Git y cuáles son innecesarios, demasiado pesados e incluso conflictivos. Ejemplos muy comunes de ésto son los archivos autogenerados, ejecutables y contenido que sabemos de antemano que no va a cambiar.
Git ignore
Git tiene un mecanismo para evitar interrupciones en el flujo de trabajo debido a archivos que no requieren versionado, el cual consiste en declarar en un archivo llamado .gitignore todo lo que no será considerado para el versionado. Puede haber un archivo .gitignore en cada subfolder, o bien, declarar uno solo que sea global al proyecto. Para ello se emplea el uso del formato glob, que es una versión simplificada de expresión regular, muy utilizado en los sistemas tipo Unix. A continuación se muestran algunos ejemplos del uso de .gititgnore
# .gitignore
# Éste es un comentario, sólo para lectura de personas
./database.db # Ignorar el archivo database.db en el mismo directorio que este archivo
.DS_Store # Ignorar todos los archivos .DS_Store en el folder actual incluyendo subfolders
*.pyc # Ignorar todos los archivos que terminen en pyc
!.gitignore # Ignorar todo en este folder y subfolders, excepto este archivo
/build # Ignorar folder build
/app/**/*.log # Ignorar todos los archivos .log en el folder app o cualquier subfolder
*.[ao] # Ignorar archivos que terminen en a, o bien, en o
dummy_*.* # Ignorar todos los archivos que empiecen con dummy_
El ignorar archivos aplica el efecto de que éstos están en una carpeta ajena al proyecto, es decir, fuera de cualquier estado.
Archivos sin seguir (untracked)
Son los archivos que están en el folder del proyecto, pero no han sido integrados al repositorio; es decir, si se borran, Git no los podrá recuperar. Para pasar al estado de preparación se ejecuta:
$ git add <files>
Se puede utilizar el mismo formato que .gitignore para especificar los archivos. Al inicio del ciclo de vida de un repositorio todos los archivos se encuentran en ésta etapa.
Archivos modificados
En ésta fase se encuentran aquellos archivos que ya están en el repositorio, pero se han modificado desde el último commit. Pueden prepararse los cambios para el próximo commit con el comando:
$ git add <files>
O bien, pueden guardarse directamente en el repositorio con:
$ git commit -a
También pueden ser restaurados a como estaban en el commit anterior con:
$ git checkout -- <files>
Archivos preparados (staged)
Estos archivos serán incluidos en el próximo parche (o commit) que se guarde. Para ello, se emplea el siguiente comando:
$ git commit -m "Descripción del cambio realizado"
La opción -m indica que el siguiente texto se utilizará como descripción del cambio, de no indicarse se abre el editor configurado, ya sea para git o para todo el sistema. Se recomienda que dicha descripción sea clara y que se utilicen los verbos en tiempo en presente, no en pasado. Ésto es debido a que el orden puede modificarse.
Para regresar archivos al estado untracked se ejecuta el comando:
$ git reset HEAD <files>
Archivos en el repositorio (commited)
Son aquellos que se encuentran administrados por Git, y por lo tanto pueden ser recuperados a cualquier estado entre el más reciente y la primera vez que se agregaron.
Para ver el estado actual del repositorio se utiliza el comando:
$ git status [-s] [--ignore]
La opción -s imprime una versión simplificada del estado e --ignore incluye a los archivos ignorados. El formato de salida es el siguiente:
X Y archivo
Donde X es el estado en staging e Y el estado del directorio de trabajo, y puede ser uno de los siguientes:
" " : Un espacio en blanco indíca que no hay cambios.
M: Archivo modificado.
A: Recién añadido.
D: Borrado.
R: Renombrado.
C: Copiado.
U: Actualizado, pero que aún requiere ser combinado.
?: Archivo sin seguir.
!: Archivo \/ folder ignorado.