git: switch branch sem separar o cabeçote

101

Eu tenho um repositório no github com um branch principal (master) e um branch para algum trabalho experimental. Fiz alguns commits e empurrei para o branch experimental e estava tudo bem.

Agora, em uma máquina diferente, eu tento clone meu repositório (git clone repositório ) e depois mudar para o ramo experimental (git checkout branchname ) mas cada vez que eu faço isso da minha cabeça fica destacada e eu não posso empurrar as minhas alterações. O que estou fazendo de errado? Tenho a sensação de que estou perdendo um conceito git fundamental em algum lugar, mas ler páginas de manual git aleatórias não está me dando nenhuma pista.

Sou novo no git, então sinto muito se estou sendo um idiota, mas não consigo encontrar nada nos documentos que me ajudem a recolocar minha cabeça.

EDITAR

O conceito de um ramo de rastreamento é o que estava faltando. Agora que groco esse conceito, está tudo claro. Pessoalmente, acho a git branch --tracksintaxe muito mais intuitiva do que git checkout -b branch-name origin/branch-name.

Obrigado pela ajuda!

Dana Robinson
fonte
Para trocar de branch sem separar o head, com Git 2.23 (agosto de 2019), use git switch: veja minha resposta abaixo .
VonC de

Respostas:

114
# first time: make origin/branchname locally available as localname
git checkout -b localname origin/branchname 

# othertimes 
git checkout localname 

git push origin

Por conveniência, você pode usar a mesma string para localname e branchname.
Quando você fez check-out, origin/branchnamenão estava realmente fazendo check-out de um branch. origin/branchnameé um nome "remoto", e você pode obter uma lista deles com

branch -a 

Se você tiver as cores ativadas, as ramificações locais terão uma cor e as remotas terão outra.

Você deve primeiro fazer uma ramificação remota rastreada localmente para poder alternar para ela e trabalhar nela.

Kent Fredric
fonte
9
Cara, por que "git checkout origin / branchname" não começa a rastrear o branch automaticamente se ainda não foi rastreado?
Martin Konicek
4
porque você ainda precisa de um nome local para a filial estrangeira.
Kent Fredric
Aqui está o que estou fazendo e a mensagem de erro: $ git checkout -b topic / fetch upstream / topic / fetch fatal: git checkout: a atualização de caminhos é incompatível com a troca de branches. Você pretendia fazer o checkout de 'upstream / topic / fetch' que não pode ser resolvido como commit?
ulu
2
Obrigado pela dica sobre cores. Para ativar as cores:git config --global --add color.ui true
PonyEars
1
É importante notar que "origin / branchname" pode ser literalmente qualquer coisa que resolva para um SHA1, ou um SHA1 em si =). Eu regularmente uso isso para criar ramos arbitrários com raízes arbitrárias.
Kent Fredric
16
git clone [email protected]:abc/def.git
cd def

Agora crie um branch de rastreamento:

git branch --track experimental origin/experimental
git checkout experimental

Depois de trabalhar lá, basta acessar o github

git push
Christoph Rüegg
fonte
3
git branch -t origin / experimental # não precisa digitar tanto :)
Dustin
O branch que desejo rastrear é chamado de tópico / busca. Quando estou tentando fazer $ git branch --track topic / fetch upstream / topic / fetch, ele diz, fatal: Não é um nome de objeto válido: 'upstream / topic / fetch'.
ulu
1
@Dustin, esse comando cria um branch local 'origin / experimental' que rastreia o master local. Acho que é um erro bastante comum.
PDug
1
@PDug% git checkout -t origin / experimental Branch experimental configurado para rastrear o branch experimental remoto da origem por rebase. Mudou para um novo ramo 'experimental'
Dustin
11

Para expandir a resposta de Kent, depois de fazer seu clone, o único branch que você terá (remotos não contam) é aquele que estava ativo no repositório do qual você clonou - master no seu caso.

Portanto, primeiro você deseja criar um novo branch para rastrear o branch experimental remoto:

$ git branch experimental origin/experimental

e então confira:

$ git checkout experimental

No entanto, Kent está correto - esses dois comandos podem ser combinados

$ git checkout -b experimental origin/experimental
Pat Notz
fonte
3

Com Git 2.23 (agosto de 2019), você usaria o git switchcomando

Se você tiver uma filial remota com o mesmo nome, ela será rastreada automaticamente:

$ git switch new-topic
Branch 'new-topic' set up to track remote branch 'new-topic' from 'origin'
Switched to a new branch 'new-topic'
VonC
fonte