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.

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)


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>

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 = git@github.com: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 = git@github.com:somebodys/repo.git
        fetch = +refs/heads/*:refs/remotes/upstream/*

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

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

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 = git@github.com:<your_user/org>/<repo>.git
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
remote = origin
merge = refs/heads/master
rebase = true
[remote "upstream"]
url = git@github.com:<upstream_user>/<repo>.git
fetch = +refs/heads/*:refs/remotes/upstream/*
[remote "other_user"]
url = git@github.com:<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>

É praticamente o mesmo que a resposta aceita, apenas que o controle remoto do qual você está buscando não é chamado de "upstream".
poke
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.