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


¿Alguien conoce 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 que pueda enviar mis cambios a la rama en origen, ¿verdad?

¿Hay alguna diferencia práctica??

Gracias!

Author: Zoe, 2012-04-04

3 answers

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

La diferencia práctica viene cuando se usa una rama local llamada diferentemente :

  • {[2] } creará mybranch y rastreará origin/abranch
  • git checkout --track origin/abranch solo creará 'abranch', no una rama con un nombre diferente.

(Es decir, como comentó por Sebastian Graf , si la rama local existiera no ya.
Si lo hiciera, necesitarías git checkout -B abranch origin/abranch)


Primero, algunos antecedentes: Seguimiento significa que una rama local tiene su upstream establecido en una rama remota:

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

git checkout -b branch origin/branch will

  • crear/restablecer branch al punto referenciado por origin/branch.
  • crear la rama branch (con git branch) y rastrea la rama de seguimiento remoto origin/branch.

Cuando se inicia una rama local desde una rama de seguimiento remoto, Git configura la rama (específicamente las entradas de configuración branch.<name>.remote y branch.<name>.merge) para que git pull se combine apropiadamente desde la rama de seguimiento remoto.
Este comportamiento se puede cambiar a través del indicador de configuración global branch.autosetupmerge. Esta configuración puede ser anulada usando las opciones --track y --no-track, y cambiada más tarde usando git branch --set-upstream-to.


Y git checkout --track origin/branch hará lo mismo:

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

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

(Nota: git1.8.0 desaprobar git branch --set-upstream y reemplazarlo con git branch -u|--set-upstream-to: ver git1.8.0-rc1 anunciar)


Tener una rama ascendente registrada para una rama local:

  • dile a git que muestre la relación entre las dos ramas en git status y git branch -v.
  • dirige git pull sin argumentos para extraer desde el upstream cuando la nueva rama es extraída.

Ver " Cómo hacer una rama git existente ¿rastrear una rama remota?" para más.

 191
Author: VonC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-17 13:20:39

¡No hay ninguna diferencia!

1) git checkout -b branch origin/branch

Si no --track y no --no-track, --track se 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

"Como una conveniencia", --track sin -b implica -b y el argumento a -b se supone que es "rama". La conjetura es conducida 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/branch si " branch "no existe todavía pero" origin/branch " sí1.


Los tres comandos establecen el "upstream" de "branch" como "origin/branch" (o fallan).

Upstream se utiliza como punto de referencia de argument-less git status, git push, git merge y así git pull (si se configura así (que es el valor predeterminado o casi el valor predeterminado)).

Por ejemplo, git status le indica qué tan atrás o adelantado está de upstream, si hay uno configurado.

git push está configurado para empujar la rama corriente arriba de forma predeterminada2 desde git 2.0.

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

 22
Author: Robert Siemer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-26 14:22:02

El libro parece indicar que esos comandos producen el mismo efecto:

El caso simple es el ejemplo que acaba de ver, ejecutando git checkout-b [rama] [remotename]/[rama]. Si tienes Git versión 1.6.2 o más tarde, también puede usar la abreviatura track track:

$ git checkout --track origin/serverfix 
Branch serverfix set up to track remote branch serverfix from origin. 
Switched to a new branch 'serverfix' 

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

$ git checkout -b sf origin/serverfix

Eso es particularmente útil cuando tus terminaciones de git bash o oh-my-zsh son capaces de extraer el nombre origin/serverfix por ti - solo agrega --track (o -t) y ya estás en camino.

 5
Author: Pat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-04-14 15:12:24