Sistema de control de versiones

GIT

Universidad Nacional de La Matanza

Problemas por no usar VCS

  • Control de cambios
  • Trabajo en equipo
  • Historial de cambios: viaje en el tiempo
  • ¿Qué cambió en cada versión?

Historia de los sistemas de control de versiones

Primera generación

Red Ninguna
Operaciones Un archivo a la vez
Concurrencia Bloqueo
Ejemplo SCCS(1972), RCS(1982)

Segunda generación

Red Centralizada
Operaciones Múltiples archivos
Concurrencia Merge antes de commit
Ejemplo CVS(1990), SVN(2000), TFS(2005)

Tercera generación

Red Distribuída
Operaciones Conjunto de cambios
Concurrencia Commit antes del merge
Ejemplo Git(2005), Mercurial(2005), Bazaar(2005)

GIT

Creado por Linus Torvalds para el desarrollo del kernel Linux

Características

  • Distribuído - Contribuidores alrededor del mundo
  • Ramas - Desarrollo no lineal
  • Rápida implementación
  • Repositorios por HTTP, SSH, rsync
  • Firma digital de cambios

Ciclo de vida

Que empiece el juego...

Configurar git

Información del usuario

              git config --global user.name "Juan Peréz"
              git config --global user.email "jperez@example.com"
            

init

Inicializa un repositorio

git init .

status

Ver estado del repositorio

git status

add

Agregar archivo al listado de archivos para hacer commit

git add lista.txt

commit

Confirmar cambios

git commit

log

Ver historial de commits

git log

Tag

Etiquetar versiones

git tag 0.1.0

rm

Quitar archivo del sistema de control de cambios

git rm build/a.out

Generalmente archivos autogenerados

Archivo .gitignore

.gitignore - Lista de arhivos que serán ignorados por git

              build/*
              *.exe
              *.class
              *.pyc
            

branch

Crea una rama nueva

git branch dev

checkout

Saltar entre ramas

git checkout dev

Trabajo en equipo

Clone

Crea un respositorio local clonando el repositorio remoto

Protocolos: Local

Ventajas Desventajas
Fácil de compartir con otros miembros Necesita configurar una red compartida
Rápido acceso al repositorio
git clone /home/yromero/projects/webapp.git

Protocolos: SSH

Ventajas Desventajas
Fácil de compartir usando un servidor remoto No existe el acceso anónimo
SSH comprime datos durante la transmisión. Mejora la velocidad
git clone git@github.com:romeroyonatan/webapp.git

Protocolos: GIT

Ventajas Desventajas
Más rápido que otros No hay seguridad (cualquiera puede hacer cambios)
git clone git://username@server/webproject.git

Protocolos: HTTPS

Ventajas Desventajas
Fácil de configurar Transmisión de datos lenta
git clone https://github.com/romeroyonatan/webapp.git

Remote

Agrega un repositorio remoto a uno existente

git remote add origin https://github.com/romeroyonatan/webapp.git

Fetch

Trae cambios realizados en repositorio remoto. No modifica archivos locales

git fetch

Merge

Combinación entre ramas

git merge origin/master

Push

Subir commits locales al servidor remoto

git push origin master

Pull

Atajo para git fetch y git merge

git pull origin master

Resolución de conflictos

Fast-forward

No existe conflicto. Mueve puntero HEAD

Fast-forward merge

Auto-merging

Se genera un commit nuevo que combine todos los cambios

Fast-forward merge

Manual

Existen cambios en la misma sección de un elemento de configuración

herramientas para solucionar conflictos

grep

Buscar algo entre todos los archivos

            user@server:~$ git grep -n body
            Master:Website.Index.html:4: <body>
            Master:Website.Index.html:12: </body>
            

status

Ver archivos en conflicto

git status

diff

Ver cambios en el repositorio

git diff <commit-id>

stash

Guardar temporalmente los cambios no commiteados

git stash
git stash pop

mergetool

Abre archivos conflictivos en editor de 3 vías

git mergetool

Blame

Saber quien hizo un cambio en una linea

git blame file

Limpiando tus errores

Clean

Elimina archivos untracked

git clean

Checkout

Revertir cambios al archivo

git checkout config.ini
              rm config.ini
              git checkout HEAD config.ini
            

reset

Volver a un estado anterior

Reescribir la historia

reset

--hard
Sobreescribe cambios locales.
--mixed *
Marca cambios locales como modificaciones.
--soft
Cuando no commiteamos los archivos deseados.

Editar un commit

git commit --amend

Cancelar un commit

Crea un commit que revierte los cambios de un commit previo

No es buena práctica borrar commits. Es mejor revertirlos

git revert 0335a5f13

bisect

Busqueda binaria para buscar commit que haya agregado un bug

              user@server:~$ git bisect start
              user@server:~$ git bisect bad commitIDAfterThePull
              user@server:~$ git bisect good commitIDBefore
            

https://github.com/eplaut/git_bisect_tutorial

cherry-pick

Copiar las modificaciones de un commit de un branch a otro. Util para bugfixes


              git cherry-pick commitId
            

rebase

Copiar una serie de commits de un branch a otro Util para bugfixes o como alternativa al merge


              git checkout feature
              git rebase master
            

Plataformas web

Recursos para aprender git

Aprendamos jugando

github.com/git-game/git-game
git clone https://github.com/git-game/git-game.git

Referencias

  1. Sink, Eric. "A History of Version Control". 2011 (Web). Última visita 27 de obtubre de 2018
  2. Git Best Practices Guide. Pidoux, Eric. Packt Publishing. 2014. ISBN 978-1-78355-373-0
  3. Atlassian. "Merging vs. Rebasing". (Web). Última visita 27 de octubre de 2018