Eu criei um projeto no github e estou fazendo alterações no meu mestre local com sucesso e avançando para a origem no github. Quero enviar uma solicitação de recebimento, mas quero incluir apenas a última confirmação. A interface do usuário de solicitação de recebimento no github.com mostra os últimos 9 confirmados e não sei como filtrar isso.
Eu estava tentando entender se eu deveria criar uma nova filial local, verificar isso e, de alguma forma, redefinir ou refazer a atualização para o upstream? Em seguida, aplique minha última confirmação do meu mestre por id para a nova ramificação local e use-a para a solicitação pull?
Estou tentando acertar os conceitos e descobrir as linhas de comando certas para fazer o que eu preciso.
git
github
pull-request
Kevin Hakanson
fonte
fonte
Respostas:
Você precisa basicamente criar uma nova ramificação e escolher os commits que deseja adicionar a ela.
Depois, você verá uma
<new-branch-name>
ramificação no github, mudará para ela e poderá enviar a solicitação de recebimento com as alterações desejadas.fonte
git remote add upstream <git repository>
egit remote update
antes de executar o git checkout -b upstream upstream / master.Crie uma nova ramificação a partir da confirmação mais recente, que também está no repositório de origem:
Em seguida, use
git cherry-pick
para obter a confirmação única para a qual você deseja a solicitação de recebimento. Se o ramo com este commit for chamadofeature
e o commit desejado for o último commit neste branch, isso seráSupondo que esse patch se aplique sem conflito, você tem agora uma ramificação para a qual pode fazer sua solicitação de recebimento.
Em uma segunda etapa, agora você precisa decidir o que fazer com sua
feature
filial. Se você ainda não publicou suas alterações neste ramo, o melhor procedimento é provavelmente reestruturar esse ramo em novo ramo (e remover o último commit, se isso não for feito automaticamente porgit rebase
).fonte
feature
já estiver confirmadoorigin/master
, nada acontecerá durantecherry-pick
. O novo ramo deve ser deupstream/master
(ou seja, a resposta de Kevin Hakanson)Acabei em uma situação em que eu tinha garfado um garfo e queria enviar uma solicitação de recebimento de volta ao projeto original.
Eu tinha:
Para fazer isso, eu:
Os comandos git eram algo como:
Em seguida, escolhi minha solicitação de recurso como a ramificação da minha solicitação de recebimento para o projeto original.
fonte
Isso quase funcionou para mim:
A única diferença era esta:
Eu precisava alterar a última linha para que o git push fizesse a ramificação upstream no meu repositório do GitHub para que eu pudesse fazer PR a partir dele.
fonte
Eu já havia feito o commit que eu queria poder isolar como uma solicitação pull de volta à ramificação atual.
Então eu verifiquei uma nova filial
E aqui é onde minha solução difere da @Kevin Hakanson , pois preciso redefinir esse ramo para o local da história em que quero diferenciar
E escolha o commit a partir do qual eu quero criar uma solicitação de recebimento isolada
Finalmente empurre-o para o controle remoto
E puxe solicitação dat shi.
fonte
A solução para criar uma nova ramificação (temporária), escolher cereja e criar a solicitação de recebimento para essa ramificação não me satisfez. Eu não queria mudar meu repositório para disponibilizar um conjunto de confirmações, então criei a seguinte alternativa:
Primeiro, crie arquivos de correção para todos os commits de interesse:
Se a confirmação de interesse passa a ser o último que você pode usar
HEAD
em vez<sha>
.Agora, você pode enviar os patches para o mantenedor do repositório de origem, que pode aplicá-los:
Finalmente, isso deve parecer o mesmo que se uma ramificação temporária fosse mesclada por uma solicitação pull, mas sem a ramificação adicional no repositório de bifurcações.
fonte
Com base na resposta do @ kevin-hakanson, escrevi este pequeno script bash para facilitar esse processo. Ele adicionará o repositório upstream se ele ainda não existir (solicitando o URL) e solicitará o nome da nova ramificação a ser criada e a tag / SHA da confirmação para escolher essa ramificação. Ele verifica em qual ramificação ou confirmação você está no momento e oculta as alterações para que você possa fazer check-out da nova ramificação. A estratégia de mesclagem mantém as alterações do commit escolhido pela cereja. Depois de enviar a nova ramificação para
origin
(assumida como o nome do seu repositório remoto), a ramificação ou confirmação em que você esteve antes é novamente verificada e as alterações anteriores foram salvas da ocultação.(Isso funcionou para mim em alguns testes simples, mas eu não sou um programador de bash ou especialista em git, então deixe-me saber se há casos que perdi que poderiam ser automatizados melhor!)
fonte