web-dev-qa-db-fra.com

Flux de travail Github préféré pour la mise à jour d'une demande d'extraction après la révision du code

J'ai soumis une modification à un projet Open Source sur Github et reçu les commentaires de révision de code d'un des membres de l'équipe principale.

Je souhaite mettre à jour le code en tenant compte des commentaires de révision et le soumettre à nouveau. Quel est le meilleur flux de travail pour cela? De par ma connaissance limitée de git/github, je pourrais effectuer l’une des tâches suivantes:

  1. Mettez à jour le code en tant que nouvelle validation et ajoutez la validation initiale et la validation mise à jour à ma demande d'extraction.

  2. D'une manière ou d'une autre (??), annulez l'ancien commit de mon référentiel et créez un seul commit contenant tout, puis émettez une demande d'extraction pour cela?

  3. git commit a une fonctionnalité de modification, mais j'ai entendu dire que vous ne devriez pas l'utiliser après avoir poussé la validation en dehors de votre référentiel local? Dans ce cas, j'ai effectué le changement sur mon PC local et poussé dans ma branche github du projet. Est-ce que ce serait bien d'utiliser 'modifier'?

  4. Autre chose?

Il semble que l’option 2/3 serait Nice, car le projet open source n’aurait qu’un seul commit dans son histoire qui mettrait tout en œuvre, mais je ne sais pas comment faire.

Remarque: je ne sais pas si cela affecte la réponse ou non, mais je n'ai pas apporté les modifications dans une branche distincte, j'ai simplement effectué une validation en plus du maître.

325
Orion Edwards

Ajoutez simplement un nouveau commit à la branche utilisée dans la demande d'extraction et transmettez la branche à GitHub. La demande d'extraction sera automatiquement mise à jour avec la validation supplémentaire.

Les n ° 2 et n ° 3 sont inutiles. Si les utilisateurs veulent uniquement savoir où votre branche a été fusionnée (et non les validations supplémentaires), ils peuvent utiliser git log --first-parent pour afficher uniquement la validation de fusion dans le journal.

211
Amber

Pour mettre à jour une demande d'extraction

Pour mettre à jour une demande d'extraction (point n ° 1), il vous suffit d'extraire de la même branche que celle d'où provient l'opération d'extraction et de cliquer à nouveau dessus:

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

Facultatif - Nettoyage de l'historique de validation

Il peut vous être demandé de regrouper vos commits afin que l'historique du référentiel soit épuré ou vous-même souhaitez supprimer les commits intermédiaires qui distraient du "message" dans votre demande d'extraction (point 2). Par exemple, si votre historique de validation ressemble à ceci:

$ 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

C'est une bonne idée de regrouper les éléments pour qu'ils apparaissent comme un simple commit:

$ git rebase -i parent/master 

Cela vous invitera à choisir comment réécrire l'historique de votre demande d'extraction, les éléments suivants seront dans votre éditeur:

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

Pour tout commit vous voulez faire partie du commit précédent - changez le choix en squash:

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

Et fermez votre éditeur. Git réécrira ensuite l'historique et vous invitera à fournir un message de validation pour la validation combinée. Modifiez en conséquence et votre historique de validation sera maintenant concis:

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

Pousse ça sur ta fourche:

$ 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

et votre demande d'extraction contiendra un seul commit, incorporant toutes les modifications précédemment divisées en plusieurs commits.

Changer l'histoire des pensions publiques est une mauvaise chose

La réécriture de l'historique et l'utilisation de git Push -f sur une branche potentiellement clonée par quelqu'un d'autre est déjà une mauvaise chose. Cela entraîne une divergence de l'historique du référentiel et de celui de la caisse.

Cependant, modifier l'historique de votre fork pour corriger le changement que vous êtes en proposant à intégrer dans un référentiel - est une bonne chose. En tant que tel, n’hésitez pas à réserver du "bruit" à vos demandes d’aération.

Une note sur les branches

Dans ce qui précède, je montre que la demande d'extraction provient de la branche master de votre fork, il n'y a rien de mal à cela nécessairement, mais cela crée certaines limitations telles que, s'il s'agit de votre technique standard, vous ne pouvez avoir un PR ouvert par référentiel. Il est cependant préférable de créer une branche pour chaque changement individuel que vous souhaitez proposer:

$ git branch feature/new-widgets
$ git checkout feature/new-widgets
...
Hack hack hack
...
$ git Push
# Now create PR from feature/new-widgets
213
AD7six

Mon opinion sur les meilleures pratiques: une fois que vous êtes prêt à traiter une demande d'extraction, elle devrait se doter dès le départ de sa propre branche thématique, spécialement à cet effet. Vous commencez par pousser cette branche dans votre référentiel github, par exemple.

git Push Origin name-of-pull-request-branch

et baser la demande de traction de cette branche. Une fois que cela est fait, tout envoi que vous poussez vers cette branche sera automatiquement ajouté à la demande d'extraction. Vous utilisez cette branche pour rien d'autre.

Certains préfèrent que vous nommez de telles branches avec votre identifiant utilisateur github. De cette façon, ils peuvent vérifier librement localement pour essayer, avec des avantages tels que

  • moins de peur de la collision de noms de branches
  • plus facile de se rappeler ce que c'est

Je nomme généralement mes branches de demande de tir quelque chose comme

claybridges-do-the-things
5
Clay Bridges