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/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 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.defaultRemote
variable 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=origin
para retirar siempre ramas remotas desde allí si <branch>
es ambiguo pero existe en el control remoto 'origen'.
Aquí, " -c
es 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
branch
al 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>.remote
y branch.<name>.merge
entradas de configuración) para que git pull
se apropiadamente combinar de la rama a distancia de seguimiento.
Este comportamiento puede modificarse mediante el branch.autosetupmerge
indicador de configuración global . Esa configuración se puede anular mediante el uso de la --track
y --no-track
opciones, y cambió 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 flujo ascendente para ' branch
'.
(Nota: git1.8.0 dejará de funcionar git branch --set-upstream
y 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 status
ygit 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=origin
al 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.autoSetupMerge
paraalways
simplemente realizar lo que estamos hablando. Este valor predeterminado estrue
, lo que significa que el seguimiento se realizará solo al retirar una rama remota.true
no configura el seguimiento para sucursales creadas localmente.¡No hay diferencia en absoluto!
1)
git checkout -b branch origin/branch
Si no hay
--track
y no--no-track
,--track
se 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",
--track
sin-b
implica-b
y el argumento de se-b
supone 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 branch
también es equivalente a
git checkout -b branch --track origin/branch
si "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 merge
y por lo tantogit pull
(si está configurado como que (que es el valor predeterminado o casi el valor predeterminado)).P.ej
git status
le dice qué tan atrás o adelante se encuentra en sentido ascendente, 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 (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/serverfix
nombre 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 -b
comando:fuente
origin/branch
)origin/new-branch
lugar deorigin/branch
. ¿Estas consciente de ello?