Como faço para verificar uma ramificação remota do Git?


6714

Alguém empurrou um ramo chamado testcom git push origin testa um repositório compartilhado. Eu posso ver o ramo com git branch -r.

Agora estou tentando verificar o testramo remoto .

Eu tentei:

  • git checkout test que não faz nada

  • git checkout origin/test* (no branch). O que é confuso. Como posso estar no "sem ramificação"?

Como faço para verificar uma ramificação remota do Git?


9
@inger Mas ele não inclui a possibilidade de mudar o nome da nova filial local (se você quiser --set-a montante mais tarde e manter nomear consistência)
fachexot

15
Eu acho que esta discussão é inútil. Nada parece funcionar, a pergunta original parece ter sido perdida em muitas das respostas. Li todas as palavras, tentei de tudo abaixo e não tenho idéia de como fazer o que o OP quer fazer.
Tony Ennis

6
Comandos do git não são intuitivos, para começar, adicione as alterações introduzidas com as recentes versões à mistura e você tem esta página ...
Christophe Roussy

14
Sinto como se estivesse tomando pílulas malucas. Estou tentando fazer check-out de um ramo upstream, e não apenas origin, e todas as respostas recomendadas não fazem nada remotamente útil (com trocadilhos). EDIT - com licença, as inúmeras sugestões contidas nas 2 principais respostas foram inúteis; O terceiro ( git branch test origin/test) é o que funciona. Ainda bem que o top 2 tem 20x o número de votos ...
dwanderson

4
Talvez você tenha um arquivo chamado 'teste' na sua árvore de trabalho, consulte stackoverflow.com/a/45006389/792416 para obter detalhes.
Oldman

Respostas:


9151

Atualizar

A resposta de Jakub realmente melhora isso. Nas versões Git ≥ 1.6.6, com apenas um controle remoto, você pode apenas fazer:

git fetch
git checkout test

Como o usuário masukomi aponta em um comentário, git checkout testNÃO funcionará no git moderno se você tiver vários controles remotos. Nesse caso, use

git checkout -b test <name of remote>/test

ou a taquigrafia

git checkout -t <name of remote>/test

Resposta antiga

Antes de começar a trabalhar localmente em uma ramificação remota, é necessário buscá-lo conforme descrito nas respostas abaixo.

Para buscar uma ramificação, basta:

git fetch origin

Isso buscará todas as ramificações remotas para você. Você pode ver as agências disponíveis para checkout com:

git branch -v -a

Com as filiais remotas em mãos, agora você precisa verificar a filial em que está interessado, fornecendo uma cópia de trabalho local:

git checkout -b test origin/test

398
Para expandir isso: o git não permite que você trabalhe nos ramos de outra pessoa. Você só pode trabalhar por conta própria. Portanto, se você deseja adicionar à ramificação de outra pessoa, é necessário criar sua própria "cópia" dessa ramificação, que é o que o comando acima faz (bem, ele cria sua ramificação e faz check-out também).
Dan Moulding

139
Se for uma nova ramificação remota, talvez seja necessário git fetchantes de fazer isso, para que o git esteja ciente deorigin/test
Neil Sarkar

56
... e você faria isso comgit fetch origin test
Andrew

22
Erro: "git checkout: atualizar caminhos é incompatível com a alternância de ramificações. Você pretendia fazer o checkout origin/testque não pode ser resolvido como confirmação?"
Xeoncross

85
git checkout testNÃO funcionará no git moderno se você tiver vários controles remotos com o mesmo nome de ramificação . Não pode saber qual usar.
Masukomi 16/09/14

1256

Nota: Com o moderno Git (> = 1.6.6 ), você pode usar apenas

git checkout test

(observe que é 'teste' e não 'origem / teste') executar uma mágica mágica de DWIM e criar um 'teste' de ramificação local para você, para o qual upstream seria 'origem / teste' de ramificação de rastreamento remoto.


A saída * (no branch)in git branchsignifica que você está em uma ramificação sem nome, no chamado estado "desanexado HEAD" (HEAD aponta diretamente para confirmação, e não é uma referência simbólica a alguma ramificação local). Se você fez algumas confirmações nesta ramificação sem nome, sempre pode criar ramificação local com a confirmação atual:

