Como abrir várias solicitações pull no GitHub


139

Quando abro uma solicitação de recebimento no GitHub .
Todas as confirmações desde a minha última solicitação e todas as novas são adicionadas automaticamente a essa solicitação .

Não consigo controlar quais confirmações são adicionadas e quais não são.
Quando tento abrir outra solicitação de recebimento, recebo o erro "Opa! Já existe um pedido de recebimento".

Existe alguma maneira fácil de abrir várias solicitações pull sem ter que mexer com a linha de comando?

Respostas:


116

As solicitações pull são baseadas em uma ramificação.
A única maneira de abrir uma solicitação de recebimento para várias confirmações é:

  1. Isole-os em seu próprio ramo .
  2. Abra as solicitações pull a partir daí.

3
Ok, isso é legal, eu pensei que era apenas com o mestre. Então, o que você quer dizer é que eu posso criar muitas ramificações (ie: recursos de fluxo git) e fazer solicitações pull para cada uma delas ... Vou tentar!
Ziyan Junaideen

8
Acabei de descobrir que a ramificação preservava o histórico das confirmações anteriores, portanto, uma solicitação de recebimento contra o upstream ainda inclui todas as confirmações.
enguia ghEEz

2
Oi @ eel-gheez, você descobriu o que fazer sobre isso? Como criar PRs isolados sem que as alterações de outras ramificações sejam mostradas?
Jonathan Cruz

3
Isso não resolve o problema: quando tento criar um PR, os dois ramos (com pelo menos um commit cada) são comparados. O que estou fazendo de errado?
MERose

1
@eelghEEz Você deve criar uma nova ramificação, git cherry-pick todos os commits que você deseja para esta ramificação e, em seguida, fazer uma solicitação pull a partir desta ramificação. É um recurso de design muito importante do git que cada commit depende de seu commit anterior, e os commit no git não devem ser apenas um patch, mas um patch sabendo qual patch foi aplicado antes disso. Portanto, é por isso que se deve criar uma nova ramificação com novas confirmações, cujas diferenças talvez ainda sejam as mesmas, mas cujos links para as confirmações anteriores são diferentes.
MD

11

A maneira mais fácil de encontrar isso é com o comando hub ( https://github.com/defunkt/hub ).

Na ramificação do tópico ("recurso" neste exemplo) para a qual você deseja criar uma solicitação de recebimento, basta executar:

git pull-request

(lembre-se de empurrar seu ramo primeiro!)

E abrirá uma nova solicitação de recebimento no GitHub para "YOUR_USER: feature".

Se você já criou um problema no GitHub, pode até anexar uma solicitação de recebimento a esse problema existente (algo que você não pode fazer na interface da Web):

$ git pull-request -i 123
[ attached pull request to issue #123 ]

2

Na verdade, você PODE fazer isso sem criar outro ramo, mas é preciso um pouco de brincadeira.
Aqui estão as etapas:

  1. Identifique os dois intervalos de confirmação que você deseja obter. Aqui está o que vou usar como exemplo:
    (outro / mestre) A -> B -> C -> D -> E (seu / mestre)
    Digamos que você deseja extrair B e C em uma solicitação e D & E em outro.
  2. Faça uma solicitação de recebimento. Faça com que o lado esquerdo ("Base") seja confirmado A. Para o lado direito ("cabeça"), digite o número de confirmação C.
  3. Escreva a descrição para o seu primeiro pedido.
  4. Faça outro pedido. Para a base, digite o número de confirmação de C e, para a cabeça, coloque E (seu / mestre).
  5. Escreva a descrição.

A meu ver, a solicitação pull vê commit C como um ponto de ramificação. Ou alguma coisa.


Você deve deixar outro / mestre no lado esquerdo, mesmo que esteja adicionando um número de confirmação do seu / mestre. Além disso, esse método não permite adicionar novas confirmações à solicitação de mesclagem, caso sejam necessárias mais alterações.
Frisco

Eu postei uma continuação das sortes para esta resposta, em contraste com algumas informações sobre Github, consulte stackoverflow.com/questions/23159860
Mark Bennett

Eu posso ver que isso criaria dois PRs que parecem corretos, pois cada um deles continha exatamente os commits desejados. Mas, para ser explícito, ele faz a coisa certa quando eles são mesclados? Como em, posso ver que o primeiro PR fundiria corretamente B & C em outro / master. Mas quando o segundo PR é mesclado, como ele sabe em qual ramo se fundir? (Desde que foi criado no commit 'C', não no outro / mestre) Importa qual ordem os PRs são mesclados? (provavelmente)
Jonathan Hartley

1

Quando você cria inicialmente a solicitação pull, se você abrir dois formulários separados para uma nova solicitação pull, isso permitirá que você os crie, desde que eles estejam apontados para ramificações diferentes a serem mescladas. Por exemplo, eu poderia fazer duas solicitações separadas, uma para mesclar no mestre e outra para mesclar no teste.


1

Eu sou novo no Git e no GitHub e tinha a mesma pergunta que o OP.

Encontrei uma solução que provavelmente não estava disponível no momento do OP.

Situação: você tem três alterações e deseja que cada uma seja construída com base na anterior e que cada uma tenha sua própria solicitação de recebimento (PR).

Problema: Quando você cria o primeiro PR que tenta puxar o desenvolvimento para mestre, tudo fica bem, mas depois de fazer as alterações para o segundo PR e mesclá-las (usando a mesma ramificação), todas as alterações estão no mesmo PR .

Mini solução: Crie uma nova ramificação

git branch mini_change_2
git checkout mini_change_2

Agora você envia o código para o GitHub e cria o PR, mas o padrão é Pull de mini_change_2 para master, exceto que o master ainda não possui as alterações do primeiro PR, portanto inclui todas as alterações do PR1 e PR2.

Melhor solução: especifique em qual filial você está mesclando no PR2.

Não aceite apenas os padrões ao criar o segundo PR, digamos que você vá puxar mini_chnage_2 para Develop, isso mostrará apenas as alterações em mini_change_2

Agora crie uma nova ramificação mini_change_3 e PR para mini_change_3.

O problema surge quando você começa a mesclá-los ... mas esse é um exercício diferente.

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.