Diferencia entre git checkout --track origin/branch y git checkout -b branch origin/branch

Resuelto yorch asked hace 12 años • 4 respuestas

¿Alguien sabe la diferencia entre estos dos comandos para cambiar y rastrear una rama remota?

git checkout -b branch origin/branch
git checkout --track origin/branch

Creo que ambos realizan un seguimiento de la rama remota para poder enviar mis cambios a la rama en origen, ¿verdad?

¿Existen diferencias prácticas?

yorch avatar Apr 04 '12 05:04 yorch
Aceptado

Los dos comandos tienen el mismo efecto ( gracias a la respuesta de Robert Siemer por señalarlo ).

La diferencia práctica surge cuando se utiliza una sucursal local con un nombre diferente :

  • git checkout -b mybranch origin/abranchcreará mybranchy rastrearáorigin/abranch
  • git checkout --track origin/abranchsolo creará ' abranch', no una rama con un nombre diferente.

(Es decir, como comentó Sebastian Graf , si la sucursal local no existiera ya.
Si existiera, necesitaría git checkout -B abranch origin/abranch)


Nota: con Git 2.23 (tercer trimestre de 2019), se usaría el nuevo comandogit switch :

git switch -c <branch> --track <remote>/<branch>

Si la rama existe en varios controles remotos y uno de ellos recibe el nombre de la checkout.defaultRemotevariable de configuración, lo usaremos para fines de desambiguación, incluso si <branch>no es único en todos los controles remotos.
Configúrelo, por ejemplo, checkout.defaultRemote=originpara verificar siempre las ramas remotas desde allí si <branch>es ambigua pero existe en el control remoto de "origen".

Aquí, ' -c'está lo nuevo' -b'.


Primero, algunos antecedentes: el seguimiento significa que una sucursal local tiene su upstream configurado en una sucursal remota:

# git config branch.<branch-name>.remote origin
# git config branch.<branch-name>.merge refs/heads/branch

git checkout -b branch origin/branchvoluntad:

  • crear/restablecer branchal punto al que hace referencia origin/branch.
  • cree la rama branch(con git branch) y realice un seguimiento de la rama de seguimiento remoto origin/branch.

Cuando se inicia una sucursal local a partir de una sucursal de seguimiento remoto, Git configura la sucursal (específicamente las entradas de configuración branch.<name>.remoteybranch.<name>.merge ) para que git pullse fusione adecuadamente desde la sucursal de seguimiento remoto.
Este comportamiento se puede cambiar mediante el branch.autosetupmergeindicador de configuración global. Esa configuración se puede anular usando las opciones --tracky --no-tracky cambiarla más tarde usando git branch --set-upstream-to.


Y git checkout --track origin/branchhará lo mismo que git branch --set-upstream-to):

 # or, since 1.7.0
 git branch --set-upstream upstream/branch branch
 # or, since 1.8.0 (October 2012)
 git branch --set-upstream-to upstream/branch branch
 # the short version remains the same:
 git branch -u upstream/branch branch

También establecería el upstream para ' branch'.

(Nota: git1.8.0 quedará obsoleto git branch --set-upstreamy lo reemplazará con git branch -u|--set-upstream-to: ver anuncio de git1.8.0-rc1 )


Tener una sucursal ascendente registrada para una sucursal local:

  • Dile a git que muestre la relación entre las dos ramas en git statusygit branch -v .
  • indica git pull sin argumentos que se extraiga del flujo ascendente cuando se retira la nueva rama .

Consulte "¿ Cómo se puede hacer que una rama git existente rastree una rama remota? " para obtener más información.

VonC avatar Apr 03 '2012 22:04 VonC

¡No hay ninguna diferencia!

1)git checkout -b branch origin/branch

Si no hay --tracky no --no-track, --trackse asume como predeterminado. El valor predeterminado se puede cambiar con la configuración branch.autosetupmerge.

En efecto, 1) se comporta como git checkout -b branch --track origin/branch.

2)git checkout --track origin/branch

“Por conveniencia”, --tracksin -bimplicaciones -by se supone que el argumento -bes “rama”. La conjetura está impulsada por la variable de configuración remote.origin.fetch.

En efecto, 2) se comporta como git checkout -b branch --track origin/branch.

Como puedes ver: no hay diferencia.

Pero se pone aún mejor:

3)git checkout branch

También es equivalente a git checkout -b branch --track origin/branchsi “sucursal” aún no existe pero “origen/sucursal” sí 1 .


Los tres comandos configuran el "aguas arriba" de "sucursal" como "origen/sucursal" (o fallan).

Upstream se utiliza como punto de referencia de sin argumentos git status, git pushy git mergepor lo tanto git pull(si se configura así (que es el valor predeterminado o casi el valor predeterminado)).

Por ejemplo, git statusle indica qué tan atrás o adelante está con respecto a aguas arriba, si hay uno configurado.

git pushestá configurado para impulsar la rama actual hacia arriba de forma predeterminada 2 desde git 2.0.

1 ...y si "origen" es el único control remoto que tiene "rama"
2 el valor predeterminado (llamado "simple") también exige que ambos nombres de rama sean iguales

Robert Siemer avatar Apr 21 '2015 22:04 Robert Siemer