git checkout -b test HEAD

** EDIT (pelo editor, não autor) **

Encontrei um comentário enterrado abaixo, que parece modernizar esta resposta:

@Dennis: git checkout, por exemplo, resultados de origem / teste do git checkout em HEAD desanexado / ramificação sem nome, enquanto teste de git checkout ou git checkout -b teste de origem / resultados do teste no teste de ramificação local (com origem / teste de ramificação de rastreamento remoto como upstream) ) - Jakub Narębski 9 / jan / 14 às 8:17

ênfase em git checkout origin/test


33
Não é de surpreender, mas esta versão foi lançada nos últimos anos - saber que essa sintaxe pode economizar muito tempo, pois ainda há muita documentação antiga e threads de comentários circulando, sugerindo o método mais antigo para fazer isso.
Curtis

10
"modern git" - para constar, (aproximadamente) a que versão você está se referindo? Às vezes, temos que trabalhar em sistemas executando distros mais antigos.
Craig McQueen

5
"git moderno", neste contexto, é git 1.6.6
Bobby Norton

10
@aidan Se você receber uma resposta como essa error: pathspec 'branch_name' did not match any file(s) known to git., deve primeiro buscar o git.
Dennis

6
Usando a versão git 1.8.3.msysgit.0 e isso não funciona para mim - não corresponde a qualquer arquivo (s) conhecido por git - Já fiz muitas buscas git
PandaWood

565

Nesse caso, você provavelmente deseja criar uma testfilial local que esteja rastreando a testfilial remota :

$ git branch test origin/test

Nas versões anteriores git, você precisava de uma --trackopção explícita , mas esse é o padrão agora quando você está ramificando uma ramificação remota.


15
Isso criará uma ramificação local sem mudar para ela.
Alex Skrypnyk

2
Embora tenha sido fatal: Nome ambíguo do objeto: 'origin / dev' - onde um ramo 'dev' na origem definitivamente existe - mas eu acidentalmente criei um ramo chamado "origin / dev" na minha máquina (nas minhas tentativas estúpidas anteriores para acertar, sem dúvida) ... ai
PandaWood 4/13/13

1
Isso está me dando o erro de erro: falha ao enviar algumas referências para sugerir: As atualizações foram rejeitadas porque uma dica de ramificação enviada está por trás de sua dica remota: contraparte. Confira este ramo e mescle a dica de alterações remotas: (por exemplo, 'git pull') antes de pressionar novamente. dica: Veja a 'Nota sobre avanço rápido' em 'git push --help' para obter detalhes.
pal4life

475

A resposta aceita não está funcionando para você?

Embora a primeira resposta selecionada seja tecnicamente correta , existe a possibilidade de você ainda não ter recuperado todos os objetos e referências do repositório remoto. Se for esse o caso, você receberá o seguinte erro:

$ git checkout -b remote_branch origin/remote_branch

fatal: git checkout: atualizar caminhos é incompatível com a alternância de ramificações.
Você pretendia fazer checkout 'origin / remote_branch' que não pode ser resolvido como confirmação?

Solução

Se você receber esta mensagem, primeiro faça um git fetch originwhere onde originé o nome do repositório remoto antes da execução git checkout remote_branch. Aqui está um exemplo completo com respostas:

$ git fetch origin
remote: Counting objects: 140, done.
remote: Compressing objects: 100% (30/30), done.
remote: Total 69 (delta 36), reused 66 (delta 33)
Unpacking objects: 100% (69/69), done.
From https://github.com/githubuser/repo-name
   e6ef1e0..5029161  develop    -> origin/develop
 * [new branch]      demo       -> origin/demo
   d80f8d7..359eab0  master     -> origin/master

$ git checkout demo
Branch demo set up to track remote branch demo from origin.
Switched to a new branch 'demo'

Como você pode ver, a execução git fetch originrecuperou quaisquer ramificações remotas que ainda não estavam configuradas para rastrear em nossa máquina local. A partir daí, como agora temos uma referência ao ramo remoto, podemos simplesmente executar git checkout remote_branche obteremos os benefícios do rastreamento remoto.


