Syncing

Sincronización de Git

SVN utiliza un único repositorio centralizado para funcionar como un centro de comunicaciones para los desarrolladores; además, a la hora de colaborar, se pasan conjuntos de cambios entre las copias de trabajo de los desarrolladores y el repositorio central. El modelo de colaboración distribuida de Git es completamente diferente, ya que proporciona a cada desarrollador su propia copia del repositorio, con su propio historial local y estructura de ramas. Los usuarios, por lo general, necesitan compartir una serie de confirmaciones, en lugar de un solo conjunto de cambios. En vez de confirmar un conjunto de cambios de una copia de trabajo en el repositorio central, Git te permite compartir ramas enteras entre repositorios.

El comando git remote es una parte de un sistema más amplio que se encarga de sincronizar los cambios. Los registros inscritos mediante el comando git remote se utilizan junto con los comandos git fetch, git push y git pull. Todos estos comandos tienen sus propias responsabilidades de sincronización, que pueden consultarse en los enlaces correspondientes.

Git remote

El comando git remote te permite crear, ver y eliminar conexiones a otros repositorios. Las conexiones remotas se asemejan más a marcadores que a enlaces directos con otros repositorios. En lugar de brindar acceso en tiempo real a otro repositorio, funcionan como prácticos nombres que pueden emplearse para hacer referencia a una URL no tan sencilla.

Por ejemplo, en el siguiente diagrama pueden verse dos conexiones remotas desde tu repositorio hasta el repositorio central y el repositorio de otro desarrollador. En lugar de hacer referencia a ellas mediante sus URL completas, puedes pasar los atajos del origen y John a otros comandos de Git.

Using git remote to connect other repositories

Descripción general del uso de git remote

El comando git remote es, en esencia, una interfaz para gestionar una lista de entradas remotas almacenadas en el archivo ./.git/config del repositorio. Para ver el estado de la lista remota, se utilizan los siguientes comandos.

Visualización de configuraciones de git remote

git remote

Enumera las conexiones remotas que tienes con otros repositorios.

git remote -v

Lo mismo que el comando anterior, pero incluye la URL de cada conexión.

Creación y modificación de configuraciones de git remote

El comando git remote es también un método sencillo y útil para modificar el archivo ./.git/config de un repositorio. Los comandos que se presentan a continuación te permiten gestionar las conexiones con otros repositorios. Los siguientes comandos modificarán el archivo /.git/config del repositorio. El resultado de dichos comandos también puede conseguirse editando directamente el archivo ./.git/config con un editor de texto.

git remote add <name> <url>

Crea una nueva conexión a un repositorio remoto. Tras añadir el repositorio remoto, podrás usar <name> como un práctico atajo para <url> en otros comandos de Git.

git remote rm <name>

Elimina la conexión con el repositorio remoto que lleva el nombre <name>.

git remote rename <old-name> <new-name>

Cambia el nombre de una conexión remota de <old-name> a <new-name>.

Análisis de git remote

Git está diseñado para proporcionar a cada desarrollador un entorno de desarrollo totalmente aislado. Esto significa que la información no se envía automáticamente entre repositorios. En su lugar, los desarrolladores deben incorporar cambios de confirmaciones de nivel superior en su repositorio local o enviar sus confirmaciones locales al repositorio central de forma manual. El comando git remote es una manera más simple de enviar URL a estos comandos de “compartición”.

Origen remoto

Al clonar un repositorio con git clone, se crea automáticamente una conexión remota llamada “origin” (origen) que apunta al repositorio clonado. Esto resulta útil para los desarrolladores que crean una copia local de un repositorio central, ya que permite incorporar cambios de nivel superior o publicar confirmaciones locales de forma sencilla. Este comportamiento es también la razón por la que la mayoría de los proyectos basados en Git llaman “origen” a su repositorio central.

URL de repositorios

Git admite numerosas formas de hacer referencia a un repositorio remoto. Una de las maneras más fáciles de acceder a uno de ellos es a través de los protocolos HTTP y SSH. El protocolo HTTP brinda un acceso sencillo, anónimo y de solo lectura a un repositorio. Por ejemplo:

http://host/path/to/repo.git

Sin embargo, por lo general, no se pueden enviar confirmaciones a una dirección HTTP (de todos modos, no convendría permitir envíos anónimos). Para acceder con permisos de lectura y escritura, debes usar SSH en su lugar:

ssh://user@host/path/to/repo.git

Necesitarás una cuenta SSH válida en el equipo host, pero, aparte de eso, Git admite el acceso autenticado mediante SSH listo para usarse. Las modernas y seguras soluciones de alojamiento de terceros, como Bitbucket.com, te proporcionarán estas URL.

Comandos de git remote

El comando git remote es uno de los muchos comandos de Git que se combinan con “subcomandos” adicionales. A continuación, encontrarás un análisis de los subcomandos de git remote más utilizados.

ADD <NAME> <URL>

Añade un registro en ./.git/config para el repositorio remoto llamado <name> en su URL <url>.

Acepta la opción -f, que aplicará el comando git fetch <name> inmediatamente después de que se cree el registro remoto.

Acepta la opción --tags, que aplicará el comando git fetch <name> de inmediato e importará todas las etiquetas del repositorio remoto.

RENAME <OLD> <NEW>

