Como aplicar solicitações pull a montante não imersas de outros garfos no meu garfo?

465

Um projeto no GitHub do qual tenho uma bifurcação tem uma nova solicitação de puxar que quero puxar para a minha bifurcação que o autor ainda não retirou.

Existe uma maneira simples de aplicar solicitação pull de outros garfos no meu garfo? Há mais alguma coisa aqui que estou perdendo?

alho-poró
fonte
8
Existe uma instrução: gist.github.com/piscisaureus/3342247
Piotr Migdal
Isso reflete no gráfico de rede no GitHub se você usar os comandos git para fazer isso?
ADTC
Também pode ser interessante encontrar todos os ramos: stackoverflow.com/q/47798937/10245
Tim Abell

Respostas:

276

Você pode fazer isso manualmente com bastante facilidade:

  • adicione o outro fork como um controle remoto do seu repositório:

    git remote add otherfork git://github.com/request-author/project.git
    
  • buscar os commits de seu repo

    git fetch otherfork
    
  • Você tem duas opções para aplicar a solicitação de recebimento (se não quiser escolher a opção 1.)

    1. Se você não se importa em aplicar também as confirmações eventuais que foram adicionadas entre a origem e a solicitação de recebimento, basta refazer a ramificação na ramificação na qual a solicitação de recebimento foi formada

      git rebase master otherfork/pullrequest-branch
      
    2. Se você deseja apenas as confirmações na solicitação pull, identifique seu SHA1 e faça

      git cherry-pick <first-SHA1> <second-SHA1> <etc.>
      
CharlesB
fonte
166
Na verdade, você não deve usar cherry-pick, pois cria novos commits ... o que, por sua vez, causará confusão se você enviar uma solicitação pull a montante. Em vez disso, você deve mesclar exatamente como a solicitação de recebimento está solicitando. Você também não precisa adicionar um controle remoto. git pull URL branchname
Tekkub 16/05
3
@Tekkub: concordo, pode ser melhor evitar confusão com confirmações recém-criadas. Mesclar é menos elegante em minha mente desde que você pode trazer outras mudanças do ramo que está se fundindo com
charlesb
8
Sim, mas neste caso ele perguntou especificamente como colocar a solicitação de puxar no garfo. Puxe == mesclar.
Tekkub 16/05
1
@CharlesB, como o GitHub adiciona automaticamente novas confirmações no mesmo ramo a uma solicitação pull, não seria difícil obter outras "alterações" (assumindo que o solicitante siga as práticas recomendadas e coloque as alterações em um ramo separado do desenvolvimento contínuo, portanto que todos os commits são relevantes), a menos que você esteja entrando em contato quando desejar apenas parte de uma solicitação de recebimento?
neverfox
4
Para aqueles que compartilham minha falha mental, "otherfork" não faz referência ao repositório original, está referenciando o commit da bifurcação que emitiu a solicitação de recebimento para o repositório original. Ignore o repositório original e vá diretamente para o garfo que fez a solicitação de extração. Você deseja puxar manualmente o commit que o pull estava fazendo referência e mesclá-lo com o seu.
22613 Michael Khalili #:
282

Atualização: Via página da Web

Você também pode fazer isso na página do github.

Suponho que você já deve ter um fork ( MyFork) do repositório comum ( BaseRepo) que tem a solicitação de recebimento pendente de um fork ( OtherFork) do qual está interessado.

  1. Navegue até o fork ( OtherFork) que iniciou a solicitação de recebimento que você deseja acessar ( MyFork)
  2. Vá para a página de solicitações de recebimento de OtherFork
  3. Clique em nova solicitação de recebimento
  4. As solicitações de recebimento pendentes devem ser oferecidas. Lembre-se de selecionar o OtherForkramo adequado também. Selecione no lado esquerdo a base do garfo do garfo ( MyFork) ( IMPORTANTE ).
  5. Agora a opção de View pull requestdeve mudar para Create pull request. Clique aqui.

