Aller au contenu
Développement medium

Pull requests et code review

14 min de lecture

Une pull request (PR), ou merge request (MR) sur GitLab, est une demande d'intégration de votre branche dans une autre. C'est le mécanisme central de la collaboration moderne : votre code est relu, discuté et validé avant d'être mergé. Ce guide couvre le workflow complet, de la création à l'intégration.

Prérequis : Workflows distribués et Merge et conflits.

  • Créer une Pull Request bien structurée pour faciliter la revue
  • Conduire une revue de code constructive sans bloquer l'équipe
  • Naviguer dans le cycle de vie d'une PR de l'ouverture à la fusion
  • Gérer les retours : amendments, force-push et itérations

Les huit étapes ci-dessous se déroulent à deux endroits distincts, et c'est la principale source de confusion pour qui débute. Les étapes 1, 2 et 5 se passent dans votre dépôt local, avec des commandes git. Les étapes 3 à 8 se passent sur la forge, GitHub ou GitLab, dans une interface web. La pull request elle-même n'existe pas dans Git : c'est un objet propre à la forge, qui suit l'évolution d'une branche déjà poussée.

Notez aussi que la boucle 4 à 5 se répète autant de fois que nécessaire. Une PR qui repart en correction n'est pas un échec, c'est le fonctionnement normal du processus.

1. Créer une branche
2. Commiter et pousser
3. Ouvrir la PR
4. Review + discussions
5. Corrections (si demandées)
6. Approbation
7. Merge
8. Suppression de la branche

Cinq commandes suffisent avant d'ouvrir la PR. L'étape la plus souvent oubliée est la troisième : le git rebase origin/main rejoue vos commits sur la version la plus récente de main. Vous découvrez les conflits sur votre poste, où vous avez vos outils, au lieu de les laisser apparaître dans l'interface web de la forge où la résolution est nettement plus pénible.

Le -u du git push de l'étape 4 associe une bonne fois pour toutes votre branche locale à celle du dépôt distant. Les git push suivants se feront sans argument, tant que vous vous contentez d'ajouter des commits. Si vous rejouez un rebase après avoir déjà poussé, l'historique diverge et le push est refusé : utilisez alors git push --force-with-lease, qui refuse d'écraser le travail d'un collègue arrivé entre-temps, contrairement à --force.

  1. Créez une branche depuis main à jour :

    Fenêtre de terminal
    git switch main
    git pull origin main
    git switch -c feature/user-avatar
  2. Travaillez avec des commits atomiques :

    Fenêtre de terminal
    # Chaque commit = un changement logique
    git add src/components/Avatar.tsx
    git commit -m "feat: ajouter le composant Avatar"
    git add src/pages/profile.tsx
    git commit -m "feat: intégrer Avatar dans la page profil"
  3. Rebasez sur main avant de pousser (pour éviter les conflits) :

    Fenêtre de terminal
    git fetch origin
    git rebase origin/main
  4. Poussez votre branche :

    Fenêtre de terminal
    git push -u origin feature/user-avatar
  5. Ouvrez la PR sur GitHub/GitLab via l'interface web

Une PR bien rédigée accélère la review et réduit les allers-retours.

Le titre est ce que verront vos collègues dans une liste de vingt PR ouvertes, et c'est aussi lui qui deviendra le message de commit sur main si l'équipe pratique le squash. Il doit annoncer le résultat obtenu, pas l'activité menée : « ajouter le composant Avatar » se comprend, « travail sur le profil » n'apprend rien. Le préfixe conventionnel (feat:, fix:, docs:) permet en prime aux outils de génération de changelog de classer la modification.

Court, descriptif, au format conventionnel :

feat: ajouter le composant Avatar avec upload d'image
fix: corriger le redirect après déconnexion
docs: documenter l'API de notifications

La section qui fait le plus gagner de temps est Comment tester. Sans elle, le relecteur doit deviner la manipulation à effectuer et se contente souvent de lire le diff, ce qui laisse passer les régressions fonctionnelles. La section Contexte répond de son côté à la question qu'un relecteur ne posera pas toujours à voix haute : pourquoi ce changement maintenant, et quelle alternative a été écartée.

Structurez avec ces sections :

## Contexte
Pourquoi cette modification est nécessaire.
## Changements
- Ajout du composant `Avatar` (upload + crop)
- Intégration dans la page profil
- Tests unitaires pour le crop
## Comment tester
1. Aller sur /profil
2. Cliquer sur l'avatar
3. Uploader une image > 2 Mo → vérifier le message d'erreur
## Captures d'écran
(si changement visuel)

La taille d'une PR est le facteur qui pèse le plus sur la qualité de la revue. Au-delà de quelques centaines de lignes, l'attention du relecteur baisse et les commentaires se déplacent vers ce qui est facile à repérer, le nommage et le formatage, au détriment de la logique métier. La colonne Qualité du tableau traduit ce phénomène : elle qualifie la revue, pas le code soumis.

Taille de PRLignes modifiéesTemps de reviewQualité
Petite< 20015-30 minExcellente
Moyenne200-50030-60 minBonne
Grande> 500> 1hMédiocre