Actualiza ./.git/config para cambiar el nombre del registro de <OLD> a <NEW>. Se actualizan todas las ramas de seguimiento remoto y los ajustes de configuración del repositorio remoto.

REMOVE or RM <NAME>

Modifica ./.git/config y elimina el repositorio remoto llamado <NAME>. Se eliminan todas las ramas de seguimiento remoto y los ajustes de configuración del repositorio remoto.

GET-URL <NAME>

Genera las URL de un registro remoto.

Acepta --push. Se consultan las URL del comando push en lugar de las del comando fetch.

Con --all, se enumerarán todas las URL de los repositorios remotos.

SHOW <NAME>

Genera información de alto nivel sobre el repositorio remoto <NAME>.

PRUNE <NAME>

Elimina las ramas locales de <NAME> que no estén presentes en el repositorio remoto.

Acepta la opción --dry-run, que enumerará las ramas que estén configuradas para cortarse, pero en realidad no las cortará.

Ejemplos de git remote

Además del origen, suele ser conveniente tener una conexión con los repositorios de tus compañeros de equipo. Por ejemplo, si tu compañero John cuenta con un repositorio de acceso público en dev.example.com/john.git, puedes añadir una conexión de la siguiente manera:

git remote add john http://dev.example.com/john.git

Disponer de este tipo de acceso a los repositorios de cada desarrollador posibilita la colaboración fuera del repositorio central. Esto puede resultar de mucha utilidad para los equipos pequeños que trabajan en un proyecto de gran envergadura.

Visualización de las conexiones remotas

De forma predeterminada, el comando git remote mostrará las conexiones remotas con otros repositorios previamente almacenadas. Esto generará una salida de una sola línea con los nombres de los “marcadores” de los repositorios remotos.

$ git remote
origin
upstream
other_users_repo

Al invocar git remote con la opción -v, se imprimirá la lista de nombres de repositorios guardados como marcadores y, además, la URL del repositorio correspondiente. La opción -v significa “verboso”. A continuación, se muestra un ejemplo de salida verbosa de git remote.

git remote -v
origin  git@bitbucket.com:origin_user/reponame.git (fetch)
origin  git@bitbucket.com:origin_user/reponame.git (push)
upstream    https://bitbucket.com/upstream_user/reponame.git (fetch)
upstream    https://bitbucket.com/upstream_user/reponame.git (push)
other_users_repo    https://bitbucket.com/other_users_repo/reponame (fetch)
other_users_repo    https://bitbucket.com/other_users_repo/reponame (push)

Adición de repositorios remotos

El comando git remote add creará un nuevo registro de conexión con un repositorio remoto. Tras añadir un repositorio remoto, podrás usar <name> como un práctico atajo para <url> en otros comandos de Git. Para obtener más información sobre la sintaxis de URL aceptada, consulta la sección "URL de repositorios" de este artículo. Este comando creará un nuevo registro en el archivo ./.git/config del repositorio. A continuación, se muestra un ejemplo de actualización de este archivo de configuración:

$ git remote add fake_test https://bitbucket.com/upstream_user/reponame.git; [remote "remote_test"] 
   url = https://bitbucket.com/upstream_user/reponame.git 
   fetch = +refs/heads/*:refs/remotes/remote_test/*

Inspección de un repositorio remoto

Se puede añadir el subcomando show a git remote para presentar una salida detallada sobre la configuración de un repositorio remoto. Esta salida incluirá una lista de ramas asociadas al repositorio remoto y, además, los extremos conectados para la captura y el envío.

git remote show upstream
* remote upstream
   Fetch URL: https://bitbucket.com/upstream_user/reponame.git
   Push URL: https://bitbucket.com/upstream_user/reponame.git
   HEAD branch: master
   Remote branches:
      master tracked
      simd-deprecated tracked
      tutorial tracked
   Local ref configured for 'git push':
      master pushes to master (fast-forwardable)

Captura e incorporación de cambios de repositorios remotos de Git

Una vez configurado un registro remoto mediante el uso del comando git remote, el nombre del repositorio remoto puede pasarse como un argumento a otros comandos de Git para comunicarse con el repositorio remoto. Tanto git fetch como git pull pueden utilizarse para leer desde un repositorio remoto. Ambos comandos tienen diferentes operaciones, que se explican con más detalle en sus respectivos enlaces.

Aplicación del comando push en repositorios remotos de Git

El comando git push se emplea para escribir en un repositorio remoto.

git push <remote-name> <branch-name>

En este ejemplo, se cargará el estado local de <branch-name> en el repositorio remoto especificado por <remote-name>.

Cambio de nombre y eliminación de repositorios remotos

git remote rename <old-name> <new-name>

El comando git remote rename se explica por sí mismo. Al ejecutarse, este comando cambiará el nombre de una conexión remota de <old-name> a <new-name>. Además, modificará el contenido de ./.git/config para cambiar también el nombre del registro del repositorio remoto correspondiente.

git remote rm <name>

El comando git remote rm eliminará la conexión con el repositorio remoto especificado por el parámetro <name>. Para mostrarlo, vamos a deshacer la adición del repositorio remoto de nuestro último ejemplo. Si ejecutamos git remote rm remote_test y, a continuación, examinamos el contenido de ./.git/config, podemos ver que el registro [remote "remote_test"] ya no está ahí.