2
Vou adicionar uma observação se você tiver uma ramificação separada localmente: verifique se você associou isso ao repositório remoto usando 'git remote add origin [the_path_to_your_repo / repo_name.git]'. Em seguida, use 'git fetch origin' onde 'origin' significa o repositório de origem com o qual você fez a associação.
Elliotrock 02/02

git checkout -b newbranchtambém funciona muito bem para criar e fazer checkout em uma única etapa uma nova filial com base na filial atual.
Linus

2
Eu acho que esse é o mais atualizado (ele mantém $ @ #! Ing mudando!). Git 2.5.5 Eu encontrei a única maneira de realmente ver as ramificações remotas git ls-remotee a única maneira de realmente usar uma é git checkout -b [branch] --track [remote/branch]... e isso depois do git pull [remote] [branch] trabalho. Ou seja, ele realmente puxou o ramo inteiro, mas ainda não o listou.
DelicadoLatticeworkFever

e quando esta resposta também não funcionar, veja esta .
eis

apenas para adicionar, se você git fetch other_remote only_branch, você ainda receber o fatalerro. Você precisa git fetch other_remotesem o nome da filial. Design estranho.
est

258

Eu tentei a solução acima, mas não funcionou. Tente isso, funciona:

git fetch origin 'remote_branch':'local_branch_name'

Isso buscará a ramificação remota e criará uma nova ramificação local (se já não existir) com o nome local_branch_namee rastreará a remota nela.


37
Isso funcionou para mim quando nem o git buscar a origem nem a atualização remota do git criaram ramificações locais. Não sei por que.
Godsmith

4
Essa era a maneira mais direta de realizar o que eu precisava: usar uma ramificação remota (não mestre) para criar uma nova ramificação.
Roralee

7
Funcionou sem problemas, especialmente ao ter clonado uma única ramificação de um controle remoto com várias ramificações.
Alex C

7
isso funcionou para mim também, onde respostas aceitas e outras votações altas não. Minha versão do git é 2.5.0
pdepmcp

5
Alguém tem alguma idéia de por que isso funciona quando tudo o resto não funciona? (Estou no git 2.13.0)
Nathan Arthur

108

Isso fará o DWIM para uma origem remota não nomeada ( documentação ):

$ git checkout -t remote_name/remote_branch

Para adicionar um novo controle remoto, faça o seguinte primeiro:

$ git remote add remote_name location_of_remote
$ git fetch remote_name

O primeiro diz ao Git que o controle remoto existe, o segundo recebe os commits.


104

Usar:

git checkout -b <BRANCH-NAME> <REMOTE-NAME>/<BRANCH-NAME>

Outras respostas não funcionam com o Git moderno no meu caso benigno. Pode ser necessário puxar primeiro se o ramo remoto for novo, mas eu não verifiquei esse caso.


2
Você percebe que este é um extrato desta resposta
Thomas Ayoub 21/02

14
Olhando agora, eles se sobrepõem. Apenas o meu é sucinto e lhe diz o que fazer, em vez de contar uma história. Suponho que possa ser mais útil, portanto, especialmente nas versões atuais do git. Você pode votar se achar que é uma resposta ruim.
matanster

1
git fetch é a opção segura. Tente buscar antes de usar pull. Ambos baixam conteúdo remoto, mas, embora a busca não mude o estado local, o pull muda imediatamente o estado local.
31519 Peter Szalay

89

OK , a resposta é fácil ... Você basicamente vê a filial, mas ainda não possui uma cópia local! ...

Você precisa fetchdo ramo ...

Você pode simplesmente buscar e, em seguida, efetuar o checkout no ramo, use o comando de uma linha abaixo para fazer isso:

git fetch && git checkout test

Também criei a imagem abaixo para você compartilhar as diferenças, ver como fetchfunciona e também como é diferente pull:

busca do git


@DmitriZaitsev sim, ele funcionará, se a ramificação remota estiver lá e você buscar, você obterá a ramificação localmente ... git fetch && git checkout test .. Então isso funciona, a menos que não haja ramificação remota, mas o pergunta dizendo que já existe uma filial remota lá ...
Alireza

A maneira como vejo a pergunta testparece um novo ramo, portanto não é provável que esteja presente localmente. Caso contrário, você poderia facilitar o processo com um único git pullcomando.
Dmitri Zaitsev

@DmitriZaitsev, sim, foi por isso que eu disse git fetch, que verificar se há ramificações remotas que acabamos de criar, pull pode trazer outros itens indesejados, mas a busca disponibiliza todos os ramos se você já tiver o repositório local ...
Alireza

Não seria fetch, sem pullmudanças deixam na cópia buscada, mas não na filial local, levando a sua filial local não sendo up-to-date?
Dmitri Zaitsev

56

Para clonar um repositório Git, faça:

git clone <either ssh url /http url>

O comando acima faz check-out de todas as ramificações, mas somente a masterramificação será inicializada. Se você quiser fazer check-out dos outros ramos, faça:

git checkout -t origin/future_branch (for example)

Este comando faz check-out da filial remota e o nome da sua filial local será o mesmo da filial remota.

Se você deseja substituir o nome da sua filial local na finalização da compra:

git checkout -t -b enhancement origin/future_branch

Agora, o nome da sua filial local é enhancement, mas o nome da sua filial remota é future_branch.

Documentação


git clone <ssh url / http url> - funciona perfeitamente para mim #
Kmeixner

Sim você está correto. Obrigado pela sua informação, eu vou atualizá-lo muito em breve @warvariuc
Madhan Ayyasamy

Se o controle remoto não tiver master, isso não funcionará.
polkovnikov.ph

36

Podes tentar

git fetch remote
git checkout --track -b local_branch_name origin/branch_name

ou

git fetch
git checkout -b local_branch_name origin/branch_name

2
Para sua informação, --tracknão é mais necessário nas versões mais recentes do git, porque é definido por padrão, conforme explicado nesta resposta anterior .

33

Primeiro, você precisa fazer:

git fetch # Se você não souber o nome da filial

git fetch origin branch_name

Segundo, você pode verificar a filial remota no seu local:

git checkout -b branch_name origin/branch_name

-b criará uma nova ramificação no nome especificado a partir da ramificação remota selecionada.


Eu não entendo -b. Se você pode fazer o "mestre do git checkout", por que você não pode fazer a "origem / teste do git checkout"?
John Little

-b para novo ramo que é de origem / master
Mohideen bin Mohammed

28

Eu uso o seguinte comando:

git checkout --track origin/other_remote_branch

13
Essa resposta seria muito mais útil se você explicar por que está usando dessa maneira. ou seja, por que alguém deve usar '--track' e assim por diante ...
Matt Friedman

27

Comandos

git fetch --all
git checkout -b <ur_new_local_branch_name> origin/<Remote_Branch_Name>

são iguais a

 git fetch --all

e depois

 git checkout -b fixes_for_dev origin/development

Ambos criarão um latest fixes_for_devdedevelopment


24

Se a ramificação estiver em algo diferente do origincontrole remoto, eu gosto de fazer o seguinte:

$ git fetch
$ git checkout -b second/next upstream/next

Isso fará o checkout da nextfilial no upstreamcontrole remoto para uma filial local chamada second/next. O que significa que, se você já tiver um ramo local chamado next, ele não entrará em conflito.

$ git branch -a
* second/next
  remotes/origin/next
  remotes/upstream/next


18

nenhuma dessas respostas funcionou para mim. isso funcionou:

git checkout -b feature/branch remotes/origin/feature/branch


1
obrigado. Fiquei me perguntando se eu tinha que usar o caminho completo ( controles remotos / origem / recurso / ramificação ) que vi gitao chamar o git branch -acomando, mas não tinha certeza, então usei git checkout -b apps/FEATURE/branch origin/apps/FEATURE/branche ele pareceu funcionar. Mensagem:Branch 'apps/FEATURE/branch' set up to track remote branch 'apps/FEATURE/epicBranch' from 'origin'. Switched to a new branch 'apps/FEATURE/branch'
Chris22

18

Eu estava preso em uma situação vendo error: pathspec 'desired-branch' did not match any file(s) known to git.todas as sugestões acima. Estou no git versão 1.8.3.1.

Então, isso funcionou para mim :

git fetch origin desired-branch
git checkout -b desired-branch FETCH_HEAD

A explicação por trás disso é que notei que, ao buscar a ramificação remota, ela foi buscada em FETCH_HEAD:

$ git fetch origin desired-branch
From github.com:MYTEAM/my-repo
    * branch            desired-branch -> FETCH_HEAD

17

Simplesmente execute git checkoutcom o nome da ramificação remota. O Git criará automaticamente uma ramificação local que rastreia a ramificação remota:

git fetch
git checkout test

No entanto, se esse nome de filial for encontrado em mais de um controle remoto, isso não funcionará, pois o Git não sabe qual usar. Nesse caso, você pode usar:

git checkout --track origin/test

ou

git checkout -b test origin/test

Na 2.19 , o Git aprendeu a checkout.defaultRemoteconfiguração, que especifica um controle remoto para o padrão ao resolver essa ambiguidade.


16

git branch -rdiz que o nome do objeto é inválido, porque esse nome não está na lista de ramificações locais do Git. Atualize sua lista de agências locais da origem com:

git remote update

E tente verificar novamente sua ramificação remota.

Isso funcionou para mim.

Acredito que git fetchatrai todos os ramos remotos, o que não é o que o pôster original queria.


2
Para sua informação, git remote update também buscará todas as ramificações remotas .

13

O git remote show <origin name>comando listará todas as ramificações (incluindo ramificações não rastreadas). Em seguida, você pode encontrar o nome da filial remota que precisa buscar.

Exemplo:

$ git remote show origin

Siga estas etapas para buscar ramificações remotas:

git fetch <origin name> <remote branch name>:<local branch name>
git checkout <local branch name > (local branch name should the name that you given fetching)

Exemplo:

$ git fetch origin test:test
$ git checkout test

O @hallski respondeu que não funciona as versões 2.15.1, mas reduzi o peso do arquivo .git apenas um ramo e o histórico do filtro com o sinalizador - profundidade. por exemplo, $ git clone -b release --single-branch --depth 5 https://github.com/user/repo.gitinformações $ git remote show originnão gravadas, isso não listou todas as ramificações remotas com repositórios clonados de ramificação única.
Qh0stM4N

10

Busque no controle remoto e faça o checkout da filial.

git fetch <remote_name> && git checkout <branch_name> 

Por exemplo:

origem de busca git && recurso de check-out git / XYZ-1234-Add-alertas


9

Outros caras e moças dão as soluções, mas talvez eu possa lhe dizer o porquê.

teste de checkout git que não faz nada

Does nothingnão é igual doesn't work, então acho que quando você digita 'git checkout test' no seu terminal e pressiona a tecla Enter, nenhuma mensagem aparece e nenhum erro ocorre. Estou certo?

Se a resposta for sim, posso lhe dizer a causa.

A causa é que existe um arquivo (ou pasta) chamado 'teste' na sua árvore de trabalho.

Quando git checkout xxxanalisado,

  1. O Git aparece xxxcomo um nome de filial no início, mas não existe nenhuma filial chamada teste.
  2. Então o Git pensa que xxxé um caminho e, felizmente (ou infelizmente), existe um arquivo chamado test. Então, git checkout xxxsignifica descartar qualquer modificação no xxxarquivo.
  3. Se também não houver um arquivo com nome xxx, o Git tentará criar o xxxacordo com algumas regras. Uma das regras é criar um ramo nomeado xxxse remotes/origin/xxxexistir.

obrigado, continuava tentando descobrir por que o git não estava fazendo nada.
Mike R

8

Para obter ramificações criadas recentemente

git fetch

Para mudar para outro ramo

git checkout BranchName

6

Você pode começar a rastrear todas as ramificações remotas com o seguinte script Bash:

#!/bin/bash
git fetch --all
for branch in `git branch -r --format="%(refname:short)" | sed 's/origin\///'`
  do git branch -f --track "$branch" "origin/$branch"
done

Aqui também está uma versão de linha única:

git fetch --all; for branch in `git branch -r --format="%(refname:short)" | sed 's/origin\///'`; do git branch --track "$branch" "origin/$branch" ; done ;

5

git checkout -b "Branch_name" [B significa Criar ramificação local]

git branch --all

git checkout -b "O nome da sua filial"

ramo git

saída com êxito da ramificação mestre para a ramificação dev

insira a descrição da imagem aqui


git checkout -b "Branch_name" [B significa Criar filial local]
Keshav Gera 16/01

3

para obter todas as ramificações remotas, use isto:

git fetch --all

depois faça o checkout para a filial:

git checkout test

2

Use fetchpara puxar todo o seu controle remoto

   git fetch --all

Para listar ramificações remotas:

   git branch -r

Para listar todas as suas filiais

   git branch -l
   >>outpots like-
     * develop
       test
       master

Para fazer checkout / alterar uma filial

   git checkout master

Tentei git branch -le nenhum ramo remoto foi mostrado.
Dmitri Zaitsev

use git pull --allorgit fetch --all
Nasir Khan

Sim, e depois disso, git branch -l ainda mostra apenas filiais locais . Parece estar funcionando exatamente como git branchfora -l, então qual é o motivo -l?
Dmitri Zaitsev

Além disso, sua resposta não responde à pergunta - masternão é um ramo remoto.
Dmitri Zaitsev

1
-lsinalizador para lista. Você pode usar --listtambém
Nasir Khan

2

Para nós, parece que a remote.origin.fetchconfiguração deu um problema. Portanto, não conseguimos ver outras ramificações remotas master, portanto git fetch [--all], não ajudamos. Nem git checkout mybranchnem git checkout -b mybranch --track origin/mybranchfez trabalho, embora certamente estava no remoto.

A configuração anterior só pode masterser buscada:

$ git config --list | grep fetch
remote.origin.fetch=+refs/heads/master:refs/remotes/origin/master

Corrija-o usando *e busque as novas informações de origem:

$ git config remote.origin.fetch '+refs/heads/*:refs/remotes/origin/*'

$ git fetch
...
 * [new branch] ...
...

Agora nós poderíamos git checkouto ramo remoto localmente.

Não faço ideia de como essa configuração acabou em nosso repositório local.


1
Isso resolveu para mim desde que eu
clonei

2

Se o nome do ramo remoto começar com caracteres especiais, você precisará usar aspas simples no comando checkout, caso contrário, o git não saberá de qual ramo você está falando.

Por exemplo, tentei fazer check-out de uma ramificação remota chamada como, #9773mas o comando não funcionou corretamente, conforme mostrado na figura abaixo:

insira a descrição da imagem aqui

Por alguma razão, me perguntei se o símbolo afiado (#) poderia ter algo a ver com isso, e então tentei '#9773'colocar o nome do ramo entre aspas simples, como uma pena do que simplesmente #9773, e felizmente funcionou bem.

$ git checkout -b '#9773' origin/'#9773'

Em muitos shells unix, o #personagem é usado para comentários, então qualquer coisa após o #será ignorado. Isso é algo do tipo shell e não algo específico do git. Usar aspas de uma barra invertida antes da #deve ser suficiente.
Paulo Scardine 7/11

1

Por favor, siga o comando para criar uma pasta vazia. Digite isso e use este comando:

saifurs-Mini:YO-iOS saifurrahman$ git clone your_project_url
Cloning into 'iPhoneV1'...
remote: Counting objects: 34230, done.
remote: Compressing objects: 100% (24028/24028), done.
remote: Total 34230 (delta 22212), reused 15340 (delta 9324)
Receiving objects: 100% (34230/34230), 202.53 MiB | 294.00 KiB/s, done.
Resolving deltas: 100% (22212/22212), done.
Checking connectivity... done.
saifurs-Mini:YO-iOS saifurrahman$ cd iPhoneV1/
saifurs-Mini:iPhoneV1 saifurrahman$ git checkout 1_4_0_content_discovery
Branch 1_4_0_content_discovery set up to track remote branch 1_4_0_content_discovery from origin.
Switched to a new branch '1_4_0_content_discovery'
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.