[Conceptos Básicos] [Trabajando con Git] [Git Flow] [Revertir Cambios] [Cuando todo falla] [Recursos]

Control de versiones GIT

Conceptos Básicos

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

  • Instantáneas no diferencias
  • Es local
  • Tiene integridad
  • Solo añade información

Estados

  • Confirmado (commited) : Los datos estan almacenados de forma segura en la base de datos local.
  • Modificado (modified) : Se ha modificado el archivo pero todavía no lo has confirmado a tu base de datos.
  • Preparado (staged) : Se ha marcado un archivo modificado en su versión actual para que vaya en tu próxima confirmación.

Secciones

  • Directorio de Git (Git direcyory) : Es la base de datos de objetos para el proyecto. Es lo que se copia cuando se clona un repositorio.
  • Directorio de trabajo (working direcry) : Es una copia de una versión del proyecto.
  • Area de preparación (staging area) : Es un archivo que almacena información sober lo que va a ir en la próxima confirmación.

Flujo de trabajo básico de Git

  1. Modificar : los archivos en tu directorio de trabajo.
  2. Preparar : los archivos, añadiendolos al área de preparación.
  3. Confirmar : los cambios, tomando los archivos tal y como están en el área de preparación, y almacena esas instantáneas de manera permanente en el directorio de Git.

Si una versión concreta de un archivo está en el directorio de Git, se considera confirmada (committed). Si ha sufrido cambios desde que se obtuvo del repositorio, pero ha sido añadida al área de preparación, está preparada (staged). Y si ha sufrido cambios desde que se obtuvo del repositorio, pero no se ha preparado, está modificada (modified).

Trabajando con Git

Iniciando git

$ git init

Initialized empty Git repository in /Users/meplaz/Documents/chubb/learn/git/.git/
$ git config --list

credential.helper=osxkeychain                                                                      
user.name=MiguelPlazas                                                                             
user.email=miguelplazasr@gmail.com                                                                 
core.excludesfile=/Users/meplaz/.gitignore_global                                                  
difftool.sourcetree.cmd=opendiff "$LOCAL" "$REMOTE"                                                
difftool.sourcetree.path=                                                                          
mergetool.sourcetree.cmd=/Applications/Sourcetree 2.app/Contents/Resources/opendiff-w.sh "$LOCAL" "$REMOTE" -ancestor "$BASE" -merge "$MERGED"
mergetool.sourcetree.trustexitcode=true                                                            
core.repositoryformatversion=0                                                                     
core.filemode=true                                                                                 
core.bare=false                                                                                    
core.logallrefupdates=true                                                                         
core.ignorecase=true                                                                               
core.precomposeunicode=true 
$ git config --global user.name "name"
$ git config --global user.email "email@example.com"

Git Status

$ git status

alt text

Git Add

$ git add .

alt text

Git Commit

$ git commit -am "First commit"

alt text

$ git status

alt text

Git Log

$ git log

alt text

$ git log --pretty=oneline

Interfaz gráfica para visualizar el histórico

$ gitk

alt text

Git Ignore

Archivos que no serán versionados

Deshacer en el área de preparación

Modificar ultimo commit

El modificador --amend se usa para adicionar cambios al último commit realizado. Ej. Cuando se quedan archivos fuera del área de preparación

$ git commit -m "Add feature"
$ git add newfile
$ git commit --amend

alt text

Sacar un archivo del área de preparación

alt text

$ git reset HEAD file2.txt

alt text

Revertir cambios de un archivo

$ git checkout -- file 

Etiquetas

  • Listar
$ git tag
  • Crear
$ git tag -a v1.0 -m 'version 1.0'

alt text

  • Push
$ git push origin v1.0

Ramas

Es un apuntador movil apuntando a una confirmación. master es la rama principal del proyecto

  • Mostrar
$ git branch
  • Crear
$ git branch testing

alt text

alt text

  • Cambiar de rama
$ git checkout testing

alt text

alt text

Cambios en una rama

Al realizar cambios en una rama ejemplo testing, esta rama avanza con cada commit

alt text

Al trabajar sobre diferentes ramas haciendo cambios en ellas se crean proyectos divergentes. Los cambios de cada una de esas ramas están aislados en ramas independientes.

alt text

Fusionar

  • Merge
$ git merge MYFEATURE

Incorpora los cambios de la rama MYFEATURE en la rama actual

  • Rebase
$ git rebase master 

Replica los cambios confirmados de la rama master en la rama actual

Repositorios Remotos

Publicar

$ git push REMOTO RAMA

Publica en el repositorio remoto la rama deseada

Actualizar repositorio local

$ git pull 

Git Flow

alt text

git-flow es un conjunto de extensiones para git que proveen comandos de alto nivel para operar repositorios basados en el modelo de ramificaciones de Vincent Driessen

Instalación

osx

$ brew install git-flow-avh

Linux

$ apt-get install git-flow

Windows

$ wget -q -O - --no-check-certificate https://raw.github.com/petervanderdoes/gitflow-avh/develop/contrib/gitflow-installer.sh install stable | bash

Cómo se usa?

Iniciar un proyecto con Git Flow

$ git flow init

alt text

Features

Es el desarrollo de características para futuras versiones Es parte de la rama develop

  • Iniciar un nuevo feature
$ git flow feature start MYFEATURE

alt text

  • Publicar feature
  • Hace la publicación del feature en el repositorio remoto
  • Deja el feature disponible para colaboración
$ git flow feature publish MYFEATURE
  • Finalizar un feature
$ git flow feature finish MYFEATURE

alt text

Releases

Es la preparación de una versión para paso a producción

  • Iniciar un release
$ git flow release start RELEASE

alt text

  • Publicar un release

Se debe publicar el release para que otros developers puedan enviar cambios

$ git flow release publish RELEASE
  • Finalizar un release
$ git flow release finish RELEASE

alt text

Hotfix

Correcciones para resolver bugs en la aplicación

  • Iniciar un hotfix
$ git flow hotfix start VERSION

alt text

  • Finalizar un hotfix
$ git flow hotfix finish VERSION

alt text

Revertir Cambios

Ver el log

$ git log --pretty=oneline

alt text

Seleccionar la rama a la cual queremos regresar

$ git reset --hard d3c4b3900355e702f77930bec0c379b90a57b0d9

Cuando todo falla

Ver el registro del HEAD

$ git reflog

alt text

Ver con detalle

$ git log -g

alt text

Estratégia: Crear una rama a partir de log eliminado

$ git branch recover-branch 9fd2ad3
$ git log --pretty=oneline recover-branch

Recursos