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 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 se ha comentado por Sebastián Graf , si la rama local hizo no existe.
Si lo hiciera, sería necesario git checkout -B abranch origin/abranch)
Nota: con Git 2.23 (Q3 2019), eso usaría el nuevo comandogit switch :
git switch -c <branch> --track <remote>/<branch>
Si la rama existe en múltiples controles remotos y uno de ellos es nombrado por la checkout.defaultRemotevariable de configuración, usaremos ese para propósitos de desambiguación, incluso si <branch>no es único en todos los controles remotos.
Póngalo en, por ejemplo, checkout.defaultRemote=originpara retirar siempre ramas remotas desde allí si <branch>es ambiguo pero existe en el control remoto 'origen'.
Aquí, " -ces lo nuevo -b".
Primero, algunos antecedentes: el seguimiento significa que una sucursal local tiene su conjunto ascendente 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 será:
- crear / restablecer
branchal punto al que hace referencia origin/branch.
- cree la rama
branch(con git branch) y rastree la rama de seguimiento remoto origin/branch.
Cuando una rama local se ubicó en una rama a distancia de seguimiento, Git establece la rama (específicamente el branch.<name>.remotey branch.<name>.mergeentradas de configuración) para que git pullse apropiadamente combinar de la rama a distancia de seguimiento.
Este comportamiento puede modificarse mediante el branch.autosetupmergeindicador de configuración global . Esa configuración se puede anular mediante el uso de la --tracky --no-trackopciones, y cambió 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 flujo ascendente para ' branch'.
(Nota: git1.8.0 dejará de funcionar git branch --set-upstreamy lo reemplazará con git branch -u|--set-upstream-to: vea el anuncio de git1.8.0-rc1 )
Tener una sucursal aguas arriba registrada para una sucursal local:
- dile a git muestre la relación entre las dos ramas en
git statusygit branch -v .
- dirige
git pull sin argumentos para extraer del flujo ascendente cuando se extrae la nueva rama .
Consulte " ¿Cómo hacer que una rama git existente rastree una rama remota? " Para obtener más información.
git pull, mientras que algunas ramas me pedían una rama remota de la que sacar. Resulta que si usted, por primera vez, está revisando una rama remota que creó su par, git continúa y se agregabranch.<BNAME>.remote=original gitconfig local. Lo que luego te permite emitirgit pull. Sin embargo, si usted es el que crea la ramagit checkout -b BNAME, entonces git -por supuesto- no lo sabe. Por lo tanto, debe especificar su control remoto.If <branch>no se encuentra pero existe una rama de seguimiento en exactamente un control remoto (llámalo<remote>) con un nombre coincidente, trata como equivalente a$ git checkout -b <branch> --track <remote>/<branch>"branch.autoSetupMergeparaalwayssimplemente realizar lo que estamos hablando. Este valor predeterminado estrue, lo que significa que el seguimiento se realizará solo al retirar una rama remota.trueno configura el seguimiento para sucursales creadas localmente.¡No hay diferencia en absoluto!
1)
git checkout -b branch origin/branchSi no hay
--tracky no--no-track,--trackse supone como predeterminado. El valor predeterminado se puede cambiar con la configuraciónbranch.autosetupmerge.En efecto, 1) se comporta como
git checkout -b branch --track origin/branch.2)
git checkout --track origin/branch"Como una conveniencia",
--tracksin-bimplica-by el argumento de se-bsupone que es "rama". Las conjeturas son conducidas por la variable de configuraciónremote.origin.fetch.En efecto, 2) se comporta como
git checkout -b branch --track origin/branch.Como puede ver: no hay diferencia.
Pero se pone aún mejor:
3)
git checkout branchtambién es equivalente a
git checkout -b branch --track origin/branchsi "rama" aún no existe pero "origen / rama" sí 1 .Los tres comandos configuran el "flujo ascendente" de "rama" como "origen / rama" (o fallan).
Upstream se usa como punto de referencia sin argumentos
git status,git push,git mergey por lo tantogit pull(si está configurado como que (que es el valor predeterminado o casi el valor predeterminado)).P.ej
git statusle dice qué tan atrás o adelante se encuentra en sentido ascendente, 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 (denominado "simple") también exige que ambos nombres de rama sean iguales
fuente
El libro parece indicar que esos comandos producen el mismo efecto:
Eso es particularmente útil cuando las terminaciones de bash o oh-my-zsh git pueden obtener el
origin/serverfixnombre por usted, solo agregue--track(o-t) y estará en camino.fuente
No puedes crear una nueva rama con este comando
si tiene cambios que no están organizados.
Aquí hay un ejemplo:
Sin embargo, puede crear fácilmente una nueva rama con cambios sin etapas con el
git checkout -bcomando:fuente
origin/branch)origin/new-branchlugar deorigin/branch. ¿Estas consciente de ello?