Github: Importar ramo upstream para o fork

169

Eu tenho um fork ( origin) de um projeto ( upstream) no github. Agora, o projeto upstream adicionou uma nova ramificação, quero importar para o meu fork. Como faço isso?

Tentei verificar o controle remoto e criar uma ramificação em cima disso, mas isso configura a ramificação da maneira que git pushestá tentando enviar para upstream:

git checkout upstream/branch
git checkout -b branch

editar

Talvez isso não esteja claro, mas quero adicionar a ramificação ao meu repositório local, para poder enviá-la para origin(meu fork) via git push. Como os repositórios upstream geralmente são somente leitura e você o contribui para contribuir.

Então, basicamente, quero fazer check-out de um ramo inexistente, origincujo conteúdo será extraído upstream.

cutucar
fonte

Respostas:

262
  1. Verifique se você puxou a nova ramificação upstream para o seu repositório local :

    • Primeiro, verifique se sua árvore de trabalho está limpa (confirmar / ocultar / reverter quaisquer alterações)
    • Em seguida, git fetch upstreampara recuperar a nova ramificação upstream
  2. Crie e alterne para uma versão local da nova ramificação upstream ( newbranch):

    • git checkout -b newbranch upstream/newbranch
  3. Quando você estiver pronto para enviar o novo ramo à origem :

    • git push -u origin newbranch

A opção -u configura o rastreamento para o controle remoto especificado (neste exemplo origin)

Urschrei
fonte
6
Eu acredito que git fetch upstreamé uma opção melhor no primeiro passo, pois git pull upstreamrequer mais ações a serem feitas depois git remote add ...para o upstream.
Alexander Pavlov
git pull upstream retorna: A You asked to pull from the remote 'upstream', but did not specify a branch. Because this is not the default configured remote for your current branch, you must specify a branch on the command line.adição do nome da ramificação no final do comando causa uma mesclagem entre a ramificação no upstream e a ramificação local atual, em vez de permitir a criação de uma nova ramificação local. Alguma ideia?
MMontu
1
A substituição git pull upstreampor git fetch upstreamresolveu o problema e as etapas a seguir funcionaram.
mMontu 6/09/13
Eu recebo: fatal: Não é possível atualizar os caminhos e alternar para a ramificação 'upstream' ao mesmo tempo. Você pretendia fazer checkout 'upstream / master' que não pode ser resolvido como confirmação?
precisa saber é o seguinte
1
@sureshvv Isso é provavelmente porque você precisa ter uma referência remota ao repositório upstream chamado upstream antes de fazer qualquer coisa. Caso contrário, é assim que você adiciona um: git remote add upstream your_git_upstream_repository_url.git . Leia isso se precisar de esclarecimentos sobre esse assunto.
Gabriel Rainha
7

eu usaria

git checkout -b <new_branch> upstream/<new_branch>
Svenito
fonte
Na verdade, foi o que tentei antes do que expliquei na pergunta; isso leva aos mesmos resultados.
cutuca
4

Também tive problemas com isso, e o Google me levou aqui. As soluções não funcionaram no entanto. Meu problema era que, quando adicionei meu upstream, ele configurou minha configuração do git para buscar apenas o mestre, em vez de todos os ramos. por exemplo, parecia assim

[remote "somebody"]
        url = [email protected]:somebodys/repo.git
        fetch = +refs/heads/master:refs/remotes/upstream/master

A edição de .git / config da seguinte forma corrigiu meu problema

[remote "somebody"]
        url = [email protected]:somebodys/repo.git
        fetch = +refs/heads/*:refs/remotes/upstream/*
Ian Will
fonte
1

As etapas a seguir funcionaram bem para mim (assumindo que o nome do ramo upstream seja branch):

$ git fetch upstream
$ git checkout branch
$ git push origin
Eneko Alonso
fonte
1
Eu obtenho o git fetch upstream fatal: 'upstream' não parece ser um repositório git fatal: Não foi possível ler no repositório remoto. Verifique se você possui os direitos de acesso corretos e se o repositório existe.
precisa saber é o seguinte
0

--track?

git branch --track branch upstream/branch
Troelskn
fonte
Talvez eu tenha entendido você errado, mas fazer isso configurará o ramo da mesma maneira; com pushempurrando para upstream.
cutuca
Não, acho que te entendi mal.
troelskn
0

Eu tive um cenário um pouco mais complicado, onde eu já tinha um upstreamdefinido no meu fork (do repositório canônico), mas precisava fazer checkout de um galho de um fork diferente. Para fazer isso, o processo é um pouco diferente. Aqui está a configuração que eu acabei com:

[remote "origin"]
url = [email protected]:<your_user/org>/<repo>.git
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
remote = origin
merge = refs/heads/master
rebase = true
[remote "upstream"]
url = [email protected]:<upstream_user>/<repo>.git
fetch = +refs/heads/*:refs/remotes/upstream/*
[remote "other_user"]
url = [email protected]:<other_user>/<repo>.git
fetch = +refs/heads/*:refs/remotes/<other_user>/*

Agora você também pode fazer o checkout de um galho do <other_user>fork.

git fetch <other_user> <branch>
git checkout -b <branch> <other_user>/<branch>

Isso fornecerá um ramo local derivado do garfo.

Para empurrar esse ramo local, tive que ser específico com o meu comando push.

git push origin <branch>
okor
fonte
É praticamente o mesmo que a resposta aceita, apenas que o controle remoto do qual você está buscando não é chamado de "upstream".
poke