Visez des PR de moins de 200 lignes. Au-delà, découpez en plusieurs PR dépendantes.

Si votre travail n'est pas terminé mais que vous voulez un retour précoce, ouvrez une draft PR :

  • GitHub : bouton « Create draft pull request »
  • GitLab : préfixez le titre avec Draft: ou cochez l'option

La draft PR signale aux reviewers que le code n'est pas prêt pour le merge mais que des retours sont bienvenus sur l'approche.

Parcourez ces six catégories dans l'ordre du tableau, du plus coûteux au moins coûteux à corriger après coup. Une faille de sécurité ou une erreur de logique repérée en revue vaut des heures de débogage évitées ; un problème de convention de style se règle en trente secondes et devrait de toute façon être détecté par un linter automatique, pas par un humain. Si votre revue ne contient que des remarques de la dernière ligne, c'est le signe qu'il manque un outillage dans la chaîne d'intégration.

CatégoriePoints à vérifier
LogiqueLe code fait-il ce qu'il prétend ? Cas limites ?
LisibilitéNoms clairs ? Structure compréhensible ?
TestsCouvrent-ils les cas importants ?
SécuritéInjection, XSS, secrets en dur ?
PerformanceRequête N+1, boucle coûteuse ?
ConventionsStyle du projet respecté ?

Les commentaires de review doivent être précis, bienveillants et actionnables :

Au lieu de...Écrivez...
« C'est nul »« Cette approche risque X. Et si on faisait Y ? »
« Pourquoi t'as fait ça ? »« Quelle est la raison de ce choix ? Je me demande si Z serait plus maintenable. »
« Change ça »« Suggestion : renommer data en userProfile pour plus de clarté. »

Sans convention, l'auteur d'une PR ne sait pas distinguer une remarque facultative d'une demande bloquante, et il traite tout au même niveau : soit il corrige des détails inutiles, soit il ignore un point important. Ces préfixes sont une convention d'équipe informelle, largement répandue mais non standardisée : notez-la dans le fichier de contribution du dépôt pour que les nouveaux arrivants la connaissent.

Préfixez vos commentaires pour indiquer leur importance :

  • nit:, détail cosmétique, non bloquant
  • suggestion:, idée d'amélioration, discutable
  • question:, demande de clarification
  • concern:, point potentiellement problématique
  • (pas de préfixe), changement requis avant merge

Au moment du merge, trois options s'offrent à vous. Elles ne changent rien au contenu final des fichiers sur main : le code obtenu est identique dans les trois cas. Ce qui diffère, c'est la forme de l'historique, donc la facilité avec laquelle vous retrouverez plus tard l'origine d'une régression avec git log, git blame ou git bisect.

StratégieRésultatAvantageInconvénient
Merge commitCommit de merge + historique completTraçabilité exacte de la PRGraphe en losange, git log plus difficile à lire
Squash and mergeUn seul commit sur mainHistorique de main très proprePerd le détail des commits de la PR
Rebase and mergeCommits rejoués linéairement sur mainHistorique linéaire avec commits individuelsLes hashes changent, attribution des auteurs peut varier

Tout ce qui précède repose sur une convention d'équipe, et une convention se contourne, souvent sans mauvaise intention, un vendredi soir. Les règles de protection transforment cette convention en contrainte appliquée par la forge : plus personne ne peut pousser directement sur main, y compris les administrateurs si vous cochez l'option correspondante.

Configurez des règles de protection sur main :

  • Revue obligatoire : au moins 1 (ou 2) approbation(s) avant merge
  • CI/CD passante : les tests doivent être verts
  • Branche à jour : la branche doit être rebasée sur main
  • Pas de push direct : tout passe par une PR

Sur GitHub : Settings → Branches → Branch protection rules. Sur GitLab : Settings → Repository → Protected branches.

Trois de ces quatre situations se règlent dans votre dépôt local, pas dans l'interface de la forge : la PR reflète l'état de la branche distante et se met à jour d'elle-même dès que vous poussez. Attention à la première ligne, la seule qui impose un force-push : après un rebase, préférez toujours git push --force-with-lease à git push --force, faute de quoi vous risquez d'écraser les commits qu'un collègue aurait poussés sur la même branche.

SymptômeCause probableSolution
PR avec conflitsBranche pas à jour avec maingit rebase origin/main puis force-push
« CI failed » sur la PRTests cassés ou lintingCorrigez localement, poussez un nouveau commit
Reviewer ne répond pasPR trop grosse ou mal décriteDécoupez, améliorez la description, relancez poliment
Historique pollué de « fix review »Commits de correction post-reviewgit rebase -i pour squasher avant merge
  • Une PR = un sujet, de préférence < 200 lignes
  • Titre conventionnel (feat:, fix:, docs:) + description structurée
  • La draft PR permet d'obtenir un retour précoce
  • Les commentaires de review sont précis et bienveillants
  • Protégez main : revue obligatoire + CI passante
  • Choisissez une stratégie de merge cohérente dans l'équipe

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracking. Un soutien, même symbolique, m'aide à couvrir l'hébergement et à garder ces ressources gratuites. Merci pour votre appui.

Le formulaire ne s'affiche pas ? Ouvrir Ko-fi dans un onglet.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn