Diferencia entre git checkout --track origin/branch y git checkout -b branch origin/branch
¿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?
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/abranch
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ó 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.defaultRemote
variable 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=origin
para 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/branch
voluntad:
- crear/restablecer
branch
al punto al que hace referenciaorigin/branch
. - cree la rama
branch
(congit branch
) y realice un seguimiento de la rama de seguimiento remotoorigin/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>.remote
ybranch.<name>.merge
) para quegit pull
se fusione adecuadamente desde la sucursal de seguimiento remoto.
Este comportamiento se puede cambiar mediante elbranch.autosetupmerge
indicador de configuración global. Esa configuración se puede anular usando las opciones--track
y--no-track
y cambiarla más tarde usando git branch--set-upstream-to
.
Y git checkout --track origin/branch
hará 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-upstream
y 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 status
ygit 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.
¡No hay ninguna diferencia!
1)git checkout -b branch origin/branch
Si no hay --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
“Por conveniencia”, --track
sin -b
implicaciones -b
y se supone que el argumento -b
es “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/branch
si “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 push
y git merge
por lo tanto 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 adelante está con respecto a aguas arriba, si hay uno configurado.
git push
está 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