GIT: Fundamentos

  • Para explicar los fundamentos de git vamos a crear una carpeta dentro del servidor web, con el nombre «primer_proyecto_git» y vamos a ingresar a ella desde la terminal.
mkdir /var/www/html/primer_proyecto_git
cd /var/www/html/primer_proyecto_git

Iniciando un repositorio en un nuevo directorio

  • Si va a crear un nuevo control de versiones sobre un nuevo proyecto (directorio vacío) debe utilizar el comando: «git init». Esto crea una carpeta oculta «.git» con todos los archivos necesarios del repositorio.
git init
  • RESULTADO:
  • A nivel de directorio lo que crea es una carpeta oculta «.git» que es la encargada de llevar el control de versiones de los archivos
Initialized empty Git repository in /var/www/html/primer_proyecto_git/.git/

Clonando un repositorio existente

  • Si lo que desea es obtener un proyecto ya existente lo debe clonar a través del comando «git clone». Esto descarga todos los datos del proyecto que están en el servidor, de hecho si el disco del servidor se corrompe puedes usar cualquier clon de los clientes para restaurarlo.
  • Para este caso vamos clonar el proyecto libgit2 desde github e insertarlo en un nuevo directorio:
mkdir /var/www/html/segundo_proyecto_git
cd /var/www/html/segundo_proyecto_git
git clone https://github.com/libgit2/libgit2
  • Si queremos crear un directorio de destino de una vez podríamos haber hecho esto que crea la carpeta de una vez:
git clone https://github.com/libgit2/libgit2 /var/www/html/tercer_proyecto_git
  • En cualquiera de los dos casos git descarga toda la información del proyecto de forma local, por lo que cuenta con todas las versiones del proyecto de forma local.

Revisando el estado de los archivos

  • El comando que le permite ver el estado de los archivos del proyecto es «git status»
git status
  • Si ejecutamos el comando dentro de «primer_proyecto_git» lo que va ver es:
cd /var/www/html/primer_proyecto_git/
git status
  • RESULTADO:
En la rama master

No commits yet

nada que hacer (crear/copiar archivos y utilice «git add» para continuar)
  • Indicando que no tiene ningún archivo, modificado ni rastreado
  • Si crea un nuevo archivo por ejemplo «README» y ejecuta el comando «git status» verás que git identifica esto.
touch README
git status
  • RESULTADO:
En la rama master

No commits yet

Archivos sin seguimiento:
 (use «git add <archivo>...» para incluir en lo que se ha de confirmar)

 README

no se ha agregado nada al commit pero existen archivos sin seguimiento (use «git add» para darle seguimiento)
  • Donde nos indica que existen archivos a los cuales no se les esta dando seguimiento.

Rastrear Archivos Nuevos

  • Para poder comenzar a rastrear y darle seguimiento a un archivo existe el comando «git add», ya que git no le va a dar el seguimiento si usted no se lo indica explícitamente.
git add README
  • Ahora si vuelve a solicitar el estado
git status
  • Podemos ver que existe un nuevo archivo que está siendo rastreado
En la rama master

No commits yet

Cambios para hacer commit:
 (use «git rm --cached <archivo>...» para sacar del stage)

 nuevo archivo: README
  • El comando git add puede recibir tanto una ruta de archivo como de un directorio; si es de un directorio, el comando añade recursivamente los archivos que están dentro de él.
  • Vamos a crear un nuevo directorio «css» y dentro de el vamos a crear un archivo «estilo.css»
  • y ejecutamos el comando:
git status
  • RESULTADO:
En la rama master

No commits yet

Cambios para hacer commit:
 (use «git rm --cached <archivo>...» para sacar del stage)

 nuevo archivo: README

Archivos sin seguimiento:
 (use «git add <archivo>...» para incluir en lo que se ha de confirmar)

 css/
  • Podemos ver que detecta la creación de la nueva carpeta, por lo que si ejecutamos:
git add css
  • y ejecutamos
git status
  • Podemos ver que se hace de forma recursiva
