Fluxo de trabalho preferido do Github para atualizar uma solicitação de recebimento após revisão de código

341

Enviei uma alteração para um projeto de código aberto no Github e recebi comentários de revisão de código de um dos membros principais da equipe.

Gostaria de atualizar o código levando em consideração os comentários da revisão e enviá-lo novamente. Qual é o melhor fluxo de trabalho para fazer isso? Pelo meu conhecimento limitado do git / github, eu poderia fazer o seguinte:

  1. Atualize o código como uma nova confirmação e adicione a confirmação inicial e a atualização à minha solicitação de recebimento.

  2. De alguma forma (??) reverter o commit antigo do meu repositório e criar um único commit novo contendo tudo, e então gerar uma solicitação pull para isso?

  3. git committem um recurso de alteração, mas ouvi dizer que você não deve usá-lo depois de enviar o commit para fora do seu repositório local? Nesse caso, eu fiz a alteração no meu PC local e enviei para o ramo do github do projeto. Seria bom usar 'alterar'?

  4. Algo mais?

Parece que a opção 2/3 seria legal, pois o projeto de código aberto teria apenas um commit em sua história que implementaria tudo, mas não tenho certeza de como fazer isso.

Nota: Não sei se isso afeta a resposta ou não, mas não fiz as alterações em uma ramificação separada, apenas fiz um commit em cima do master

Orion Edwards
fonte

Respostas:

219

Basta adicionar uma nova confirmação à ramificação usada na solicitação pull e enviar a ramificação para o GitHub. A solicitação de recebimento será atualizada automaticamente com a confirmação adicional.

# 2 e # 3 são desnecessários. Se as pessoas quiserem ver apenas onde sua ramificação foi mesclada (e não as confirmações adicionais), elas poderão usar git log --first-parentpara exibir apenas a confirmação de mesclagem no log.

Âmbar
fonte
7
masteré um ramo também, então tecnicamente não importa :)
picar
10
@OrionEdwards - como puxão mencionado, o mestre é um ramo, portanto, atualizá-lo fará com que todas as solicitações de recebimento baseadas nele também sejam atualizadas. (Esta é uma boa razão para usar um ramo separado para qualquer coisa que você pretende apresentar um pedido puxar para.)
Âmbar
18
Desde que o código ainda está em análise é geralmente melhor para corrigir o commit (s) em vez de introduzir commits de correcção adicionais que só atravancam a história ...
mgalgs
4
@mgalgs Essa é uma questão de preferência.
Amber
4
Não gosto desta resposta por motivos explicados no post que acabei de escrever ; Eu acredito que a outra resposta é muito melhor.
Adam Spiers
224

Para atualizar uma solicitação de recebimento

Para atualizar uma solicitação de recebimento (ponto 1), a única coisa que você precisa fazer é fazer check-out da mesma ramificação da qual o pedido de recebimento é e enviá-lo novamente:

cd /my/fork
git checkout master
...
git commit -va -m "Correcting for PR comments"
git push

Opcional - histórico de confirmação de limpeza

Você pode ser solicitado a juntar suas confirmações para que o histórico do repositório fique limpo ou você deseja remover as confirmações intermediárias que desviam a atenção da "mensagem" em sua solicitação de recebimento (ponto 2). Por exemplo, se o seu histórico de consolidação estiver assim:

$ git remote add parent [email protected]:other-user/project.git
$ git fetch parent
$ git log --oneline parent/master..master
e4e32b8 add test case as per PR comments
eccaa56 code standard fixes as per PR comments
fb30112 correct typos and fatal error
58ae094 fixing problem

É uma boa ideia juntar as coisas para que elas apareçam como um único commit:

$ git rebase -i parent/master 

Isso solicitará que você escolha como reescrever o histórico de sua solicitação de recebimento; o seguinte estará em seu editor:

pick 58ae094 fixing actual problem
pick fb30112 correct typos
pick eccaa56 code standard fixes
pick e4e32b8 add test case as per PR comments

Para qualquer confirmação que você queira fazer parte da confirmação anterior - altere pick para squash:

pick 58ae094 fixing actual problem
squash fb30112 correct typos
squash eccaa56 code standard fixes
squash e4e32b8 add test case as per PR comments

E feche seu editor. O Git reescreverá o histórico e solicitará que você forneça uma mensagem de confirmação para a confirmação combinada. Altere de acordo e seu histórico de consolidação agora será conciso:

$ git log --oneline parent/master..master
9de3202 fixing actual problem

Empurre isso para o seu garfo:

$ git push -f
Counting objects: 19, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (5/5), done.
Writing objects: 100% (11/11), 978 bytes, done.
Total 11 (delta 9), reused 7 (delta 6)
To [email protected]:me/my-fork.git
   f1238d0..9de3202  HEAD -> master

e sua solicitação de recebimento conterá uma única confirmação, incorporando todas as alterações anteriormente divididas em várias confirmações.

Mudar a história em repositórios públicos é uma coisa ruim

Reescrever o histórico e usar git push -fem um ramo que, potencialmente, alguém já tenha clonado é uma coisa ruim - faz com que o histórico do repositório e o do checkout divergam.

No entanto, alterar o histórico do seu fork para corrigir a alteração que você propõe integrar em um repositório - é uma coisa boa. Como tal, não há reservas esmagando o "ruído" dos seus pedidos de recepção.

Uma nota sobre ramos

No exemplo acima, mostro a solicitação pull como originária da masterramificação do seu fork, não há nada de errado nisso, mas ela cria certas limitações, como, se essa é sua técnica padrão, apenas poder ter um PR aberto por repositório . É uma idéia melhor criar uma ramificação para cada alteração individual que você deseja propor:

$ git branch feature/new-widgets
$ git checkout feature/new-widgets
...
Hack hack hack
...
$ git push
# Now create PR from feature/new-widgets
AD7six
fonte
28
+1 por mencionar como limpar as confirmações em vez de enviar confirmações adicionais de correção.
mgalgs
3
Eu tive alguns problemas ao escolher / esmagar e essa resposta me ajudou. Também notei que o Github removeu a conversa anterior depois de mim git push -f. Não houve muitos comentários, mas isso é algo que eu não esperava.
Hitesh
5
Só para esclarecer, ao refazer uma história limpa, você está realmente mudando seus compromissos públicos, apenas assumindo que ninguém se importa porque é um garfo.
21715
2
Acompanhamento: melhores práticas quando o mestre muda durante o seu PR?
Kevin Suttle
11
Considere que a reescrita do histórico em solicitações pull que foram revisadas (ou que em geral comentam sobre / referência ao código) pode causar confusão, pois o histórico não corresponde mais ao que os comentários estavam se referindo. Não existe uma solução fácil: alguém fechará o PR e o encaminhará para um novo (para não reescrever o histórico); minha idéia seria apenas fazer backup do SHA de confirmação mais recente que está sendo redefinido / reescrito e referenciá-lo em um comentário no PR, após a execução do push forçado. Se prune o IF não remover esse commit desanexado, seu histórico ainda corresponderá aos comentários do PR.
Kamafeather