github: Ajout de commits à une pull request existante

88

J'ai ouvert une pull request pour rails repo sur github en utilisant le bouton Fork & Edit this file file.

Maintenant, après avoir reçu des commentaires sur mon PR, je voulais ajouter d'autres commits. alors voici ce que j'ai fini par faire

$ 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

Cela a bien fonctionné mais semble un flux de travail assez complexe. Peut-être que je me trompe, quelque chose ne va pas ici?

ma question est la suivante: est-ce que je fais cela correctement? sinon, quelle est la bonne façon de procéder?

CuriousMind
la source
4
Certains venant ici trouveront peut-être que cela correspond mieux à leur scénario: stackoverflow.com/questions/9790448/…
AaronLS
4
J'ai également trouvé cette version de la question / réponse plus claire: stackoverflow.com/questions/7947322/...
Ben Wheeler

Réponses:

63

Étant donné que vous utilisez les outils de GitHub et que vous ne modifiez qu'un seul fichier, vous pouvez également parcourir le fichier sur GitHub, sélectionner la branche appropriée dans le coin supérieur gauche sous le menu déroulant "tree:" ( patch-3dans votre cas), puis choisir "Modifier ce fichier". Désormais, vos modifications seront validées dans cette branche et apparaîtront dans votre pull request

Abe Voelker
la source
10

Je viens de bloguer sur ce sujet:

Comment garder cette branche de fonctionnalités à jour? La fusion des derniers commits en amont est facile, mais vous voulez éviter de créer un commit de fusion, car cela ne sera pas apprécié lorsqu'il est poussé vers l'amont: vous recommencez alors effectivement les changements en amont, et ces commits en amont recevront un nouveau hachage ( comme ils obtiennent un nouveau parent). Ceci est particulièrement important, car ces validations fusionnées seraient reflétées dans votre demande d'extraction GitHub lorsque vous transmettez ces mises à jour à votre branche de fonctionnalités GitHub personnelle (même si vous le faites après avoir émis la demande d'extraction.)

C'est pourquoi nous devons rebaser au lieu de fusionner:

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

L'option rebase et la commande rebase de git garderont votre arbre propre et éviteront d'avoir des validations de fusion. Mais gardez à l'esprit que ce sont vos premiers commits (avec lesquels vous avez émis votre première pull request) qui sont rebasés, et qui ont maintenant un nouveau hachage de commit, qui est différent des hachages d'origine qui se trouvent toujours dans votre branche de dépôt github distante .

Maintenant, pousser ces mises à jour vers votre branche de fonctionnalité GitHub personnelle échouera ici, car les deux branches diffèrent: l'arborescence de la branche locale et l'arborescence de la branche distante sont «désynchronisées», à cause de ces différents hachages de validation. Git vous dira d'abord git pull --rebase, puis de pousser à nouveau, mais ce ne sera pas une simple avance rapide, car votre historique a été réécrit. Ne fais pas ça!

Le problème ici est que vous récupérerez à nouveau vos premiers commits modifiés tels qu'ils étaient à l'origine, et ceux-ci seront fusionnés au-dessus de votre branche locale. En raison de l'état de désynchronisation, cette extraction ne s'applique pas proprement. Vous obtiendrez un historique cassé où vos commits apparaissent deux fois. Lorsque vous poussez tout cela dans votre branche de fonctionnalités GitHub, ces modifications seront reflétées sur la demande d'extraction d'origine, qui deviendra très, très moche.

AFAIK, il n'y a en fait pas de solution totalement propre à cela. La meilleure solution que j'ai trouvée est de forcer le transfert de votre branche locale vers votre branche GitHub (en forçant en fait une mise à jour non rapide):

Comme pour 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.

Alors ne tirez pas, forcez simplement à pousser comme ceci:

git push svg +user-non-unique

ou:

git push svg user-non-unique --force

Cela écrasera clairement votre branche distante, avec tout ce qui se trouve dans votre branche locale. Les commits qui sont dans le flux distant (et qui ont causé l'échec) y resteront, mais seront des commits suspendus, qui seront finalement supprimés par git-gc (1). Pas grand-chose.

Comme je l'ai dit, c'est AFAICS la solution la plus propre. L'inconvénient de cela, c'est que votre PR sera mis à jour avec ces derniers commits, qui auront une date ultérieure, et pourraient apparaître désynchronisés dans l'historique des commentaires du PR. Pas de gros problème, mais cela pourrait être déroutant.

Serge van Ginderachter
la source
5

Vous pouvez également créer une nouvelle demande d'extraction qui est liée à la masterplace d'unabc1234 révision .

De cette façon, tout nouveau commit / push vers votre référentiel sera ajouté à la pull request.

cfedermann
la source
3

Ouais - vous faites beaucoup plus de travail que nécessaire. Faites simplement un commit supplémentaire, puis forcez-le. Vous verrez le commit d'origine ainsi que celui qui vient d'être poussé lorsque vous actualisez github dans votre navigateur.

$ git commit -m "These changes are in response to PR comments"
$ git push -f origin HEAD
Forrest
la source
c'est la manière la plus simple et la plus directe,
je