¿Cómo puedo cambiar a otra rama en git?

222

¿Cuál de estas líneas es correcta?

git checkout 'another_branch'

O

git checkout origin 'another_branch'

O

git checkout origin/'another_branch'

¿Y cuál es la diferencia entre estas líneas?


Benyamin Jafari
fuente
32
git checkout [branch]para la mayoría de los usuarios que llegan a esta pregunta
JGallardo

Respuestas:

225

Si another_branchya existe localmente y no está en esta rama, git checkout another_branchcambie a la rama.

Si another_branchno existe pero origin/another_branchsí, entonces git checkout another_branches equivalente a git checkout -b another_branch origin/another_branch; git branch -u origin/another_branch. Eso es para crear another_branchdesde origin/another_branchy conjunto origin/another_branchcomo el de aguas arriba another_branch.

Si no existe ninguno, git checkout another_branchdevuelve el error.

git checkout origin another_branchdevuelve error en la mayoría de los casos. Si origines una revisión y another_branches un archivo, comprueba el archivo de esa revisión, pero lo más probable es que no sea lo que espera. originse usa principalmente en git fetch, git pully git pushcomo remoto, un alias de la url para el repositorio remoto.

git checkout origin/another_branchtiene éxito si origin/another_branchexiste. Conduce a estar en estado HEAD separado, no en ninguna rama. Si realiza nuevas confirmaciones, no se podrá acceder a las nuevas confirmaciones desde ninguna rama existente y ninguna de las ramas se actualizará.

ACTUALIZACIÓN :

Como se lanzó 2.23.0, con él también podemos usar git switchpara crear y cambiar ramas.

Si fooexiste, intente cambiar a foo:

git switch foo

Si foono existe y origin/fooexiste, intente crear foodesde origin/fooy luego cambie a foo:

git switch -c foo origin/foo
# or simply
git switch foo

De manera más general, si foono existe, intente crear foodesde una referencia o confirmación conocida y luego cambie a foo:

git switch -c foo <ref>
git switch -c foo <commit>

Si mantenemos un repositorio en Gitlab y Github al mismo tiempo, el repositorio local puede tener dos controles remotos, por ejemplo, originpara Gitlab y githubpara Github. En este caso el repositorio tiene origin/fooy github/foo. git switch foose quejará fatal: invalid reference: foo, porque no sabe de qué referencia, origin/fooo github/foocrear foo. Necesitamos especificarlo con git switch -c foo origin/fooo git switch -c foo github/foosegún la necesidad. Si queremos crear ramas desde ambas ramas remotas, es mejor usar nombres distintivos para las nuevas ramas:

git switch -c gitlab_foo origin/foo
git switch -c github_foo github/foo

Si fooexiste, intente recrear / forzar la creación foodesde (o restablecer foo) una referencia o confirmación conocida y luego cambie a foo:

git switch -C foo <ref>
git switch -C foo <commit>

que son equivalentes a:

git switch foo
git reset [<ref>|<commit>] --hard

Intente cambiar a un HEAD separado de una referencia o confirmación conocida:

git switch -d <ref>
git switch -d <commit>

Si solo desea crear una rama pero no cambiarla, git branchúsela. Intente crear una rama a partir de una referencia o confirmación conocida:

git branch foo <ref>
git branch foo <commit>
ElpieKay
fuente
24
Esta respuesta es correcta (como siempre, y está votada), pero agregaré un comentario que puede ser útil: el git checkoutcomando hace demasiadas cosas, en mi opinión. Es por eso que hay tantos modos de operación aquí. Si lo único que git checkouthiciera fue cambiar de rama, la respuesta sería simple, pero también puede crear ramas e incluso extraer archivos de confirmaciones específicas sin cambiar de rama.
torek
11
esta es la respuesta correcta, pero muestra cómo git está un poco jodido en la línea de comando. git checkout para cambiar de rama?
thang
3
@thang Bueno, con la versión 2.23.0, esto se soluciona: ahora puede usar git switchpara cambiar a una rama.
legends2k
Switch no parece funcionar para esta versión de git. ¿Qué uso para cambiar a una rama diferente en esta versión de git? C: \ widget> git --version git versión 2.11.0.windows.3 C: \ widget> git switch master git: 'switch' no es un comando git. Ver 'git --help'. C: \ widget>
Juan
1
@John usa git checkouten su lugar para versiones antiguas, que también funciona en versiones modernas.
ElpieKay
66

