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?