En la rama master

No commits yet

Cambios para hacer commit:
 (use «git rm --cached <archivo>...» para sacar del stage)

 nuevo archivo: README
 nuevo archivo: css/estilo.css
  • Ahora si creamos una nueva carpeta «js» y dentro archivo «main.js», así como un archivo «index.html» dentro del directorio principal y ejecutamos:
git add -A
  • y ejecutamos
git status
  • RESULTADO:
En la rama master

No commits yet

Cambios para hacer commit:
 (use «git rm --cached <archivo>...» para sacar del stage)

 nuevo archivo: README
 nuevo archivo: css/estilo.css
 nuevo archivo: index.html
 nuevo archivo: js/main.js
  • Podemos ver que el parámetro «-A» incluye TODOS los archivos

Preparar archivos modificados

  • Ahora si modificamos el archivo «index.html» por ejemplo colocando el siguiente código:
<html lang="es">
<head>
    <meta charset="UTF-8">
    <title>Primer Proyecto GIT</title>
</head>
<body>

</body>
</html>

Compartir

GIT: Fundamentos
  • Para explicar los fundamentos de git vamos a crear una carpeta dentro del servidor web, con el nombre «primer_proyecto_git» y vamos a ingresar a ella desde la terminal.
mkdir /var/www/html/primer_proyecto_git
cd /var/www/html/primer_proyecto_git

Iniciando un repositorio en un nuevo directorio

  • Si va a crear un nuevo control de versiones sobre un nuevo proyecto (directorio vacío) debe utilizar el comando: «git init». Esto crea una carpeta oculta «.git» con todos los archivos necesarios del repositorio.
git init
  • RESULTADO:
Initialized empty Git repository in /var/www/html/primer_proyecto_git/.git/
  • A nivel de directorio lo que crea es una carpeta oculta «.git» que es la encargada de llevar el control de versiones de los archivos

Clonando un repositorio existente

  • Si lo que desea es obtener un proyecto ya existente lo debe clonar a través del comando «git clone». Esto descarga todos los datos del proyecto que están en el servidor, de hecho si el disco del servidor se corrompe puedes usar cualquier clon de los clientes para restaurarlo.
  • Para este caso vamos clonar el proyecto libgit2 desde github e insertarlo en un nuevo directorio:
mkdir /var/www/html/segundo_proyecto_git
cd /var/www/html/segundo_proyecto_git
git clone https://github.com/libgit2/libgit2
  • Si queremos crear un directorio de destino de una vez podríamos haber hecho esto que crea la carpeta de una vez:
git clone https://github.com/libgit2/libgit2 /var/www/html/tercer_proyecto_git
  • En cualquiera de los dos casos git descarga toda la información del proyecto de forma local, por lo que cuenta con todas las versiones del proyecto de forma local.

Revisando el estado de los archivos

  • El comando que le permite ver el estado de los archivos del proyecto es «git status»
git status
  • Si ejecutamos el comando dentro de «primer_proyecto_git» lo que va ver es:
cd /var/www/html/primer_proyecto_git/
git status
  • RESULTADO:
En la rama master

No commits yet

nada que hacer (crear/copiar archivos y utilice «git add» para continuar)
  • Indicando que no tiene ningún archivo, modificado ni rastreado
  • Si crea un nuevo archivo por ejemplo «README» y ejecuta el comando «git status» verás que git identifica esto.
touch README
git status
  • RESULTADO:
En la rama master

No commits yet

Archivos sin seguimiento:
 (use «git add <archivo>...» para incluir en lo que se ha de confirmar)

 README

no se ha agregado nada al commit pero existen archivos sin seguimiento (use «git add» para darle seguimiento)
  • Donde nos indica que existen archivos a los cuales no se les esta dando seguimiento.

Rastrear Archivos Nuevos

  • Para poder comenzar a rastrear y darle seguimiento a un archivo existe el comando «git add», ya que git no le va a dar el seguimiento si usted no se lo indica explícitamente.
