3
votes

Comment rebaser tous les commits d'un avis Gerrit en même temps sans perdre +2 votes?

J'ai un changement avec plusieurs commits, par exemple:

  • dernier
  • seconde
  • premier

J'ai reçu +2 pour la fusion, mais malheureusement le maître a déménagé, et l'un des commits apparaît comme "conflit de fusion", donc je ne peux pas soumettre tous les commits en même temps.

Cependant, lorsque j'essaye de rebaser localement, le rebase est trivial. Et aussi, si j'utilise Rebase sur l'interface Web, cela résout le conflit avec succès.

Le problème avec le rebasage local, cependant, c'est que je perdrais les +2 votes et que je devrais à nouveau ennuyer les critiques.

L'interface Web conserve mes +2 votes, mais je n'ai pas trouvé de moyen de rebaser tous les commits à la fois: le mieux que je puisse faire était de:

  • rebase d'abord sur le nouveau maître
  • rebase deuxième par-dessus le premier avec Rebase on parent change
  • et ainsi de suite jusqu'au commit final

Si j'essaie de rebaser le dernier commit directement sur l'interface utilisateur Web, comme je le ferais depuis la CLI, Gerrit me prévient que cela briserait la chaîne de relations:

Rebase on top of the master branch (breaks relation chain)


2 commentaires

Je ne comprends pas votre question car il semble que vous n'utilisez pas les bons termes de Gerrit. Vous ne pouvez pas avoir de "patchset avec plusieurs commits" car "patchset" et "commit" sont exactement les mêmes. Voulez-vous dire que vous avez un "changement avec plusieurs commits (patchsets)"? Ou vous avez plusieurs changements?


@ MarceloÁviladeOliveira oui, merci, un changement avec plusieurs commits. Je ne connais pas très bien la terminologie de Gerrit. Question mise à jour.


3 Réponses :


2
votes

Essayez

  1. git checkout master
  2. git pull -> Cela extrait le dernier code du maître distant vers votre branche maître locale.
  3. git checkout your_branch_name.
  4. git rebase origin / master.

Résolvez les conflits de fusion et mettez à jour votre demande d'examen.


3 commentaires

Si je fais cela, je crois que je perds +2 voix comme mentionné dans la question.


Oui, vous perdriez +2 car vous enverriez un nouveau patchset après avoir résolu les conflits de fusion. Il doit probablement y avoir une demande de fonctionnalité sur Gerrit sinon déjà pour préserver les votes au cas où l'ID de validation serait le même, car le rebasage de la branche avec master ne modifiera pas l'ID de validation, je crois ... :)


La réinitialisation modifiera les SHA de validation depuis la modification des SHA de validation parent. Cela dépend peut-être de la configuration de Gerrit, mais d'après mon expérience, les avis +2 ne sont pas rejetés sauf si vous avez réellement apporté des modifications (par exemple, la résolution de conflits).



0
votes

Je ne pense pas qu'il existe un moyen de faire cela. La modification des commits (et le rebase est une modification) signifie que les commits doivent être révisés.

D'après mon expérience, vous ne devriez pas pousser les nouveaux commits pour examen tant que le dernier n'est pas terminé et poussé plus loin.


1 commentaires

Je peux comprendre cette justification, mais il convient de noter que le rebase sur l'interface Web conserve les +2 votes.



2
votes

Quand vous avez un changement avec plusieurs ensembles de patchs (commits), vous n'avez pas besoin de rebaser chaque commit, il vous suffit de rebaser le dernier commit. En fait, vous allez soumettre (intégrer / fusionner) uniquement le dernier commit et non toute la chaîne. Chaque fois que vous modifiez un patchset, vous créez un nouveau commit qui remplace le précédent.

Si vous êtes confus avec ce concept, il est bon de lire le Utilisation de Gerrit: un exemple d’élément dans la documentation de Gerrit.

Réponse à votre question: lorsque vous rebasez un patchset, Gerrit traitera les votes + 1 / + 2 selon le copyAllScoresOnTrivialRebase du projet. Si la valeur est true, tous les scores de l'étiquette sont copiés vers l'avant lorsqu'un nouvel ensemble de correctifs est téléchargé qui est un rebase trivial. Il n'y a aucune différence dans la façon dont cela fonctionne si le rebase est effectué manuellement et poussé ou effectué à l'aide de l'interface utilisateur Web. Si vous obtenez un comportement différent, assurez-vous de ne pas modifier le message de validation.

Un nouvel ensemble de correctifs est considéré comme un rebase trivial si le message de validation est le même que dans le jeu de patchs précédent et s'il a le même code delta comme le jeu de correctifs précédent.


1 commentaires

OK, donc si je rebase le dernier, cela fonctionnera alors. J'essaierai ça la prochaine fois. J'avais peur que cela fasse quelque chose de bizarre à cause de la partie "rupture de la chaîne de relations" de la description. Je ne savais pas qu'il y avait un paramètre pour conserver le +2, mais cela doit être activé dans mon instance, donc ça va.