Git puxa uma certa ramificação do GitHub

631

Eu tenho um projeto com vários ramos. Eu os enviei para o GitHub , e agora que outra pessoa está trabalhando no projeto, preciso extrair suas ramificações do GitHub. Funciona bem no mestre. Mas diga que alguém criou um ramo xyz. Como posso puxar ramificação xyzdo GitHub e mesclá-la em ramificação xyzno meu localhost?

Na verdade, tenho a minha resposta aqui: Empurre e puxe ramos no Git

Mas recebo um erro "! [Rejeitado]" e algo sobre "avanço rápido".

Alguma sugestão?

tybro0103
fonte
3
qual é o comando real que você está executando?
10139 Alex N.
1
É uma busca que pode falhar com a mensagem 'não encaminhamento rápido'. Você modificou a ramificação de rastreamento remoto (origem / xyz) ou foi ramificada / reescrita no repositório remoto? Você pode precisar usar " git fetch origin --force", mas leia a documentação antes de fazê-lo.
21749 Jakub Narębski

Respostas:

758

Mas recebo um erro "! [Rejeitado]" e algo sobre "avanço rápido"

Isso ocorre porque o Git não pode mesclar as alterações dos ramos no seu mestre atual. Digamos que você fez check-out da ramificação mastere deseja mesclar na ramificação remota other-branch. Quando você faz isso:

$ git pull origin other-branch

Git está basicamente fazendo isso:

$ git fetch origin other-branch && git merge other-branch

Ou seja, a pullé apenas a fetchseguido de a merge. No entanto, quando pull-ing, o Git será mesclado other-branch se puder executar uma mesclagem de avanço rápido . Uma mesclagem de avanço rápido é uma mesclagem na qual o cabeçalho do ramo em que você está tentando mesclar é um descendente direto do cabeçalho do ramo que você deseja mesclar. Por exemplo, se você tiver essa árvore do histórico, a mesclagem other-branchresultará em uma mesclagem de avanço rápido:

O-O-O-O-O-O
^         ^
master    other-branch

No entanto, isso não seria uma mesclagem de avanço rápido:

    v master
O-O-O
\
 \-O-O-O-O
         ^ other-branch

Para resolver seu problema, primeiro busque a ramificação remota:

$ git fetch origin other-branch

Em seguida, mescle-o em sua ramificação atual (presumo que seja master) e corrija quaisquer conflitos de mesclagem:

$ git merge origin/other-branch
# Fix merge conflicts, if they occur
# Add merge conflict fixes
$ git commit    # And commit the merge!
mipadi
fonte
Não, o problema está na busca, não na etapa de mesclagem.
11119 Jakub Narębski
3
Normalmente, os controles remotos são configurados de forma que as buscas sejam forçadas, mesmo que não resultem em uma consolidação de avanço rápido, portanto, não deve ocorrer na busca, a menos que o OP altere algo com a configuração usual. O problema de avanço rápido pode ocorrer durante a busca ou mesclagem. O que faz você dizer que o problema está definitivamente na busca e não na fusão?
Mipadi
Eu sigo estas etapas (buscar, mesclar). Git me diz que não há nada a fazer. Quando tento me comprometer, cai sobre os lamentos rápidos.
Jean Jordaan
1
@ mipadi Eu tive o mesmo problema que Jean e, embora não possa dizer que o controle remoto está configurado da maneira não padrão que você mencionou, posso dizer que usando git fetch -fo problema foi corrigido! Obrigado!
28412 cregox
1
Isso mescla ramificação remota com ramificação xzylocal master, que não é o que estava implícito na pergunta original; "Como posso extrair o branch xyz do GitHub e fundi-lo no branch xyz no meu host local?"
user5359531
301

Basta rastrear suas ramificações remotas explicitamente e um simples git pullfará exatamente o que você deseja:

git branch -f remote_branch_name origin/remote_branch_name
git checkout remote_branch_name

Esta última é uma operação local.

Ou ainda mais adequado à documentação do GitHub sobre bifurcação :

git branch -f new_local_branch_name upstream/remote_branch_name
innaM
fonte
39
Se você obtiver 'Não é um nome de objeto válido:' origin / remote_branch_name ', faça' git fetch origin 'primeiro.
Martin Konicek
130

Você pode puxar uma ramificação para uma ramificação com os seguintes comandos.