git add README
  • Ahora si vuelve a solicitar el estado
git status
  • Podemos ver que existe un nuevo archivo que está siendo rastreado
En la rama master

No commits yet

Cambios para hacer commit:
 (use «git rm --cached <archivo>...» para sacar del stage)

 nuevo archivo: README
  • El comando git add puede recibir tanto una ruta de archivo como de un directorio; si es de un directorio, el comando añade recursivamente los archivos que están dentro de él.
  • Vamos a crear un nuevo directorio «css» y dentro de el vamos a crear un archivo «estilo.css»
  • y ejecutamos el comando:
git status
  • RESULTADO:
En la rama master

No commits yet

Cambios para hacer commit:
 (use «git rm --cached <archivo>...» para sacar del stage)

 nuevo archivo: README

Archivos sin seguimiento:
 (use «git add <archivo>...» para incluir en lo que se ha de confirmar)

 css/
  • Podemos ver que detecta la creación de la nueva carpeta, por lo que si ejecutamos:
git add css
  • y ejecutamos
git status
  • Podemos ver que se hace de forma recursiva
En la rama master

No commits yet

Cambios para hacer commit:
 (use «git rm --cached <archivo>...» para sacar del stage)

 nuevo archivo: README
 nuevo archivo: css/estilo.css
  • Ahora si creamos una nueva carpeta «js» y dentro archivo «main.js», así como un archivo «index.html» dentro del directorio principal y ejecutamos:
git add -A
  • y ejecutamos
git status
  • RESULTADO:
En la rama master

No commits yet

Cambios para hacer commit:
 (use «git rm --cached <archivo>...» para sacar del stage)

 nuevo archivo: README
 nuevo archivo: css/estilo.css
 nuevo archivo: index.html
 nuevo archivo: js/main.js
  • Podemos ver que el parámetro «-A» incluye TODOS los archivos

Preparar archivos modificados

  • Ahora si modificamos el archivo «index.html» por ejemplo colocando el siguiente código:
<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <title>Primer Proyecto GIT</title>
</head>
<body>

</body>
</html>
  • Y ejecutamos el comando
git status
En la rama master

No commits yet

Cambios para hacer commit:
 (use «git rm --cached <archivo>...» para sacar del stage)

 nuevo archivo: README
 nuevo archivo: css/estilo.css
 nuevo archivo: index.html
 nuevo archivo: js/main.js

Cambios no preparados para el commit:
 (use «git add <archivo>...» para actualizar lo que se confirmará)
 (use «git checkout -- <archivo>...» para descartar cambios en el directorio de trabajo)

 modificado: index.html
  • Aquí podemos observar que el archivo «index.html» aparece en la sección de nuevos archivos y y en modificados, esto quiere decir que se realiza un commit lo que se almacena en la base de datos de git es el estado del archivo «index.html» antes de la modificación ya que este es el que esta en el «Staged area», por lo que si deseamos se almacene el estado actual del archivo en el próximo commit debemos hacer un nuevo «git add»
git add -A
  • Si ejecutamos nuevamente
git status
  • RESULTADO:
En la rama master

No commits yet

Cambios para hacer commit:
 (use «git rm --cached <archivo>...» para sacar del stage)

 nuevo archivo: README
 nuevo archivo: css/estilo.css
 nuevo archivo: index.html
 nuevo archivo: js/main.js
  • Podemos ver que los archivos están listo para el commit

Estatus Abreviado

  • El comando «git status» nos da bastante información, pero sin embargo a veces deseamos enfocarnos en la información más importante, para esto git nos ofrece el comando «short»
git status -s
o
git status --short
  • RESULTADO:
