Control de versiones, documentación y optimización.

SCV o Sistema de Control de versiones

Tomado del siguiente Manual GIT en https://git-scm.com/book/es/v2:

Un control de versiones es un sistema que registra los cambios realizados en un archivo o conjunto de archivos a lo largo del tiempo, de modo que puedas recuperar versiones específicas más adelante.

SCV centralizados

  • El enfoque tradicional de los SCV es el de un sistema centralizado.
  • Es el caso de los muy utilizados CVS O Subversion.
  • Esto es fácil de administrar pero obliga a que el servidor siempre esté disponible.

SCV distribuidos

  • Git, como Mercurial, Bazaar o Darcs, es un sistema distribuido.
  • Los clientes mantienen una copia completa de todo el repositorio.
  • Esto permite hacer cambios sin estar conectados.
  • En algún momento deben sincronizarse los clientes y el servidor o serviodres.

Git

  • Linux usaba BitKeeper para su desarrollo pero en 2005 dejó de ofrecer una licencia gratis para el proyecto GNU/Linux.
  • Git se creó para sustituir a BitKeeper
  • Linus Torvaldas, creador de Linux, desarrolló Git para dar soporte al desarrollo de este SO.

Las características de git:

  • Es distribuido
  • Sencillo y rápido
  • Permite grandes proyectos con mulititud de ramas
  • Usa copias completas. Hace copia de los ficheros modificados y enlaces a los no modificados.
  • Asegura la integridad. Realiza un hash SHA-1 a cada fichero. Si un fichero es alterado git lo detecta.
  • La mayoría de cambios se hacen localmente.

Esquema de almacenamiento

  • Cada instantánea se identifica por un hash SHA1
  • Cada instantánea o commit añade los ficheros modificados. Y guarda enlaces al resto.

Instalación

  • Vamos a usar Ubuntu o alguna de sus variantes (Mint, Lubuntu, ...)
  • Instalación de git:

    sudo apt-get update
    
    sudo apt-get install git
    
  • En Windows, descargamos desde aquí y ejecutamos.

Configuración inicial

  • Configuración necesaria para cada commit que haga:

    git config --global user.name "Your Name"
    
    git config --global user.email "[email protected]"
    
  • Opcionalmente el editor (si no me gusta el que hay por defecto):

    git config --global core.editor vi
    

Niveles de configuración de git

Todo lo aquí contado puede verse con más detalle en el citado manual.

  • Git tiene 3 niveles de configuración, cada nivel sobreescribe el anterior:

    • Para todos los usuarios: /etc/gitconfig

    • Para un usuario: ~/.gitconfig (opción --global)

    • Para un repositorio: .git/config

  • Para ver los parámetros configurados:
git config --list

GitHub (o Bitbucket)

  • Git puede usarse localmente y sin conectarse a ningún otro equipo.
  • No obstante el uso de un servidor remoto:
    • Facilita la compartición de código
    • Facilita el trabajo en equipo
    • Aumenta la seguridad de nuestro código.

Uso de GitHub o Bitbucket

  • Nos registramos en Github o Bitbucket
  • La comunicación entre un repositorio local y uno remoto puede ser mediante https o ssh.
  • Por cuestiones prácticas consideramos mejor usar ssh. Veamos que configuración requiere.

Configuración de ssh

  • Evitaremos introducir usuario/contraseña en nuestra consola
  • Accedemos a nuestra cuenta
  • Vamos a los settings del USUARIO y asociamos una ssh-key
  • Como creamos nuestra ssh-key:
ssh-keygen
  • Copiaremos el contenido de ~/.ssh/id\_rsa.pub a una nueva clave ssh en GitHub

Iniciar repositorio

Para empezar.

  • Podemos iniciar el repositorio en GitHub o Bitbucket
  • Podemos iniciarlo localmente.
  • Supongamos que hemos iniciado nuestro proyecto y tomamos la segunda opción.

Objetivo

  • Tomar una carpeta como nuestro repositorio.
  • Puede ser la carpeta de ejercicicios de programación.
  • Puede ser la carpeta de un proyecto concreto.

¿Qué hago localmente?

  • Voy a git bash y me muevo a mi directorio
  • Tecleo lo siguiente:
    • git init
    • echo "# Repositorio de ejemplo" >> README.md
    • git add README.md
    • git commit -m "Commit inicial"

¿Qué hago en GitHub/Bitbucket?

  • Creo repositorio
  • Sigo las instrucciones para subir mi repositorio local:

Opción B. Iniciar el repositorio en GitHub/Bitbucket

  • Al crear el repositorio se da la posibilidad de añadir un fichero README.md y crear un commit inicial.
  • Por otra parte podemos partir de un repositorio nuestro o ajeno ya creado.
  • En tal caso basta con hacer:

      git clone <url repo>           #habitual
      git clone <url repo> <carpeta> #permite definir destino
    

Uso de git: guardar cambios

