2011-01-14 13 views
81

¿Alguien puede explicar una "rama de seguimiento" tal como se aplica a git?Git: ¿Qué es una rama de seguimiento?

Aquí es la definición de git-scm.com:

A 'rama de seguimiento' en Git es un rama local que está conectado a un mando a distancia rama. Cuando empuja y tira de esa rama , empuja automáticamente y tira a la rama remota con la que está conectado .

Uso esto si tire siempre de la misma rama aguas arriba en la nueva rama, y ​​si usted no desea utilizar "git pull" de forma explícita.

Desafortunadamente, ser nuevo en git y venir de SVN, esa definición no tiene absolutamente ningún sentido para mí.

Estoy leyendo "The Pragmatic Guide to Git" (gran libro, por cierto), y parecen sugerir que rastrear ramas es algo bueno y que después de crear su primer control remoto (origen, en este caso), debería configure su rama principal para que sea una rama de seguimiento, pero desafortunadamente no cubre por qué una rama de seguimiento es buena o qué beneficios obtiene configurando su rama principal como una rama de seguimiento de su repositorio de origen .

¿Puede alguien por favor enlighten me (en inglés)?

Respuesta

63

El ProGit book tiene a very good explanation:

Ramas de seguimiento

La retirada de una rama local de una rama remota automáticamente crea lo que se llama una rama de seguimiento. Las sucursales de seguimiento son sucursales locales que tienen una relación directa con una sucursal remota. Si estás en una rama de seguimiento y escribes git push, Git sabe automáticamente a qué servidor y qué rama acceder. Además, al ejecutar git pull mientras está en una de estas ramas, se obtienen todas las referencias remotas y luego se fusiona automáticamente en la rama remota correspondiente.

Cuando clona un repositorio, generalmente crea automáticamente una rama maestra que rastrea el origen/maestro. Es por eso que git push y git pull trabajan de la caja sin más argumentos. Sin embargo, puede configurar otras ramas de seguimiento si lo desea, las que no rastrean las sucursales en el origen y no rastrean la rama principal. El caso simple es el ejemplo que acabas de ver, ejecutando git checkout -b [branch] [remotename]/[branch]. Si tiene Git versión 1.6.2 o posterior, también puede utilizar la abreviatura --track:

$ git checkout --track origin/serverfix 
Branch serverfix set up to track remote branch refs/remotes/origin/serverfix. 
Switched to a new branch "serverfix" 

Para establecer una sucursal local con un nombre diferente a la rama remota, puede utilizar simplemente la primera versión con una nombre diferente rama local:

$ git checkout -b sf origin/serverfix 
Branch sf set up to track remote branch refs/remotes/origin/serverfix. 
Switched to a new branch "sf" 

Ahora, su sucursal local sf empujará automáticamente y tire de origin/serverfix.

+12

Sólo quería aclarar esto: "La retirada de una rama local de un mando a distancia Branch crea automáticamente lo que se llama una rama de seguimiento ". Eso es engañoso. Sin la opción --track cualquier rama que crees no estará rastreando. – JohnO

+0

@JohnO, podría querer hablar del tipo de Pro Git. Todo el libro es el resultado de la colaboración de edición masiva IIRC. –

24

libro The Progit menciona:

ramas de seguimiento son ramas locales que tienen una relación directa con una rama remota

No

exactamente. la cuestión SO "Having a hard time understanding git-fetch" incluye:

No hay tal concepto de seguimiento ramas locales, solamente de seguimiento remoto ramas.
Así origin/master es una rama de seguimiento remoto para master en el repositorio origin.

Pero, en realidad, una vez que se establece una upstream branch relationship entre:

  • una sucursal local como master
  • y una rama de seguimiento remoto como origin/master

entonces se puede considerar master como rama local de seguimiento: rastrea el control remoto Rack de estanteríaorigin/master que, a su vez rastrean la rama principal del upstream repoorigin.

alt text

+0

Aclaración de la imagen: Mi PC se compromete 2 antes de su origen. Ahí es donde esos dos se comprometen fuera del maestro. Imagen: http://progit.org/book/ch3-5.html – idbrii

+0

¿Estoy interpretando correctamente: si localmente tengo remotos configurados para el origen y el flujo ascendente, entonces mi rama maestra local rastreará el origen directamente, y aguas arriba indirectamente? por ejemplo: cuando 'git status' voy a recibir un mensaje de seguimiento de compromiso con respecto a los repos de origen y ascendente? (Configuración: cloné el repositorio de alguien localmente, envié mi clon a un nuevo repositorio en mi cuenta de GitHub y localmente establecí los controles remotos de origen y ascendente a mi repo de github y al repositorio clonado clonado, respectivamente). – SherylHohman

+3

@SherylHohman No: una sucursal local no rastreará nada "directamente" o "indirectamente". Seguirá la rama de seguimiento remoto que le asignará. En el caso de una bifurcación, la mejor práctica es rastrear en sentido ascendente (el repositorio original) para ramas comunes (como maestra), y rastrear origen (su bifurcación remota) para nuevas ramificaciones (su PR o ramas de característica): vea https: // stackoverflow.com/a/21847690/6309 – VonC

3

Así fue como he añadido una rama de seguimiento para que pueda tirar de ella en mi nueva rama:

git branch --set-upstream-to origin/Development new-branch 
Cuestiones relacionadas