M README
MM Rakefile
A lib/git.rb
M lib/simplegit.rb
?? LICENSE.txt
  • donde la columna de la izquierda indica el estado preparado (Stanging Area) y la columna de la derecha indica el estado sin preparar (Working Area):
    • A: preparado para el commit
    • M: archivo modificado
    • ?: archivo sin seguimiento
  • Interpretación del ejemplo:
    • el archivo README: está modificado el área de trabajo y no está preparado para el commit
    • el archivo Rakefile: fue modificado, preparado y modificado otra vez por lo que existen cambios preparados y sin preparar
    • el archivo git.rb: está preparado para el commit
    • el archivo simplegit.rb: fue modificado sibido al «staged area» y esta listo para el commit
    • el archivo LICENSE.txt: no se sigue en el «SA» ni «WA»
  • En nuestro ejemplo todos los archivos están preparados:
A css/estilo.css
A index.html
A js/main.js

Ignorar Archivos

  • sistema, temporales, o archivos resultantes de una compilación. Para esto debemos crear un archivo «.gitignore»
touch .gitignore
  • Y dentro de este archivo debemos establecer los patrones de los archivos que deseamos ignorar para que no sean incluidos dentro del control de versiones. Por ejemplo:
*.[oa]
*~
  • En el ejemplo la primera linea le dice a git que ignore archivos que temine en «.o» o «.a» y la segunda línea que ignore archivos que terminen con el carácter (~) que suelen ser archivos temporales.
  • Las reglas sobre los patrones que puedes incluir en el archivo .gitignore son las siguientes:
    • Ignorar las líneas en blanco y aquellas que comiencen con #.
    • Aceptar patrones glob estándar.
    • Los patrones pueden terminar en barra (/) para especificar un directorio.
    • Los patrones pueden negarse si se añade al principio el signo de exclamación (!).
  • Los patrones glob son una especia de expresión regular simplificada usada por los terminales. Un asterisco (*) corresponde a cero o más caracteres; [abc] corresponde a cualquier carácter dentro de los corchetes (en este caso a, b o c); el signo de interrogación (?) corresponde a un carácter cualquier; y los corchetes sobre caracteres separados por un guión ([0-9]) corresponde a cualquier carácter entre ellos (en este caso del 0 al 9). También puedes usar dos asteriscos para indicar directorios anidados; a/**/z coincide con a/z, a/b/z, a/b/c/z, etc.
  • Ejemplos:
# ignora los archivos terminados en .a
*.a

# pero no lib.a, aun cuando había ignorado los archivos terminados en .a en la linea anterior
!lib.a

# ignora únicamente el archivo TODO de la raíz, no subdir/TODO
/TODO

# ignora todos los archivos del directorio build/
build/

# ignora doc/notes.txt, pero este no doc/server/arch.txt
doc/*.txt

# ignora todos los archivos .txt el directorio doc/
doc/**/*.txt

Ver los Cambios Preparados y No Preparados

  • Vamos hacer un cambio en el titulo de la página «index.html», por ejemplo:
<title>Primer Proyecto GIT nuevo cambio</title>
  • Ejecutamos
git status
  • RESULTADO:
En la rama master

No commits yet

Cambios para hacer commit:
 (use «git rm --cached <archivo>...» para sacar del stage)

 nuevo archivo: README
 nuevo archivo: css/estilo.css
 nuevo archivo: index.html
 nuevo archivo: js/main.js

Cambios no preparados para el commit:
 (use «git add <archivo>...» para actualizar lo que se confirmará)
 (use «git checkout -- <archivo>...» para descartar cambios en el directorio de trabajo)

 modificado: index.html

Archivos sin seguimiento:
 (use «git add <archivo>...» para incluir en lo que se ha de confirmar)

 .gitignore
  • Podemos ver que nos indica que el «index.html» fue modificado, pero que pasa si quieres saber cual fue el cambio que se hizo? para esto git nos ofrece el comando «git diff»
git diff
  • RESULTADO:
diff --git a/index.html b/index.html
index d9e17da..8a97016 100644
--- a/index.html
+++ b/index.html
@@ -2,7 +2,7 @@
 <html lang="es">
 <head>
 <meta charset="UTF-8">