Todas estas operaciones son locales:

  • No es necesario salir a la red
  • Velocidad muy alta de las operaciones
  • Lee de tu base de datos local
  • Calcula diferencias entre ficheros en local
  • No limita el trabajo sin conexión

Ver el estado

  • Consultar el estado del repositorio: git status
  • Nos dirá qué ficheros hay nuevos o modificados
  • La rama que estamos, por defecto master
  • Si estamos por detrás/delante del origin, el repositorio remoto

git status

Preparar y comprometer cambios:

  • Con git add ... pasamos los ficheros modificados/nuevos a preparados.
  • Tras hacer esto se guarda temporalmente los cambios realizados.
  • Con `git commit -m "...." comprometemos los cambios.
git add .
git commit -m "comentario explicativo"

git status

Ejemplos de git add

git add <nombre fichero>    #un sólo fichero
git add img/logo.jpg
git add <nombre directorio> #todo lo de un directorio
git add .                   #caso particular, todo, todo...
git add public/js

Recorrido completo:

git status git status

git status git status

Marcha atrás de un fichero modificado

  • Hemos modificado un fichero y queremos recuperar la anterior versión:

git status

git checkout <nombrefichero>
git checkout casa.md
git checkout <nombre directorio>
git checkout .

Marcha atrás de un fichero preparado

  • Queremos sacar del estado preparado después de git add:

git status

git reset HEAD <nombrefichero>
git reset HEAD casa.md
git reset HEAD <nombre directorio>
git reset HEAD .

Guardar en remoto.

  • En local por defecto trabajamos en la rama master.
  • Si hay un remoto, además se guarda oculta la rama origin/master.
  • Sean los equipos A y B, y mismo repositorio:

Commit + push, equipo A

Git push

  • Push es el comando usado para subir código a origin, es decir el repositorio remoto.
  • Origin es el nombre usado por defecto para la copia remota.
  • Ejemplos de uso
git push                        # sube rama "preferida"

# comando usado en la subida inicial tras git init. Lo explicaremos
git push -u origin master

Fetch + pull, equipo B

  • Se recomienda hacer git status entre ambos.
  • En realidad pull es la suma de dos comandos: fetch + merge

¿Cómo usar dos equipos: aula y casa?

  • Al empezar a trabajar, ejecutar
    git fetch
    git status
    git pull
    
  • Al acabar la sesión de trabajo
    git commit 
    git status
    git push
    

Fork & Pull Request

Fork

  • Clon de un repositorio ajeno en nuestro espacio
  • Es una funcionalidad de GitHub/Bitbucket
  • P.ej. el repositorio repo1702
  • El clon es de mi propiedad y lo puedo clonar y editar

    Pull Request

  • Es una solicitud de que el dueño original incorpore mis cambios.
  • Se hace en la interfaz web
  • El dueño original lo acepta o no...

Commit --amend

  • Consiste en rectificar el commit anterior
  • Los cambios añadidos sobreescriben el último commit
  • OJO! Puede ser peligroso.

Ramas (branch)

  • Por defecto trabajamos en la rama master
  • Las ramas se usan fundamentalmente para separar tareas sin modificar la rama master
  • Una vez terminada la tarea se funde (merge) la rama de tarea con la rama master.
  • Esto permite cambiar de rama/tarea y dejarla incompleta sin dejar el proyecto en versiones incompletas o inestables.

Comandos con ramas

git branch              // lista de ramas
git branch  <rama>      // crear rama
git checkout <rama>     // cambiar de rama
git checkout -b <rama>  // crear y cambiar rama 2 en 1
git branch -d <rama>    // borrar rama

Fundir ramas

git checkout master     // nos ponemos en rama master
git merge <rama>        //fundimos con la rama deseada

Revisemos el uso de push

  • Push sube código a un repositorio remoto
  • Origin es el alias usado pra el repositorio remoto
  • Podríamos usar más de un remoto
  • Master es el nombre de la rama por defecto
    git push                        # sube rama "preferida"
    git push <repo remoto> <rama>   # sube una rama concreta
    git push origin dev             # Ej. sube rama dev
    git push -u <repo remoto> <rama># sube y predetermina rama
    git push -u origin master       # Ej. sube y pred. master
    

Ramas remotas

  • Si queremos compartir una rama de trabajo
  • Subir una rama:
    git push origin <rama>
    
  • Bajar la rama tiene dos partes:
    git fetch  #crea la rama oculta origin/<rama>
    
  • Las siguientes ordenes son idénticas.
  • Ambas crear la rama local asociada a origin/
  • La primera nos permite alterar el nombre .
    git checkout -b <rama> origin/<rama>
    git checkout --track origin/<rama>
    

Revisando código

  • Los comandos básicos son log y diff
  • git log nos muestra información histórica
  • git diff compara el contenido de los ficheros

log

  • Log soporta una gran cantidad de parámetros:
  • Veámoslo con ejemplos:
    git log             #uso base
    git log -<n>        #log de los últimos n commits
    git log
    

GitIgnorando cosas: .gitignore

results matching ""

    No results matching ""