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?



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.>
      

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.


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

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

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 = git@github.com: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"


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 :)


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
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.