github: Adicionando commits à solicitação pull existente

89

Abri uma solicitação de pull para o repo do Rails no github usando o botão Fork & Edit this file file.

Agora, depois de obter feedback sobre meu PR, eu queria adicionar mais alguns commits. então aqui está o que acabei fazendo

$ git clone [email protected]:gaurish/rails.git #my forked repo
$ git rebase -i 785a2e5 #commit hash of my commit using which PR was opened
$ git checkout patch-3 #branch name I had to send my commits under to be shown in that PR
$ git commit -am "Changes done as per feedback"
$ git push origin patch-3

Isso funcionou bem, mas parece um fluxo de trabalho bastante complexo. Talvez eu esteja errado, algo errado aqui?

minha pergunta é: estou fazendo isso da maneira correta? se não, qual é a maneira correta de fazer isso?

CuriousMind
fonte
4
Alguns que vêm aqui podem achar que isso se encaixa melhor em seu cenário: stackoverflow.com/questions/9790448/…
AaronLS
4
Também achei esta versão da pergunta / resposta mais clara: stackoverflow.com/questions/7947322/…
Ben Wheeler

Respostas:

64

Como você está usando as ferramentas do GitHub e apenas alterando um arquivo, você também pode navegar até o arquivo no GitHub, selecionar o branch apropriado no canto superior esquerdo sob a lista suspensa "árvore:" ( patch-3no seu caso) e agora escolher "Editar este ficheiro". Agora suas alterações serão comprometidas com este branch e aparecerão em sua solicitação pull

Abe Voelker
fonte
Observe que isso não funcionará se o branch estiver protegido , o botão de edição ficará esmaecido
Louis Maddox
10

Recentemente, escrevi sobre este tópico:

Como mantemos este branch de recursos atualizado? Mesclar os commits upstream mais recentes é fácil, mas você deseja evitar a criação de um commit de mesclagem, já que isso não será apreciado quando for enviado para o upstream: você estará então efetivamente re-commitando as alterações upstream, e esses commits upstream receberão um novo hash ( à medida que ganham um novo pai). Isso é especialmente importante, pois esses commits mesclados seriam refletidos em sua solicitação de pull do GitHub quando você enviar essas atualizações para seu branch pessoal de recursos do GitHub (mesmo se você fizer isso depois de emitir a solicitação de pull).

É por isso que precisamos rebase em vez de mesclar:

git co devel #devel is ansible's HEAD aka "master" branch
git pull --rebase upstream devel
git co user-non-unique
git rebase devel

Tanto a opção rebase quanto o comando rebase para git manterão sua árvore limpa e evitarão commits de mesclagem. Mas tenha em mente que esses são seus primeiros commits (com os quais você emitiu sua primeira solicitação de pull) que estão sendo rebaseeados e que agora têm um novo hash de commit, que é diferente dos hashes originais que ainda estão em seu branch de repo remoto do github .

Agora, enviar essas atualizações para seu branch de recurso pessoal do GitHub falhará aqui, pois os dois branches são diferentes: a árvore do branch local e a árvore do branch remoto estão “fora de sincronia”, por causa desses hashes de commit diferentes. O Git lhe dirá para primeiro git pull --rebase, depois empurre novamente, mas não será um simples envio rápido, pois seu histórico foi reescrito. Não faça isso!

O problema aqui é que você buscaria novamente seus primeiros commits alterados como estavam originalmente, e eles serão mesclados no topo de seu branch local. Por causa do estado fora de sincronia, esse pull não se aplica de forma limpa. Você terá um histórico quebrado onde seus commits aparecem duas vezes. Ao enviar tudo isso para o branch de recursos do GitHub, essas alterações serão refletidas na solicitação de pull original, que ficará muito, muito feia.

AFAIK, na verdade não existe uma solução totalmente limpa para isso. A melhor solução que encontrei é forçar o envio de seu branch local para o branch do GitHub (na verdade, forçando uma atualização não rápida):

Conforme git-push (1):

Update the origin repository’s remote branch with local branch, allowing non-fast-forward updates. This can leave unreferenced commits dangling in the origin repository.

Portanto, não puxe, apenas force o empurrão assim:

git push svg +user-non-unique

ou:

git push svg user-non-unique --force

Na verdade, isso irá sobrescrever seu branch remoto, com tudo em seu branch local. Os commits que estão no stream remoto (e causaram a falha) permanecerão lá, mas serão commits pendentes, que eventualmente serão deletados por git-gc (1). Nada demais.

Como eu disse, esta é AFAICS a solução mais limpa. A desvantagem disso é que seu PR será atualizado com os commits mais recentes, que terão uma data posterior, e podem aparecer fora de sincronia no histórico de comentários do PR. Não é um grande problema, mas pode ser potencialmente confuso.

Serge van Ginderachter
fonte
5

Você também pode criar uma nova solicitação pull que está vinculada a, em mastervez de uma abc1234revisão específica .

Dessa forma, qualquer novo commit / push em seu repositório será adicionado à solicitação pull.

cfedermann
fonte
3

Sim - você está fazendo muito mais trabalho do que precisa. Basta fazer um commit adicional e forçar o push. Você verá o commit original, bem como o recém-enviado ao atualizar o github em seu navegador.

$ git commit -m "These changes are in response to PR comments"
$ git push -f origin HEAD
Forrest
fonte
esta é a maneira mais fácil e direta, não sei por que não é a melhor resposta
Banjo Obayomi