Como extrair ramificação remota do repositório de outra pessoa


266

Eu tenho um projeto hospedado no GitHub que alguém bifurcou. No garfo, eles criaram um novo ramo "foo" e fizeram algumas alterações. Como puxo o "foo" deles para um novo ramo também chamado "foo" no meu repositório?

Entendo que eles poderiam enviar uma solicitação de recebimento para mim, mas eu gostaria de iniciar esse processo pessoalmente.

Suponha o seguinte:

  1. Porque eles bifurcaram meu projeto, ambos os nossos repositórios compartilham a mesma 'história'
  2. Embora o GitHub mostre que o projeto foi bifurcado do meu, meu repositório local não tem nenhuma referência ao projeto dessa pessoa. Preciso adicionar o deles como controle remoto?
  3. Ainda não tenho um ramo chamado "foo" - não sei se preciso criá-lo manualmente primeiro.
  4. Eu definitivamente quero que isso seja puxado para um ramo separado e não meu mestre.

Respostas:


349
git remote add coworker git://path/to/coworkers/repo.git
git fetch coworker
git checkout --track coworker/foo

Isso configurará uma filial local foo, rastreando a filial remota coworker/foo. Portanto, quando seu colega de trabalho fez algumas alterações, você pode facilmente removê-las:

git checkout foo
git pull

Resposta aos comentários:

Legal :) E se eu gostaria de fazer minhas próprias alterações nesse ramo, devo criar um segundo ramo local "bar" a partir de "foo" e trabalhar lá em vez de diretamente no meu "foo"?

Você não precisa criar uma nova ramificação, mesmo que eu a recomende. Você também pode se comprometer diretamente fooe fazer com que seu colega puxe seu ramo. Mas esse ramo já existe e seu ramo fooprecisa ser configurado como um ramo upstream:

git branch --set-upstream foo colin/foo

assumindo que colinseu repositório (um controle remoto para o repositório de colegas de trabalho) está definido da mesma maneira:

git remote add colin git://path/to/colins/repo.git

3
Isso foi muito rápido :) Você pode adicionar que ele deve usar o git://URL da página de repositório do GitHub da outra pessoa no lugar de //path/to/coworkers/repo.git. (Descrevendo que foi o que fez a minha resposta muito lenta;))
Mark Longair

Legal :) E se eu gostaria de fazer minhas próprias alterações nesse ramo, devo criar um segundo ramo local "bar" a partir de "foo" e trabalhar lá em vez de diretamente no meu "foo"?
Colin O'Dell 4/11

Ou é seguro trabalhar diretamente no meu "foo" e puxar / mesclar suas alterações posteriormente? Qual é a melhor prática aqui?
Colin O'Dell 4/11

1
Perfeito, era exatamente isso que eu procurava :) Obrigado pela ajuda !!
Colin O'Dell 4/11

1
Boa resposta em 3 minutos!
Tieme

103

Não, você não precisa adicioná-los como um controle remoto. Isso seria complicado e uma dor para fazer a cada vez.

Agarrando seus commits:

git fetch git@github.com:theirusername/reponame.git theirbranch:ournameforbranch

Isso cria um ramo local chamado, ournameforbranchexatamente o mesmo que theirbranchera para eles. Para o exemplo da pergunta, o último argumento seria foo:foo.

Observe que :ournameforbranchparte pode ser deixada de lado se pensar em um nome que não entre em conflito com um de seus próprios ramos é incômodo. Nesse caso, uma referência chamada FETCH_HEADestá disponível. Você pode git log FETCH_HEADver os commits deles e fazer coisas como cherry-pickedescolher os commits.

Empurrando de volta para eles:

Muitas vezes, você quer consertar algo deles e empurrá-lo de volta. Isso também é possível:

git fetch git@github.com:theirusername/reponame.git theirbranch
git checkout FETCH_HEAD

# fix fix fix

git push git@github.com:theirusername/reponame.git HEAD:theirbranch

Se o trabalho em estado desanexado o preocupa, crie um ramo usando :ournameforbranche substituindo FETCH_HEADe HEADacima por ournameforbranch.


2
Obrigado por isso, a outra resposta não funciona se você ea outra pessoa têm nomes idênticos ramos (como o padrão masterramo)
Job

2
Vale ressaltar que esse método não funcionará se você não tiver itens como a chave SSH associada à sua conta do github, consulte stackoverflow.com/questions/12940626
Przemek D

você não precisa ser adicionado como colaborador para poder ir ao repo deles?
Mel

@Mel Certamente! O envio pressupõe que você tenha as permissões necessárias no envio remoto para envio. A busca também assume que o caminho está acessível.
Antak

Se você executar git branch -m newbranchenquanto estiver nesse estado desanexado, o git perderá a cabeça e começará a dizer que seu repo não é mais válido. git initparece corrigi-lo e colocá-lo de volta mais ou menos no estado em que estava antes, com o ramo chamado "newbranch".
21718 Ian Hickson

14

Se a resposta da Antak:

git fetch git@github.com:<THEIR USERNAME>/<REPO>.git <THEIR BRANCH>:<OUR NAME FOR BRANCH> 

da-te:

Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

Então (seguindo o conselho de Przemek D) use

git fetch https://github.com/<THEIR USERNAME>/<REPO>.git <THEIR BRANCH>:<OUR NAME FOR BRANCH>

6

A seguir, é uma boa solução conveniente que funciona com o GitHub para verificar a ramificação PR do fork de outro usuário. Você precisa saber o ID da solicitação de recebimento (que o GitHub exibe junto com o título do PR).

Exemplo:

Corrigindo seu código inseguro # 8,
Alice deseja mesclar 1 commit your_repo:masterdeher_repo:branch

git checkout -b <branch>
git pull origin pull/8/head

Substitua o seu controle remoto, se diferente de origin.
Substitua 8pelo ID da solicitação de recebimento correto.


2
Isso precisa de mais votos. funciona perfeitamente e evitou o erro "fatal: Não foi possível encontrar ref remoto" que eu estava recebendo com a resposta mais votada. Obrigado!
Michael Romrell 04/11/19

2 linhas de código fácil. Obrigado por compartilhar isso! A única coisa mais doce do que isso é mesclar as atualizações novamente em sua solicitação de recebimento de maneira fácil.
klewis

4

O GitHub tem uma nova opção em relação às respostas anteriores, basta copiar / colar as linhas de comando do PR:

  1. Role até a parte inferior do PR para ver o botão MergeouSquash and merge
  2. Clique no link à direita: view command line instructions
  3. Pressione o ícone Copiar à direita da Etapa 1
  4. Cole os comandos no seu terminal

2

Se o repositório bifurcado estiver protegido para que você não possa empurrá-lo diretamente, e seu objetivo é fazer alterações no foo deles, será necessário colocar o branch foo no repositório da seguinte maneira:

git remote add protected_repo https://github.com/theirusername/their_repo.git
git fetch protected_repo 
git checkout --no-track protected_repo/foo

Agora você tem uma cópia local do foo sem o upstream associado a ele. Você pode confirmar alterações (ou não) e depois enviar seu foo para seu próprio repositório remoto.

git push --set-upstream origin foo

Agora, foo está no seu repositório no GitHub e seu foo local está rastreando-o. Se eles continuarem fazendo alterações em foo, você pode buscá-los e fundir-se a ele.

git checkout foo 
git fetch protected_repo
git merge protected_repo/foo
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.