git pull {repo} {remotebranchname}:{localbranchname}

git pull origin xyz:xyz

Quando você está no ramo principal, também pode fazer o checkout de um ramo como:

git checkout -b xyz

Isso cria uma nova ramificação, "xyz", do mestre e faz o check-out diretamente.

Então você faz:

git pull origin xyz

Isso puxa a nova ramificação para sua xyzramificação local .

Robert Cabri
fonte
1
Perfeito! Eu simplesmente não conhecia a sintaxe: git pull {repo} {remotebranchname}: {localbranchname}. Pergunta, se essa solicitação não funcionar (talvez alguém tenha atualizado a ramificação e haja conflitos de mesclagem), quais são minhas opções?
Costa
7
Estou com o voto negativo porque tenta mesclar a ramificação remota na sua ramificação atual (por exemplo, mestre). Não é isso que a maioria das pessoas quer fazer, e não é o que o OP pediu. A resposta do @mohit é a escolha correta.
Phrogz
1
Phrogz - parece que esse comportamento foi alterado nas versões recentes do Git. Eu usei isso antes e funcionou perfeitamente bem.
Pawan
88

A melhor maneira é:

git checkout -b <new_branch> <remote repo name>/<new_branch>
mohit
fonte
1
Depois de criar um novo ramo "dev" no github e tentar o acima, recebi a seguinte mensagem de erro: "fatal: origin / dev não é um commit e um ramo 'dev' não pode ser criado a partir dele" A solução foi "git buscar "de acordo com a solução de Bradley Flood abaixo e, em seguida, re-executando a resposta do mohit.
TomEberhard
46

git fetch irá pegar a lista mais recente de ramos.

Agora você pode git checkout MyNewBranch

Feito :)


Para mais informações, consulte docs: git fetch

Bradley Flood
fonte
37

Não sei se entendi completamente o problema, mas puxar um ramo existente é feito assim (pelo menos funciona para mim :)

git pull origin BRANCH

Isso pressupõe que sua filial local seja criada fora da origem / FILIAL.

Alex N.
fonte
15

Isso me ajudou a obter ramificação remota antes de mesclá-la com outra:

git fetch repo xyz:xyz
git checkout xyz
anatoly techtonik
fonte
8

Simplificando, se você deseja obter do GitHub o ramo the_branch_I_want:

git fetch origin
git branch -f the_branch_I_want origin/the_branch_I_want
git checkout the_branch_I_want
Adrien Renaud
fonte
3
git pull <gitreponame> <branchname>

Normalmente, se você tiver apenas repo atribuído ao seu código, o gitreponame seria a origem.

Se você estiver trabalhando em dois repositórios, como um local e outro remoto, como você pode verificar a lista de repositórios no git remote -v . isso mostra quantos repositórios estão atribuídos ao seu código atual.

BranchName deve existir no gitreponame correspondente.

você pode usar os dois comandos a seguir para adicionar ou remover repositórios de repositório

git remote add <gitreponame> <repourl>
git remote remove <gitreponame>
prathap
fonte
2

você também pode fazer

git pull -r origin master

corrigir conflitos de mesclagem, se houver

git rebase --continue

-r é para rebase. Isso fará com que você ramifique a estrutura de

        v  master       
o-o-o-o-o
     \o-o-o
          ^ other branch

para

        v  master       
o-o-o-o-o-o-o-o
              ^ other branch

Isso levará a uma história mais limpa. Nota: Caso você já tenha enviado sua outra ramificação para a origem (ou qualquer outro controle remoto), pode ser necessário forçar a sua ramificação após o rebase.

git push -f origin other-branch
PKV
fonte
1

eu fiz

git branch -f new_local_branch_name origin/remote_branch_name

Ao invés de

git branch -f new_local_branch_name upstream/remote_branch_name

Como sugerido por @innaM. Quando usei a versão upstream, ele dizia 'fatal: Não é um nome de objeto válido:' upstream / remote_branch_name ''. Eu não fiz git fetch origincomo um comentário sugerido, mas simplesmente substituí-lo upstreampor origin. Eu acho que eles são equivalentes.

Vicky
fonte
0

para puxar o ramo do GitHub, você pode usar

git checkout --track origin/the-branch-name

Verifique se o nome da ramificação é exatamente o mesmo.

Fradely Code
fonte