Agora você deve ter uma solicitação de recebimento pendente em seu fork ( MyFork), que você pode simplesmente aceitar.

Hotschke
fonte
6
Funciona lindamente. Muito mais simples que a linha cmd e fácil de revisar as alterações. Obrigado.
Alveoli
3
Eu tive problemas para encontrar como acessar o "OtherFork" na interface do usuário. Para chegar facilmente, basta modificar o URL com o nome de usuário do github. ou seja github.com/userName/repoName
Charles
2
Não pude ver as solicitações de recebimento pendentes mencionadas na etapa 4. Em vez disso, selecionei a ramificação que correspondia à solicitação de recebimento feita por OtherFork, no menu suspenso 'comparar' à direita. Em seguida, selecionei o lado esquerdo como o garfo de base, conforme descrito acima, como capaz de criar a solicitação de recebimento.
seddonym
Funciona a menos que não haja garfo. Por exemplo: github.com/OculusVR/RakNet/pull/61/files
Milan Babuškov 11/04
1
As palavras exatas do site githubs podem estar desatualizadas, mas o processo está no local. Super simples - obrigado!
Kevnk #
73

Como Tekkub disse anteriormente, você pode simplesmente puxar o ramo diretamente. Na maioria das vezes com o GitHub, o ramo é simplesmente "mestre" na bifurcação do usuário solicitante do projeto.

Exemplo: git pull https://github.com/USER/PROJECT/ BRANCH

E como um exemplo prático:

Digamos que você tenha bifurcado um projeto no github chamado safaribooks e existe a seguinte solicitação de recebimento, no projeto de origem, que você deseja colocar no seu fork:

insira a descrição da imagem aqui

Em seguida, na pasta de projeto clonada do seu fork, execute:

git pull https://github.com/fermionic/safaribooks.git fix-str-decode
SciPhi
fonte
20
A desvantagem disso é que a ramificação pode ter outras coisas além da solicitação de recebimento. Além disso, você deve procurar a URL adequada para o fork do autor da solicitação de recebimento. Se você quiser usar uma linha, é melhor usar git pull https://github.com/{upstream/project} refs/pull/{id}/head.
jbyler
1
@jbyler Se o ramo tem outras coisas, tenho certeza que o GitHub atualizou a solicitação de recebimento com eles de qualquer maneira.
Tim Malone
22

As solicitações de recebimento para o projeto podem vir de vários autores (garfos) e provavelmente você não deseja um controle remoto separado para cada bifurcação. Além disso, você não deseja fazer suposições sobre a ramificação que o autor usou ao enviar a solicitação de recebimento ou o que mais pode estar na ramificação principal do autor. Portanto, é melhor fazer referência à solicitação pull, como aparece no repositório upstream, em vez de nos outros bifurcações.

Passo 1:

git remote add upstream <url>

Você provavelmente já executou esta etapa, mas, se não, deseja um controle remoto definido para o projeto upstream. O URL é o URL do clone do projeto que você bifurcou. Mais informações em Configurando um controle remoto para um garfo e Sincronizando um garfo . upstreamé o nome que você está dando ao controle remoto e, embora possa ser qualquer coisa, upstream é o nome convencional.

Passo 2:

git pull upstream refs/pull/{id}/head

... onde {id}está o número da solicitação de recebimento. upstreamé o nome do controle remoto a ser retirado, ou seja, apenas "upstream" se você seguiu exatamente a etapa 1. Também pode ser um URL. Nesse caso, você pode pular a etapa 1.

Etapa 3:

Digite uma mensagem de confirmação para a consolidação de mesclagem. Você pode manter o padrão, embora eu recomende fornecer um bom resumo de uma linha com o número da solicitação de recebimento, o problema corrigido e uma breve descrição:

