Como posso mudar para outra ramificação no git?

222

Qual dessas linhas está correta?

git checkout 'another_branch'

Ou

git checkout origin 'another_branch'

Ou

git checkout origin/'another_branch'

E qual é a diferença entre essas linhas?


Benyamin Jafari
fonte
32
git checkout [branch]para a maioria dos usuários que vêm a esta pergunta
JGallardo

Respostas:

225

Se another_branchjá existir localmente e você não estiver nesse ramo, git checkout another_branchalterne para o ramo.

Se another_branchnão existe, mas existe origin/another_branch, então git checkout another_branché equivalente a git checkout -b another_branch origin/another_branch; git branch -u origin/another_branch. Isso é para criar another_brancha partir origin/another_branche um conjunto origin/another_branchcomo o montante do another_branch.

Se nenhum deles existir, git checkout another_branchretorna erro.

git checkout origin another_branchretorna erro na maioria dos casos. Se originé uma revisão e another_branché um arquivo, ele verifica o arquivo dessa revisão, mas provavelmente não é o que você espera. originÉ usado principalmente em git fetch, git pulle git pushcomo um controle remoto, um apelido para a URL para o repositório remoto.

git checkout origin/another_branchsucede se origin/another_branchexistir. Isso leva a estar no estado HEAD desanexado, não em nenhuma ramificação. Se você fizer novas confirmações, as novas confirmações não poderão ser acessadas por nenhuma ramificação existente e nenhuma delas será atualizada.

ATUALIZAÇÃO :

Como a 2.23.0 foi lançada, também podemos usar git switchpara criar e alternar ramificações.

Se fooexistir, tente mudar para foo:

git switch foo

Se foonão existir e origin/fooexistir, tente criar a foopartir origin/fooe mude para foo:

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

De maneira mais geral, se foonão existir, tente criar a foopartir de uma referência ou confirmação conhecida e, em seguida, mude para foo:

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

Se mantivermos um repositório no Gitlab e no Github ao mesmo tempo, o repositório local poderá ter dois controles remotos, por exemplo, originpara o Gitlab e githubpara o Github. Nesse caso, o repositório possui origin/fooe github/foo. git switch fooreclamará fatal: invalid reference: foo, porque não sabe de qual ref, origin/fooou github/foo, criar foo. Precisamos especificá-lo com git switch -c foo origin/fooou de git switch -c foo github/fooacordo com a necessidade. Se queremos criar ramificações a partir de ambas as ramificações remotas, é melhor usar nomes distintos para as novas ramificações:

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

Se fooexistir, tente recriar / forçar a criação foode (ou redefinir foopara) uma referência ou confirmação conhecida e, em seguida, alterne para foo:

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

que são equivalentes a:

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

Tente mudar para um HEAD desanexado de uma referência ou confirmação conhecida:

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

Se você deseja apenas criar um ramo, mas não mudar para ele, use-o git branch. Tente criar uma ramificação a partir de uma referência ou confirmação conhecida:

git branch foo <ref>
git branch foo <commit>
ElpieKay
fonte
24
Esta resposta está correta (como de costume e com voto positivo), mas adicionarei um comentário que pode ser útil: o git checkoutcomando faz muitas coisas, na minha opinião. É por isso que existem tantos modos de operação aqui. Se a única coisa que git checkoutfizesse foi alternar ramificações, a resposta seria simples, mas também pode criar ramificações e até extrair arquivos de confirmações específicas sem alternar ramificações.
Torek
11
esta é a resposta certa, mas mostra como o git está meio errado na linha de comando. git checkout para mudar de ramo?
Thang
3
Bem, com a versão 2.23.0, isso é corrigido: agora você pode usar git switchpara alternar para um ramo.
Legenda2k 28/08/19
O switch parece não funcionar para esta versão do git. O que eu uso para mudar para uma ramificação diferente nesta versão do git? C: \ widget> git - versão git versão 2.11.0.windows.3 C: \ widget> git switch master git: 'switch' não é um comando git. Veja 'git --help'. C: \ widget>
John
1
O @John usa git checkoutpara versões antigas, que também funcionam em versões modernas.
ElpieKay 16/04
66

Mudando para outro ramo no git. Resposta direta,

git-checkout - Alterna ramificações ou restaura arquivos da árvore de trabalho

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

Antes de alternar a ramificação, verifique se você não possui arquivos modificados; nesse caso, você pode confirmar as alterações ou ocultá-las.

danglingpointer
fonte
O último comando me coloca no estado HEAD desanexado. Significa que não é possível editar a ramificação.
2
O ramo que você está tentando fazer check-out não é buscado; é necessário buscá-lo antes do check-out. Você pode pular a busca se o ramo estiver atualizado, basta usar o git checkout branchname.
Danglingpointer
Não seria suficiente executar um "git pull" depois de mudar para o ramo?
pull também ok, pull faz a busca e se fundem em segundo plano. Não vejo nenhuma diferença.
Danglingpointer
17

[ git checkout "branch_name"]

é outra maneira de dizer:

[ git checkout -b branch_name origin/branch_name]

caso "branch_name" exista apenas remotamente.

[ git checkout -b branch_name origin/branch_name] é útil caso você tenha vários controles remotos.

Em relação a [ git checkout origin 'another_branch'] não tenho certeza de que isso seja possível, o AFAK pode ser feito usando o comando "buscar" - [ git fetch origin 'another_branch']

Mehdi
fonte
Conheço o comando "git checkout -b branchName" para criar outro ramo. Esta não era a questão!
10

Com o Git 2.23 em diante, pode-se usar git switch <branch name>para alternar ramificações.

gkw
fonte
6

O que funcionou para mim é o seguinte:

Alterne para o ramo necessário:

git checkout -b BranchName

E então eu puxei o "mestre" por:

git pull origin master
Karam Qusai
fonte
6

Comandos úteis para trabalhar na vida cotidiana:

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
fonte
5

Se você deseja que a ramificação rastreie a ramificação remota, o que é muito importante se você confirmar alterações na ramificação e extrair alterações, etc., você precisará usar add a -t para o checkout real, por exemplo: git checkout -t branchname

Matthew Joughin
fonte
4

Verifica : git branch -a

Se você estiver recebendo apenas um ramo. Em seguida, siga as etapas abaixo.

  • Passo 1 : git config --list
  • Passo 2 : git config --unset remote.origin.fetch
  • Etapa 3 : git config --add remote.origin.fetch +refs/heads/*:refs/remotes/origin/*
Pavan
fonte
2
Gostaria de saber como essa série de comandos mudaria para outro ramo.
Isso pode ser útil quando você fez um clone superficial (usando o depthparâmetro) anteriormente e agora se pergunta por que não pode buscar outras ramificações remotas error: pathspec 'another_branch' did not match any file(s) known to gitusando os comandos sugeridos acima. Certamente não é sobre o que era a pergunta original, mas pode ajudar outras pessoas a coçar a cabeça aqui.
luciash d 'sendo
0

Eu estou usando isso para alternar um ramo para outro, qualquer pessoa que você pode usá-lo funciona para mim como charme.

git switch [branchName] OU git checkout [branchName]

ex: git switch develop OU
git checkout develop

Rohit Chaurasiya
fonte