¿Qué es una rama de seguimiento?

173

¿Alguien puede explicar una "rama de seguimiento" como se aplica a git?

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

Una 'rama de seguimiento' en Git es una rama local que está conectada a una rama remota. Cuando empuja y tira de esa rama, automáticamente empuja y tira hacia la rama remota con la que está conectada.

Use esto si siempre tira de la misma rama ascendente a la nueva rama, y ​​si no desea usar "git pull" explícitamente.

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

Estoy leyendo " La guía pragmática de 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 maestra para que sea una rama de rastreo, pero desafortunadamente no cubre por qué una rama de rastreo es algo bueno o qué beneficios obtiene al configurar su rama maestra para que sea una rama de rastreo de su repositorio de origen .

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

Jerhinesmith
fuente
66
Una nota de terminología: la palabra track , en Git, está muy sobrecargada. Algunos archivos se rastrean y otros no se rastrean ; algunos nombres de rama se llaman ramas de seguimiento remoto; y puede usar la --trackopción para crear una rama (local) que tenga una de estas ramas de seguimiento remoto configurada como ascendente . La terminología ha evolucionado algo entre 2006 y 2019, por lo que diferentes personas a veces pueden significar algo diferente con cada una de estas palabras.
torek
Yo personalmente recomiendo usar la frase nombres de seguimiento remoto en lugar de ramas de seguimiento remoto , en parte porque la palabra rama también está bastante sobrecargada. Los nombres de seguimiento remoto son los que se parecen origin/master: están en su repositorio, pero son la forma en que su Git recuerda los nombres de las ramas como se ve en algún otro repositorio de Git en origin. Si luego usa la palabra upstream , que es el término más moderno, para decir que masterha origin/masterestablecido como upstream , puede evitar toda esta confusión de terminología.
torek

Respuestas:

141

El libro ProGit tiene una muy buena explicación :

Rastreo de ramas

Retirar una rama local desde una rama remota crea automáticamente lo que se llama una rama de seguimiento. Las ramas de seguimiento son ramas locales que tienen una relación directa con una rama remota. Si está en una rama y tipo de seguimiento git push, Git sabe automáticamente a qué servidor y rama presionar. Además, la ejecución git pullmientras se encuentra en una de estas ramas recupera 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 git pushy git pulltrabajar fuera de la caja sin otros argumentos. Sin embargo, puede configurar otras ramas de rastreo si lo desea, las que no rastrean ramas en origen y no rastrean la rama maestra. El caso simple es el ejemplo que acabas de ver, corriendo git checkout -b [branch] [remotename]/[branch]. Si tiene Git versión 1.6.2 o posterior, también puede usar la --tracktaquigrafía:

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

Para configurar una sucursal local con un nombre diferente al de la sucursal remota, puede usar fácilmente la primera versión con un nombre de sucursal local diferente:

$ 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 sfautomáticamente empujará hacia y desde origin/serverfix.

BONIFICACIÓN: git statusinformación extra

Con una bifurcación de seguimiento, git statusle dirá si está detrás de su bifurcación de seguimiento, ¡útil para recordarle que aún no ha presionado sus cambios! Se parece a esto:

$ git status
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
  (use "git push" to publish your local commits)

o

$ git status
On branch dev
Your branch and 'origin/dev' have diverged,
and have 3 and 1 different commits each, respectively.
  (use "git pull" to merge the remote branch into yours)

Assaf Lavie
fuente
21
Solo quería aclarar esto: "Verificar una rama local desde una rama remota crea automáticamente lo que se llama una rama de seguimiento". Eso es engañoso. Sin la opción --track, cualquier rama que cree no estará rastreando.
JohnO
@JohnO, tal vez quieras hablar de eso con el chico Pro Git. Todo el libro es el resultado de la colaboración de edición masiva IIRC.
Assaf Lavie
2
@ JohnO, de acuerdo con: sbf5.com/~cduan/technical/git/git-4.shtml : el seguimiento está activado de forma predeterminada y, por lo tanto, no es necesario.
Hank Lin el
50