Cambiando a otra rama en git. Respuesta directa,

git-checkout - Cambia ramas o restaura archivos de árbol de trabajo

git fetch origin         <----this will fetch the branch
git checkout branch_name <--- Switching the branch

Antes de cambiar la rama, asegúrese de no tener ningún archivo modificado, en ese caso, puede confirmar los cambios o puede guardarlos.

puntero
fuente
El último comando me lleva al estado HEAD separado. Significa que uno no puede editar la rama.
2
La rama que está tratando de pagar no se recupera, entonces debe buscarla antes de pagar. Puede omitir la búsqueda si la rama está actualizada y luego usar git checkout branchname.
danglingpointer
¿No sería suficiente realizar un "git pull" después de haber cambiado a la rama?
pull también está bien, pull realiza la búsqueda y se fusiona en el fondo. No veo ninguna diferencia.
danglingpointer
17

[ git checkout "branch_name"]

es otra forma de decir:

[ git checkout -b branch_name origin/branch_name]

en caso de que "branch_name" exista solo de forma remota.

[ git checkout -b branch_name origin/branch_name] es útil en caso de que tenga múltiples controles remotos.

Con respecto a [ git checkout origin 'another_branch'] no estoy seguro de que esto sea posible, AFAK puede hacerlo usando el comando "buscar" - [ git fetch origin 'another_branch']

Mehdi
fuente
Conozco el comando "git checkout -b branchName" para crear otra rama. Esta no era la pregunta!
10

Con Git 2.23 en adelante, uno puede usar git switch <branch name>para cambiar de rama.

gkw
fuente
6

Lo que funcionó para mí es lo siguiente:

Cambie a la rama necesaria:

git checkout -b BranchName

Y luego saqué el "maestro" por:

git pull origin master
Karam Qusai
fuente
6

Comandos útiles para trabajar en la vida diaria:

git checkout -b "branchname" ->  creates new branch
git branch                   ->  lists all branches
git checkout "branchname"    ->  switches to your branch
git push origin "branchname" ->  Pushes to your branch
git add */filename           -> Stages *(All files) or by given file name
git commit -m "commit message" -> Commits staged files
git push                     -> Pushes to your current branch
pola
fuente
5

Si desea que la rama rastree la rama remota, lo cual es muy importante si va a confirmar cambios en la rama y extraer cambios, etc., debe usar agregar un -t para el pago real, por ejemplo: git checkout -t branchname

Matthew Joughin
fuente
4

Cheque : git branch -a

Si solo tienes una rama. Luego haz los pasos a continuación.

  • Paso 1 : git config --list
  • Paso 2 : git config --unset remote.origin.fetch
  • Paso 3 : git config --add remote.origin.fetch +refs/heads/*:refs/remotes/origin/*
pavana
fuente
2
Me pregunto cómo esta serie de comandos cambiaría a otra rama.
Esto puede ser útil cuando hizo un clon superficial (usando el depthparámetro) anteriormente y ahora se pregunta por qué no puede obtener otras ramas remotas obteniendo el error: pathspec 'another_branch' did not match any file(s) known to gituso de los comandos sugeridos anteriormente. Seguramente no se trata de la pregunta original, pero puede ayudar a otros a rascarse la cabeza aquí.
luciash d 'ser
0

Estoy usando esto para cambiar una rama a otra, cualquiera que pueda usar me funciona como un encanto.

git switch [branchName] O git checkout [branchName]

Ej: git switch desarrollar O
git checkout desarrollar

Rohit Chaurasiya
fuente