Merge PR#42, fixing VIM-652, support for mapping arbitrary IDEA actions
jbyler
fonte
Consulte também uma resposta relacionada com uma variante que cria uma ramificação local com a solicitação pull nela. E uma variante final: você pode usar git pull upstream refs/pull/{id}/headpara obter os commits em seu repo local, em seguida, referenciá-los como FETCH_HEAD(por exemplo, git log ..FETCH_HEADpara ver o que está nele, então git merge FETCH_HEAD)
jbyler
como proceder para rebasear, para que a solicitação de recebimento esteja na cabeça e para evitar uma bolha de mesclagem?
Michael Johnston
1
Essa era a solução que eu precisava, porque o autor da solicitação de extração havia removido seu repositório.
jswetzen
20

Algumas informações mais detalhadas que funcionaram para mim.

Meu arquivo .git / config para o repositório bifurcado tem a seguinte aparência:

[core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
        ignorecase = true
        precomposeunicode = false
[remote "origin"]
        url = [email protected]:litzinger/angular-carousel.git
        fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
        remote = origin
        merge = refs/heads/master
        rebase = true
[remote "source"]
        url = git://github.com/revolunet/angular-carousel.git
        fetch = +refs/heads/*:refs/remotes/source/*
        fetch = +refs/pull/*/head:refs/remotes/origin/pr/*

Em seguida, execute "git fetch source", que listou todas as solicitações pull do repositório bifurcado.

 * [new ref]         refs/pull/54/head -> origin/pr/54
 * [new ref]         refs/pull/67/head -> origin/pr/67
 * [new ref]         refs/pull/69/head -> origin/pr/69
 * [new ref]         refs/pull/71/head -> origin/pr/71

E para mesclar uma solicitação de recebimento específica, execute "git merge master origin / pr / 67"

Brian Litzinger
fonte
1
Editei meu arquivo .git / config e adicionei as linhas [remote "source"], mas para o projeto em que me interessava, as instruções funcionaram perfeitamente. Eu amo essa resposta.
Philo vivero
3
Excelentes conselhos relacionados podem ser encontrados em news.ycombinator.com/item?id=9051220 e help.github.com/articles/checking-out-pull-requests-locally dicas sobre este (impressionante) refs/pull/namespace remoto somente leitura específico do GitHub .
Philip Durbin
Se você usa o Smartgit, pode ver essas solicitações pull (e as fechadas) no gráfico de log se adicionar smartgit.branch.otherRefs=notes;pullao smartgit.properties conforme syntevo.com/doc/display/SG/System+Properties - você também pode mesclá-las a partir daí .
CAD bloke
btw, você também pode experimentá-lo na linha de comando com o git fetch source + refs / heads / *: refs / remotes / upstream / * + refs / pull / * / head: refs / remotes / origin / pr / *
lib
9

O que eu faria é o seguinte;

git checkout master
git remote add #NAME# #ADDRESS TO REPO#
git fetch #USERNAME#
git checkout -b test_fork
git rebase #NAME#/#BRANCH#

Agora mesclei as alterações em uma ramificação de teste, chamada test_fork. Para que quaisquer alterações não sujem minha árvore.

Opcionalmente, você pode usar cherry-pick como descrito acima para escolher um commit específico, se for mais preferível.

Viagens felizes :)

MindTooth
fonte
0

Eu uso um script dandy útil para isso. Eu executo o script digitando:

git prfetch upstream

e obtém todas as solicitações pull do fork upstream.

Para criar o script, crie um arquivo ~/bin/git-prfetch.

O arquivo deve conter o seguinte:

#!/bin/bash

if [ -z "$1" ]; then
    echo "Please supply the name of a remote to get pull requests from."
    exit 1
fi

git fetch $1 +refs/heads/\*:refs/remotes/$1/\* +refs/pull/\*/head:refs/remotes/$1/pr/\*

Assegure-se de que seu caminho inclua o script configurando:

export PATH="$HOME/bin:$PATH"

Você pode adicionar este arquivo a ~/.bashrc para tornar a alteração permanente.

Agora, adicione a bifurcação da qual deseja obter as solicitações pull:

git remote add upstream https://github.com/user/repo.git

E depois

git prfetch upstream
Richard
fonte