Distributed Version Control

Local y Remoto

Si queremos trabajar en equipo en nuestro código es necesario compartir el repositorio, para ello existen varias entidades como github que nos ayudan a distribuirlo en las maquinas de cada uno de los colaboradores (peers)

git clone https://github.com/nusco/cookbook.git

De esta manera se obtiene el repositorio desde una maquina (tener en cuenta que existen repositorios privados que requieren ciertos permisos para obtenerlos).

Se descargan los archivos, el modelo git de base de datos de nuestro proyecto y un archivo particular .git/config

cat .git/config
[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
    ignorecase = true
    precomposeunicode = true
[remote "origin"]
    url = https://github.com/nusco/cookbook.git
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master

Se pueden tener varios repositorios remotos, pero cuando se hace clone el repositorio por primera vez git asigna el por defecto [remote "origin"] El archivo también describe que contamos con un branch principal [branch "master"]

Si se consulta las ramas del repositorio desde la maquina:

git branch
* master

pero si adicionamos el flag --all podremos visualizar todas las ramas

git branch --all
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/lisa
  remotes/origin/master
  remotes/origin/nogood
  remotes/origin/spaghetti

incluye todas las referencias incluyendo las que están en el control remoto, branches remotas y la posición actual de HEAD

Descubriendo los branch del repositorio

Para descubrir los branch del repositorio descargado:

git show-ref master
704182f5e2925fbdc03f9874d35ce696c21e9a3d refs/heads/master
704182f5e2925fbdc03f9874d35ce696c21e9a3d refs/remotes/origin/master

como se puede observar tenemos dos master, una es la local y la otra es la master remota, pero están apuntando al mismo commit (hash), están sincronizadas, se pueden hacer commits a la local y posteriormente se puede actualizar la remota con un push command

Nuevos commit en local branch

Cuando creamos un nuevo commit en el local branch, es decir un nuevo cambio y consultamos las referencias:

git show-ref master
dc4b41e453c09a123842ece192665dae5fb9a5e9 refs/heads/master
704182f5e2925fbdc03f9874d35ce696c21e9a3d refs/remotes/origin/master

notamos que el branch local tiene un hash diferente al repositorio remoto.

Ahora podemos sincronizar el branch remoto:

git push

podemos consultar nuevamente las referencias de master:

git show-ref master
dc4b41e453c09a123842ece192665dae5fb9a5e9 refs/heads/master
dc4b41e453c09a123842ece192665dae5fb9a5e9 refs/remotes/origin/master

y se ha actualizado y el branch ahora apunta al último commit.

Push desde otro peer

Se pueden presentar conflictos en el momento de hacer push al branch remoto, por que puede que otro peer (otra maquina o compañero del proyecto) haya hecho un push de uno o mas commit con antelación.

Con git se debe tener un orden especifico para el trabajo en equipo, para el escenario anterior se puede resolver de dos maneras, la primera y no muy recomendada:

git merge -f

el flag "-f" hace que se force el merge, pero esto puede traer mas conflictos entre los commit. La segunda forma es hacer fetch antes de hacer push a la rama remota:

git fetch

asi se tiene en cuenta los commit que otros peers han hecho en la rama remota, y se puede proceder a hacer un merge antes del push de los commits locales:

git merge

existe un comando que resume dos: el git fetch y el git merge en mi local branch y es:

git pull

esta acción hace fetch y merge en mi local branch, posteriormente y si se resulven los conflictos si los hay se puede hacer:

git push

Last updated

Was this helpful?