- <title>Primer Proyecto GIT</title>
+ <title>Primer Proyecto GIT nuevo cambio</title>
 </head>
 <body>
  • Aquí git analiza lo que tienes en el «Stage Area» y en el «Working Area» los compara y nos indica que la línea del titulo fue modificada, eliminada o agregada.
  • Ahora si deseas ver que es los cambios de los archivos que están en el «SA» y que serán actualizados en el próximo commit, puede ejecutar:
git diff --staged
o
git diff --cached
  • IMPORTANTE: el comando «git diff» (sin parametros) solo muestra los cambios de los archivos que no están preparados, por lo que si todos sus archivos ya están preparados no dará ningún resultado.

Confirmar tus Cambios

  • Si ya tenemos todos los archivos de nuestra primera versión del proyecto en estado «preparados» podemos indicarle a git que los confirme, haciendo que git saque una instantánea de los archivos.
git commit -m "Incio del proyecto: V1.001 / estructura inicial"
  • RESULTADO:
[master (root-commit) 17b842c] Incio del proyecto: V1.001 / estructura inicial
 4 files changed, 11 insertions(+)
 create mode 100644 README
 create mode 100644 css/estilo.css
 create mode 100644 index.html
 create mode 100644 js/main.js
  • Aquí puedes ver varios aspecto:
    • Rama: master en cual rama se confirmaron los cambios
    • El checksum (17b842c) que se genero e identifica el cambio
    • Cuántos archivos han cambiado y estadísticas sobre las líneas añadidas y eliminadas en el commit

Eliminar Archivos

  • Si creamos dentro del directorio un archivo «tmp.html» y ejecutamos el comando
git status
  • RESULTADO:
En la rama master
Archivos sin seguimiento:
 (use «git add <archivo>...» para incluir en lo que se ha de confirmar)

 tmp.html

no se ha agregado nada al commit pero existen archivos sin seguimiento (use «git add» para darle seguimiento)
  • Entonces los agregamos y lo confirmamos
git add -A
git status
git commit -m "Creación de archivo tmp.html"
git status
  • El archivo está en seguimiento por parte de git, ahora si eliminamos el archivo desde el «WA» y ejecutamos
git status
  • RESULTADO:
En la rama master
Cambios no preparados para el commit:
 (use «git add/rm <archivo>...» para actualizar lo que se confirmará)
 (use «git checkout -- <archivo>...» para descartar cambios en el directorio de trabajo)

 borrado: tmp.html

no hay cambios agregados al commit (use «git add» o «git commit -a»)
  • No indica que el archivo fue borrado pero todavía estaría en el «SA», por lo que para eliminar un archivo de forma correcta debemos usar el comando «git rm», volvemos a crear al archivo, lo preparamos y confirmamos y luego eliminamos el archivo:
git rm tmp.html
  • RESULTADO:
rm 'tmp.html'
  • Esto elimina el archivo del «WA» y «SA»
  • Si es necesario forzar al eliminación del archivo podemos usar el parámetro «-f»
git rm tmp.html -f
  • Si desea eliminar el archivo del «SA»
git rm --cached tmp.html
  • Al comando git le puede pasar archivos, directorios y patrones
git rm log/\*.log
  • Fíjate en la barra invertida () antes del asterisco *. Esto es necesario porque Git hace su propia expansión de nombres de archivo, aparte de la expansión hecha por tu terminal. Este comando elimina todos los archivo que tengan la extensión .log dentro del directorio log/. O también puedes hacer algo como:
$ git rm \*~
  • Este comando elimina todos los archivos que acaben con ~.

Cambiar el Nombre de los Archivos

  • Git no rastrea los cambios de nombre, si quieres renombrar un archivo debe hacer:
git mv file_from file_to
  • En nuestro ejemplo podemos hacer algo como:
git mv index.html index.php
  • Si hacemos «git status» vemos que git lo reconoce como un renombramiento:
git status
  • RESULTADO:
En la rama master
Cambios para hacer commit:
 (use «git reset HEAD <archivo>...» para sacar del stage)

 borrado: README
 renombrado: index.html -> index.php
 borrado: tmp.html