web-dev-qa-db-fra.com

github: Ajout de validations à une demande d'extraction existante

J'ai ouvert une demande de pull pour Rails repo sur github en utilisant Fork & Edit ce fichier bouton de fichier.

Maintenant, après avoir reçu des commentaires sur mon PR, je voulais ajouter plus de commits. voici donc 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 workflow assez complexe. Peut-être que je me trompe quelque chose de mal ici?

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

80
CuriousMind

Puisque vous utilisez les outils de GitHub et que vous modifiez simplement un fichier, vous pouvez également accédez au fichier sur GitHub, sélectionnez la branche appropriée dans le coin supérieur gauche sous la liste déroulante "arborescence:" (patch-3 dans votre cas), puis choisissez "Modifier ce fichier". Vos modifications seront désormais validées dans cette branche et apparaîtront dans votre demande de tirage

55
Abe Voelker

J'ai récemment blogué sur ce sujet:

Comment garder à jour cette branche de fonctionnalités? La fusion des commits en amont les plus récents est facile, mais vous voulez éviter de créer un commit de fusion, car cela ne sera pas apprécié quand il sera poussé en amont: vous réinitialisez alors efficacement les modifications en amont, et ces commits en amont obtiendront un nouveau hachage ( comme ils obtiennent un nouveau parent). Ceci est particulièrement important, car ces validations fusionnées se refléteraient dans votre demande Pull Github lorsque vous transmettez ces mises à jour à votre branche de fonctionnalité Github personnelle (même si vous le faites après avoir émis la demande Pull).

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 de rebase et la commande de rebase de git garderont votre arborescence propre et éviteront les validations de fusion. Mais gardez à l'esprit que ce sont vos premières validations (avec lesquelles vous avez émis votre première demande de tirage) qui sont en cours de rebasage et qui ont maintenant un nouveau hachage de validation, qui est différent des hachages d'origine qui se trouvent toujours dans votre branche distante de dépôt github.

Maintenant, pousser ces mises à jour vers votre branche de fonctionnalité Github personnelle échouera ici, car les deux branches diffèrent: l'arborescence de branche locale et l'arborescence de branche distante sont "désynchronisées", en raison de ces différents hachages de validation. Git vous dira de commencer par git pull --rebase, puis Push à nouveau, mais ce ne sera pas une simple avance rapide, car votre histoire a été réécrite. Ne fais pas ça!

Le problème ici est que vous récupéreriez à 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 désynchronisé, cette traction ne s'applique pas proprement. Vous obtiendrez un historique b0rken où vos validations apparaissent deux fois. Lorsque vous pousseriez tout cela vers votre branche de fonctionnalité github, ces changements seront reflétés dans la demande d'extraction d'origine, ce qui deviendra très, très laid.

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

Selon 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 Push comme ceci:

git Push svg +user-non-unique

ou:

git Push svg user-non-unique --force

Cela écrasera clairement votre branche distante, avec tout dans votre branche locale. Les validations qui se trouvent dans le flux distant (et qui ont provoqué l'échec) y resteront, mais seront des validations pendantes, qui seront finalement supprimées par git-gc (1). Pas grave.

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 les 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 source de confusion.

8

Vous pouvez également créer une nouvelle demande d'extraction liée à master au lieu d'une révision spécifique abc1234.

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

5
cfedermann