Control de versiones

git logo

http://git-scm.com/


            $ git init newbies

  

Culturilla general


¿Qué es git?


Sistema de control de versiones

Repositorio en local

Sistema distribuido

Rápido, sencillo, fiable, robusto, ...

Ejecutamos un simple comando


¿Porqué usar git?


  • Colaborativo: Trabajo simultaneo de varias personas en un mismo proyecto
  • Flexibilidad: Admite cualquier forma de trabajo
  • Control: Gestión total de los cambios
  • Profesional: Uso creciente en proyectos empresariales
  • Imperativo: Lo dice tu jefe
  • Open source: Free (as freedom)

¿Cómo es git?


¿Cómo es git?


Algunos "palabros"


  • Comando de consola: Aplicación que se ejecuta en un terminal
  • Directorio de trabajo: Directorio con los archivos del proyecto
  • Stage area: Zona intermedia para preparar los cambios a validar
  • Repositorio: Directorio donde git gestiona los cambios del proyecto
  • Repositorio remoto: Es un repositorio alojado en una máquina externa a la nuestra
  • (Un)Tracked: Es un estado que determina los ficheros que están (o no) en el repositorio

Lo básico


Instalación


Múltiples plataformas

Unix, Windows, Mac, ...


Descarga

http://git-scm.com/downloads


Ejecución


Git es un comando, entonces... ¿Como se ejecuta?


Comando GIT



    git commit -m "Mensaje"               git status
    git merge dev --no-ff                 git pull origin dev

$ git <comando> [<argumentos>]

  • <comando>: Acción principal (add, commit, init, status, ...)
  • <argumentos>: Opciones de ejecución
    • Parámetros: Prefijados con guiones
      --force, -u, -m "Mensaje"
    • Nombres: De ficheros, ramas, repositorio, ...
      fichero.html, remote origin

Preparados

Primeros pasos

Ayuda, por favor


El comando que lo sabe todo

git help

        git help config
        git help init
        git clone --help
    

Esta ayuda también está disponible en la web http://git-scm.com/docs

Configuración


Personalizamos nuestro git

git config

        git config --global user.name "Carmelo Cotón"
        git config --global user.mail carmelo@coton.com

        git config --global color.ui true
    

Obligatorio establecer los datos del usuario para que pueda registrarse quien es el autor de los cambios.

El parámetro --global establece la configuración para todos los
repositorios en nuestra máquina

Iniciar git


Crear un repositorio nuevo

git init

        git init
    

Prepará el directorio de trabajo para
poder trabajar con git

Iniciar git


Descargar un repositorio remoto

git clone

        git clone https://github.com/jquery/jquery.git
    

Crea el directorio de trabajo y copia los ficheros del repositorio.

Iniciar git


Directorio de trabajo es donde se encuentran todos los ficheros del proyecto que nosotros vemos y modificamos.

El repositorio es un directorio llamado .git que se encuentra siempre dentro del directorio de trabajo. Aquí es donde git organiza los cambios que nosotros registramos

Estado actual


Información del estado de los ficheros

git status

        git status
    

Devuelve información del estado en que se encuentran actualmente los ficheros del proyecto


Este comando deberíamos ejecutarlos siempre antes de realizar una operación con git para verificar en que estado están los cambios que queremos realizar.

Registro de cambios

Realizar cambios


¿Qué es un cambio?

  • Creamos ficheros nuevos
  • Editar el contenido de un archivo con nuestro editor favorito
  • Borrar un fichero
  • Renombrar o mover ficheros


Los ficheros con modificaciones pasan
a tener el estado "modified".
En estado "untracked" se encuentran
los ficheros que son nuevos.

Anotar cambios


Añadir ficheros

git add

        git add index.html img/logo.png
        git add css/ img/
    

Los ficheros con cambios son añadidos a una zona previa que agrupará todos los archivos que pasarán al repositorio.
Esta zona se llama "stage area" ( o "index")


Los ficheros añadidos cambian su estado a "staged".

Aceptar cambios


Nueva versión de cambios

git commit

        git commit
        git commit -m "Mensaje descriptivo de los cambios"
    

Creamos una versión nueva en el repositorio con los cambios
que se encuentran en el "stage area", teniendo así una instantánea del estado actual del proyecto.


Los ficheros una vez aceptados los cambios volverán al estado "unmodified"

Estado de ficheros

Los diferentes estados que pueden tener los ficheros

Histórico


Información de los cambios

git log

        git log                                 git log index.html
        git log --oneline                       git log --stat
        git log -n 8
        git log --pretty=format:'%h %ad | %s%d [%an]' --graph --date=short
    

Obtenemos el histórico de los cambios del proyecto,
pudiendo tener así acceso a la información
de la trayectoria de un proyecto.

Fundamentals


Comandos básicos

Con estos comandos ya tenemos todo lo necesarios para poder registrar nuevas versiones en la historia de un proyecto.


Flujo de trabajo

  • editamos los ficheros,
  • preparamos los cambios en el stage area
  • aceptamos los cambios creando una versión nueva en el repositorio

Deshacer cambios

Modified


Cambios en el directorio de trabajo

git checkout

        git checkout index.html
        git checkout js/
        git checkout .
    

Las modificaciones de un fichero en el directorio de trabajo pueden ser desechas, teniendo en cuenta que estos cambios no los podemos recuperar.

Staged


Cambios en el "stage area"

git reset

        git reset
        git reset index.html js/
        git reset --hard
    

Saca los cambios que teníamos preparados en el "stage area" llevándolos al directorio de trabajo.