A continuación se encuentran mis notas de aprendizaje personales sobre las ramas de seguimiento de GIT, espero que sea útil para futuros visitantes:

ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí


Rastreo de ramas y "git fetch":

ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí

hagrawal
fuente
Gracias por las notas! ¿Te importaría compartirlos todos si es posible? Gracias;
Aditya
@Aditya: Esta pregunta es para rastrear sucursales y he publicado todas mis notas sobre este tema. Si encuentro alguna otra pregunta relevante donde puedo publicar mis otras notas de GIT, entonces estaré encantado de hacerlo.
Hagrawal
¡Gracias! Lo que quise decir fue publicarlos en tu blog o algo :). Gracias de nuevo por buenas notas!
Aditya
@Aditya: Ah, ya veo. Ahora tienes claro lo que quieres decir. Me estoy quedando atrás en mi sitio web, pero tengo que crear uno para mí.
Hagrawal
43

El libro Pro Git menciona :

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

No exactamente. La pregunta SO " Tener dificultades para comprendergit-fetch " incluye:

No existe tal concepto de sucursales de seguimiento local , solo sucursales de seguimiento remoto .
También lo origin/masteres una rama de seguimiento remoto masteren el originrepositorio.

Pero en realidad, una vez que establece una relación de rama ascendente entre:

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

Luego puede considerarlo mastercomo una rama de seguimiento local : rastrea la rama de seguimiento remota origin/master que, a su vez, rastrea la rama maestra del repositorio ascendente origin .

texto alternativo

VonC
fuente
Aclaración de la imagen: Mi computadora tiene 2 confirmaciones antes del origen. De ahí provienen esos dos commits de master. Imagen: progit.org/book/ch3-5.html
idbrii
¿Estoy interpretando correctamente: si localmente tengo controles remotos configurados para origen y corriente arriba, entonces mi rama maestra local rastreará el origen directamente y corriente arriba indirectamente? por ejemplo: ¿cuándo git statusrecibiré un mensaje de seguimiento de confirmación con respecto a los repositorios originales y ascendentes? (Configuración: cloné el repositorio de alguien localmente, empujé mi clon a un nuevo repositorio en mi cuenta de GitHub y configuré localmente los controles remotos de origen y aguas arriba de mi repositorio de github y el repositorio clonado respectivamente)
SherylHohman
3
@SherylHohman No: una sucursal local no rastreará nada "directamente" o "indirectamente". Realizará un seguimiento de 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 master), y rastrear el origen (su bifurcación remota) para nuevas ramas (su PR o ramas de características): consulte stackoverflow.com/ a / 21847690/6309
VonC
2
@VonC: la declaración "No existe tal concepto de sucursales de seguimiento local, solo sucursales de seguimiento remoto". Es interesante porque hay una terminología tan conflictiva alrededor de las ramas. Este enlace a menudo referenciado web.archive.org/web/20130419172453/http://www.gitguys.com/… distingue entre "ramas de seguimiento" y "ramas de seguimiento remoto". Llaman a origen / maestro una "rama de seguimiento remota", estoy de acuerdo, pero luego llaman a "maestro" una "rama de seguimiento" también. ¿Qué es el seguimiento maestro? ¿Están equivocados o es un problema de terminología?
Howiecamp
2
@Howiecamp lo que ellos llaman una "rama de seguimiento llamada maestro" es simplemente un maestro de sucursal local con un origen / maestro de rama de seguimiento remoto asociado, aquí para memorizar el último SHA1 obtenido desde el origen con respecto a su rama maestra remota. Por lo tanto, es un "atajo" para designar "una sucursal local con una sucursal aguas arriba"
VonC
7

Así fue como agregué una rama de seguimiento para poder extraerla de mi nueva rama:

git branch --set-upstream-to origin/Development new-branch
agrublev
fuente