Supongamos que Alicia ha empezado un proyecto con un repositorio git en /home/alice/project, y que Bob, que tiene un directorio en la home de la misma maquina quiere contribuir.
Bob empieza con
$ git clone /home/alice/project myrepo
Esto le crearía un nuevo directorio llamado ‘myrepo’ que contendría un clon del repositorio de Alicia. El clon es idéntico que el proyecto original, poseyendo su propia copia del historial de cambios.
Bob realiza algunos cambios y hace un commit de los mismos
$ git commit -a
Cuando ha finalizado los cambios, le dice a Alicia que haga un pull del repositorio en /home/bob/myrepo. Ella lo hace con:
$ cd /home/alice/project
$ git pull /home/bob/myrepo
Esto actualizará los cambios de la branch del repositorio de bob Bob denominada ‘master’. Alicia puede solicitar una branch diferente añadiendo el nombre de la branch al final del comando git pull.
Esto hace un merge de los cambios de Bob en su repositorio, ‘git whatchanged’ nos mostrará los nuevos commits. Si Alicia ha realizados sus propios cambios, entonces los cambios de Bob harán un merge con estos, y ella tendrá que hacer un fix para solucionar los conflictos.
Una Alicia más prudente querría examinar los cambios de Bob antes de hacer un pull. Ella podría hacerlo fácilmente creando una branch temporal solo para el propósito de estudiar los cambios de Bob.
$ git fetch /home/bob/myrepo master:bob-incoming
que importa los cambios del master de Bob en una nueva branch denominada bob-incoming (A diferencia de git pull, git fetch solo busca una copia de bob)
(A diferencia del git pull, el git fetch, solo obtiene una copia de la linea de Bob de desarrollo sin hacer la fusión)
Entonces
$ git whatchanged -p master..bob-incoming
nos muestra el listado de todos los cambios realizados por bob desde que empezó su propia branch de la branch de Alicia.
Después de examinar estos cambios, y posiblemente hacer algunos fixes, Alicia puede hacer un pull de los cambios en su master branch.
$ git checkout master
$ git pull . bob-incoming
El último comando es un pull desde l abranch de “bob-incoming” en el repositorio de Alicia.
Más tarde, Bob podrá actualizar su repositorio con los últimos cambios de Alicia, utilizando
$ git pull
Ten en cuenta que el no necesita tener el path del repositorio de Alicia, cuando bob clono el repositorio de Alicia, git almacenó la localización de su repositorio en el fichero .git/remotes/origin, y esta localización fué utilizada por defecto en los pulls
Bob también se dará cuenta que se ha creado una nueva branch en su directorio que el no creo:
$ git branch
* master
origin
La origin branch, que fué creada automáticamente por el ‘git clone’, es una copia de la master branch de Alicia, Bob nunca podrá hacer un commit de ella.
Si Bob decidiera trabajar desde un nuevo host, el podría hacer clones y pulls utilizando el protocolo ssh
$ git clone alice.org:/home/alice/project myrepo
Alternativamente, git tiene un protocolo nativo, o puede utilizar rsync o http.