Merge pull request para um branch diferente do padrão, no Github

122

Uma solicitação pull chega ao meu repo hospedado no Github. Por padrão, é mesclado com omaster ramificação.

Existe alguma maneira de alterar em qual branch as alterações seriam mescladas?

eoinoc
fonte

Respostas:

86

A partir de 15/08/2016, o GitHub permite alterar o branch de destino de uma solicitação pull por meio da GUI. Clique Editao lado do título e selecione o ramo no menu suspenso.

captura de tela

Agora você pode alterar o branch base de uma solicitação de pull aberta. Depois de criar uma solicitação pull, você pode modificar o branch de base para que as alterações na solicitação pull sejam comparadas a um branch diferente. Alterando o branch base de sua solicitação de pull original em vez de abrir um novo com o branch base correto, você poderá manter um trabalho e discussão valiosos.

maliayas
fonte
1
Esta deve ser a resposta certa para esta pergunta (após a atualização para o GitHub, ou seja).
stuxnetting
Este recurso parece não existir mais (em 15/02/2018), certo? Em uma solicitação pull recente, o branch de destino é exibido na mesma fonte azul em um fundo azul claro que o repositório / branch de origem e não mais um botão.
cgogolin de
12
Ah! É verdade! Primeiro, é necessário clicar em "Editar" (o que não é óbvio na imagem acima). Eu esqueci isso. Desculpe.
cgogolin de
@cgogolin Obrigado por apontar isso - eu também estava confuso, até que li seu comentário e cliquei no botão Editar.
mhucka
O Github avisa que "Quando você altera o branch base de sua solicitação de pull, alguns commits podem ser removidos da linha do tempo." e "Alguns commits do branch antigo da base podem ser removidos da linha do tempo." Alguma idéia do que isso significa?
Matthias Fripp
55

O remetente pode alterar isso ao emitir a solicitação pull, mas depois de emitir, você não pode alterá-la.

Por outro lado, você pode mesclar manualmente seu branch e push, o que eu faço quase regularmente para solicitações pull mal direcionadas.

Você pode encontrar o hub gema útil para trabalhar com os componentes da solicitação pull.

Essa gema encerra o processo manual, que é:

  1. Adicione um controle remoto para o fork ao seu checkout local.
  2. Pegue aquele controle remoto.
  3. git checkout ${target_branch} && git merge ${remote}/${branch}
  4. git push origin ...
Daniel Pittman
fonte
1
Se eu mesclar e enviar manualmente, o Github perceberá que a solicitação de pull foi efetivamente concluída? Alguma indicação sobre como mesclar de um repositório remoto separado (o fork)?
eoinoc
3
Não tenho certeza, mas não diretamente - porque a alteração não foi mesclada no branch de destino, então a solicitação de pull não foi concluída conforme definido. Você precisa fechá-lo manualmente. Quanto às dicas, veja o comentário editado.
Daniel Pittman
Eu recomendo usar git merge --no-ff ...como @GuillermoMansilla menciona em sua resposta.
jjmontes
3
"Uma vez que eles emitem, você não pode alterá-lo" - Não é mais o caso em agosto de 2016! Veja a resposta de @maliayas abaixo: stackoverflow.com/a/38985999/12484
Jon Schneider
1
Eu segui esse procedimento hoje (3 de março de 2017). Baixei a solicitação de pull em outro branch, fiz algumas correções adicionais e mesclei no master. Depois que os commits da solicitação de pull terminaram no mestre, o GitHub fechou automaticamente a solicitação de pull.
Ivan Krivyakov,
14

Uma alternativa ao uso da gema do hub mencionada por outras respostas é usar a linha de comando para mesclar solicitações de pull local , o que permite que você faça:

$ git fetch origin
$ git checkout *target_branch*
$ git merge pr/XXX
$ git push origin *target_branch*

Os comandos acima funcionam diretamente se você adicionar primeiro a seguinte linha ao seu .git/configarquivo:

fetch = +refs/pull/*/head:refs/remotes/symbolic_name_origin_or_upstream/pr/*

O que isso faz é permitir que você baixe TODAS as solicitações de pull. Como isso pode não ser desejado para repositórios enormes, o GitHub modificou as instruções para apresentar a git fetch origin pull/ID/head:BRANCHNAMEsintaxe, o que evita a modificação do arquivo de configuração e baixa apenas aquele único pull request.

Grzegorz Adam Hankiewicz
fonte
8

Embora você não possa alterar a solicitação pull existente, pois ela não é sua, você pode facilmente criar uma nova se o repositório de origem relacionado ainda existir - sim, mesmo se for de outra pessoa.

Vá para o repositório do remetente e crie uma nova solicitação pull em seu repositório usando os mesmos commits, mas certifique-se de definir o branch de destino correto corretamente.

Em seguida, volte para seu próprio repositório e aceite a nova solicitação de pull. Voila!

Deckard
fonte
Isso funciona se eles alteraram seu repositório? Como garantir que sejam "os mesmos commits?"
ragerdl
@ragerdl - Se você está desenvolvendo usando um modelo 'feature-per-branch', então você pode criar um PR com um branch contra um branch upstream, e deve conter os mesmos commits.
geerlingguy 01 de
2
A única maneira de fazer isso diretamente no GitHub, sem acesso a um repositório local.
kopischke
8

Não há nada de errado com a solução de Daniel Pittman, no entanto, eu trataria essas mesclagens como "sem avanço rápido", ou seja, alterando a etapa número 3 para:

git checkout ${target_branch} && git merge --no-ff ${remote}/${branch}

Com o uso --no-ff, o histórico ficará mais fácil de ler. Isso vai dizer claramente que os $ncommits vieram $branch, e também tornará sua vida mais fácil se você precisar reverter algo feito naquele branch.

Para responder também à pergunta do eoinoc e dar uma dica adicional:

Depois de fazer a mesclagem, seu git cli solicitará que você escreva uma mensagem, geralmente uma mensagem genérica aparecerá dizendo algo como

Mesclar branch de rastreamento remoto 'usuário / seu-branch' em seu-branch

Certifique-se de editar essa mensagem e incluir uma referência ao número da solicitação pull. Isto é: (assumindo que o número da solicitação pull seja 123)

Mesclar branch de rastreamento remoto 'usuário / seu-branch' em seu-branch

refs # 123 resolvendo qualquer coisa ...

Então, da próxima vez que você visitar sua página de questões / solicitações de pull do github e verificar aquela solicitação de pull em particular, verá sua mensagem com um link para confirmar onde você fez a fusão.

Aqui está uma imagem do que quero dizer.

insira a descrição da imagem aqui

Guillermo Mansilla
fonte
6

Para fazer isso, vá para a página inicial do seu repositório, clique nos ramos e mude o ramo padrão de master para outra coisa, no meu caso "dev".

Depois disso, sempre que alguém criar uma solicitação pull, o mergebotão mesclará automaticamente a solicitação em "dev" em vez de master.

insira a descrição da imagem aqui

abbood
fonte
obrigado pela correção de erro de digitação @ the Tin Man. Agradeço
abbood
4
Não há necessidade de nos agradecer por ajustar / editar. É algo que fazemos para o site. Continue escrevendo boas respostas, isso é bastante obrigado.
The Tin Man