Con la opción --hard deshace los cambios del directorio de trabajo también, perdiendo definitivamente los cambios

Unmodified


Cambios en el repositorio

git revert

        git revert HEAD
        git revert 996c3ae3148c7291066d9e8bf58df623d4c7ea7b
    

Deshace cambios que ya están en el repositorio realizando un nueva versión que aplica los cambios a la inversa.

Ramas

Bifurcando cambios

Lineas de desarrollo independientes

Creación y gestión de ramas fácil y flexible.

Todos los cambios aceptados se realizan siempre sobre una rama, sino se pierden.

El final de una rama suele ser mezclar los cambios hacia otra rama.

Mantenimiento


Gestión de ramas

git branch

    git branch                                 git branch -d nombre-rama
    git branch nueva-rama                      git branch -D nombre-rama
    git branch -m nombre-rama nueva-rama
    

Podemos crear, renombrar (-m) y borrar las ramas (-d, -D)


Realizamos mantenimiento, pero no posicionamos ni cambiamos de ramas

Andando por las ramas


Seleccionar una rama

git checkout

        git checkout otra-rama
        git checkout -b nueva-rama
    

Cambiamos la rama actual de trabajo donde
se registrarán los nuevos cambios.

Seleccionar una rama implica modificar el directorio
de trabajo con los cambios que hay en esa rama.

Si no existiese la rama se puede crear con el parámetro -b directamente.

Mezclando, que es gerundio


Mezclar ramas

git merge

        git merge nombre-rama
        git merge --no-ff nombre-rama
    

Traemos los cambios realizados en una rama y los aplicamos sobre la rama actual.


Cuando una rama se mezcla en otra se define que ha terminado su vida de desarrollo y git nos permitirá poder borrarla.

Mezclando, que es gerundio


Tipo "fast forward"

Esto sólo es posible si el desarrollo de la rama creada es linear a la rama origen.


Los cambios se aplican moviendo la rama destino a la altura de la rama origen, haciendo que apunten a la misma versión.


Se consigue integrar los cambios de una manera rápida y sencilla.

Mezclando, que es gerundio


Tipo "no fast forward"

Se aplica cuando en ambas ramas han evolucionado su historia y por lo tanto se necesitan mezclar los cambios. Estos cambios son integrados en un nuevo commit

Con --no-ff se fuerza aplicar este tipo.

Cuando se producen cambios en un mismo archivo, git suele mezclar eficazmente las diferencias, pero en algunos casos no puede decidir como realizarlas y daría lugar a un conflicto parando el proceso.

Mezclando, que es gerundio


Resolviendo conflictos

Cuando hay conflicto el comando merge se interrumpe y nos indica que ficheros son los que no sabe mezclar para que nosotros hagamos el cambio manualmente.

Una vez realizados los cambios correctos hay que terminar el proceso de forma manual, esto es añadiendo los ficheros al stage area y ejecutar un commit.


        git add fichero-modificado fichero-arreglado
        git commit
    
No hace falta poner el mensaje de commit,
ya hay uno por defecto

Mezclando, que es gerundio


Abortar la operación

Si cuando hay un conflicto lo que queremos es no seguir con la operación y deshacer los cambios que se han producido al mezclar las ramas podemos abortar el proceso con...


        git merge --abort
    

Esto nos devolvería a la situación anterior antes de ejecutar el comando merge.

Repositorios remotos

Intro


Nuestro repositorio local puede conectarse a cualquier otro repositorio externo, no tenemos ninguna limitación en cuanto a donde y a cuantos repositorios conectarnos.


Este repositorio puede ser otro desarrollador, o un servidor de alojamiento de repositorios git (GitHub), un servidor en nuestra oficina, ...


Nos conectamos a otros repositorios para poder compartir y actualizar nuestros cambios en local con el remoto.

Conectando


Establecer conexión remota

git remote

        git remote -v
        git remote add testing git@gitlab.internet.int:cms/uedit.git

        git remote rm nombre remoto
        git remote rename nombre-remoto nuevo-remoto
    

Nos permite configurar la conexión de los repositorios remotos.


Los métodos más comunes de conexión con un servidor son mediante HTTP o SSH.

Creando


Descargar nuevo repositorio

git clone

        git clone https://github.com/jquery/jquery.git
    

Crea el directorio de trabajo donde se descargará el
repositorio e inicializa el proyecto con la versión de
la rama por defecto (master)


Por defecto se creará un remoto llamado "origin" que conecta con la URL especificada.

Descargando


Actualizar cambios

git pull

        git pull origin rama-desarrollo
    

Sincroniza en el repositorio la rama local
con los cambios de la rama remota y
actualiza en el directorio de trabajo
con los cambios de esa rama.


Subiendo


Publicar nuestros cambios

git push

        git push origin rama-desarrollo
    

Actualizamos la rama del repositorio remoto
con nuestros cambios.

La rama local debe estar actualizada con los cambios
del remoto para poder subir nuestros cambios.


Si la rama no existe en el remoto se creará.

Bola extra



Listado de ramas remotas en nuestro repositorio


        git branch -r
    


Crear una rama local a partir de remota


        git checkout -b rama-desarrollo origin/rama-desarrollo
    

Bola extra



Volver una rama local al estado de la remota


        git reset --hard origin/rama-desarrollo
    


Borrar una rama remota


        git push origin :rama-desarrollo
    

Bola extra



Logs de cambios del remoto


        git log origin/rama-desarrollo
    


Mezclar una rama remota en local directamente


        git merge origin/rama-desarrollo
    

Y mucho más...

Recursos