# Présentation tech interne

# Git



# git bisect

### À quoi ça sert ?

- Permet de mettre en évidence un commit qui a induit un changement dans un historique de commits
- Ce changement peut correspondre à un bug, à un test qui casse... tout changement d'état

### Comment ça marche

- Prenons l'exemple le plus simple : j'ai développé une feature, et j'ai induis un bug
- Je sais qu'au premier commit (commit 1), je n'avais pas de bug
- Je sais qu'au dernier commit (commit 8), j'ai un bug

[![image.png](https://ambroise.reconnect.fr/uploads/images/gallery/2025-12/scaled-1680-/NQGimage.png)](https://ambroise.reconnect.fr/uploads/images/gallery/2025-12/NQGimage.png)

Au lieu de checkout sur chaque commit pour constater si le bug existe (ce qui impliquerait de vérifier 8 commits), je peux utiliser git bisect :

- <span style="white-space: pre-wrap;">Je vais devoir flaguer un commit "good" (sans bug) </span>****-&gt; commit 1****
- <span style="white-space: pre-wrap;">Et un commit "bad" (avec bug) </span>****-&gt; commit 8****
- Ensuite, au lieu de vérifier commit par commit, git bisect va séparer la feature en 2 : il va checkout sur le commit 4 pour savoir si il est "good" ou "bad".
- Et ainsi de suite ! Si le commit 4 est "good", le bug se trouve forcément entre le commit 4 et le commit 8, donc il va me faire vérifier le commit 6 etc... Jusqu'à pouvoir identifier le commit qui a induit une erreur

### En pratique :

Entrer en mode bisection :

```
git bisect start
```

Flag initial d'un commit "good" et "bad", en indiquant la référence du commit (optionnel si je me trouve sur ce commit :

```
git bisect good cebcb8b352b80af4dfa92e554ac5a608dffa7be1 #(SHA commit 1)
git bisect bad #le SHA peut être optionnel si je suis positionné sur le commit 8
```

Flag des commits proposés durant la bisection :

```
git bisect good
#OU
git bisect bad
```

Fin de la session bisection :

```
git bisect reset
```

Ceci correspond au mode manuel de git bisect, mais il est aussi possible de l'automatiser. Pour cela, reproduire les 2 premières étapes mentionnées plus haut. Puis lancer :

```
git bisect run <monScript>
```

Le script peut être n'importe quoi : lancer un test unitaire, exécuter un script php, bash etc...  
La bissection sera alors automatique, et git bisect pourra flaguer les commits automatiquement en fonction du retour du script, et donc mettre en évidence le commit problématique seul

# GitHub Copilot 🤖

<p class="callout info">GitHub Copilot est un assistant de programmation basé sur l'IA (développé par GitHub et OpenAI) qui analyse ton code en temps réel et propose des suggestions pour coder plus vite. Il est intégré directement dans PhpStorm via un plugin officiel.</p>

#### Prerequis

- Un compte GitHub actif avec un abonnement GitHub Copilot (individuel, Business ou Enterprise)
- PhpStorm version 2023.1 ou superieure (compatible avec le plugin officiel)

---

#### Installation

1. <span style="white-space: pre-wrap;">Aller dans </span>****File &gt; Settings &gt; Plugins****<span style="white-space: pre-wrap;"> (ou </span>`<span class="editor-theme-code">Ctrl+Alt+S</span>`<span style="white-space: pre-wrap;"> puis « Plugins »)</span>
2. <span style="white-space: pre-wrap;">Chercher </span>****GitHub Copilot****<span style="white-space: pre-wrap;"> dans l'onglet </span>**Marketplace**
3. <span style="white-space: pre-wrap;">Cliquer sur </span>****Install****<span style="white-space: pre-wrap;"> puis redémarrer PhpStorm</span>
4. Se connecter à GitHub via la notification qui apparaît en bas à droite

---

#### Complétion de code automatique

Dès que tu commences à taper, Copilot propose des suggestions en gris directement dans l'éditeur.

<table id="bkmrk-raccourciactiontabac"><colgroup><col></col><col></col></colgroup><tbody><tr><th>Raccourci

</th><th>Action

</th></tr><tr><td>`<span class="editor-theme-code">Tab</span>`

</td><td>Accepter la suggestion

</td></tr><tr><td>`<span class="editor-theme-code">Échap</span>`

</td><td>Rejeter la suggestion

</td></tr><tr><td>`<span class="editor-theme-code">Alt + ]</span>`

<span style="white-space: pre-wrap;"> / </span>

`<span class="editor-theme-code">Alt + [</span>`

</td><td>Suggestion suivante / précédente

</td></tr><tr><td>`<span class="editor-theme-code">Ctrl + Entrée</span>`

</td><td>Ouvrir le panneau de toutes les suggestions

</td></tr><tr><td>`<span class="editor-theme-code">Alt + Shift + \</span>`

</td><td>Déclencher une suggestion manuellement

</td></tr></tbody></table>

****Astuce :****<span style="white-space: pre-wrap;"> écrire un commentaire avant ton code améliore considérablement la pertinence des suggestions. Exemple :</span>

```php
// Fonction qui valide un email et retourne true si valide
function validateEmail(string $email): bool {
```

---

#### Copilot Chat

<span style="white-space: pre-wrap;">Le panneau Chat permet d'interagir avec son code en langage naturel. Il est accessible via </span>****Tools &gt; GitHub Copilot &gt; Open Chat****, ou en cliquant sur l'icône ci-dessous dédié dans la barre latérale droite de PhpStorm.  
<span style="white-space: pre-wrap;"> </span>[![Capture d’écran 2026-03-10 à 17.33.19.png](https://ambroise.reconnect.fr/uploads/images/gallery/2026-03/scaled-1680-/capture-decran-2026-03-10-a-17-33-19.png)](https://ambroise.reconnect.fr/uploads/images/gallery/2026-03/scaled-1680-/capture-decran-2026-03-10-a-17-33-19.png)

#### Les modes du Chat

Un menu déroulant en bas de la fenêtre permet de choisir entre quatre modes.

<span style="white-space: pre-wrap;">Le mode </span>****Ask****<span style="white-space: pre-wrap;"> est le plus simple : on pose une question, Copilot répond sans modifier le code. Idéal pour comprendre un bout de code, explorer une approche ou débloquer une erreur.</span>

<span style="white-space: pre-wrap;">Le mode </span>****Edit****<span style="white-space: pre-wrap;"> permet de décrire une modification en langage naturel sur un ou plusieurs fichiers. Copilot applique les changements et affiche un diff à valider. Utile quand on sait ce qu'on veut mais qu'on ne veut pas l'écrire soi-même.</span>

<span style="white-space: pre-wrap;">Le mode </span>****Plan****<span style="white-space: pre-wrap;"> génère un plan détaillé des étapes à suivre pour accomplir une tâche, sans toucher au code. Pratique pour cadrer une fonctionnalité complexe avant de se lancer.</span>

<span style="white-space: pre-wrap;">Le mode </span>****Agent****<span style="white-space: pre-wrap;"> est le plus autonome : Copilot analyse le projet, choisit les fichiers à modifier et itère jusqu'à compléter la tâche. À réserver aux tâches complexes bien définies — il consomme plus de requêtes premium que les autres modes.</span>

#### Choix du modèle

<span style="white-space: pre-wrap;">Le sélecteur de modèle est disponible en haut de la fenêtre Chat. Plusieurs modèles sont disponibles selon l'abonnement : </span>****GPT-4o****<span style="white-space: pre-wrap;"> est le modèle par défaut (bon équilibre qualité/vitesse), </span>****GPT-4.1****<span style="white-space: pre-wrap;"> est plus performant sur les tâches complexes, </span>****Claude Sonnet / Opus****<span style="white-space: pre-wrap;"> excellent en compréhension de contexte et refactoring, </span>****Gemini 2.5 Pro****<span style="white-space: pre-wrap;"> est particulièrement efficace sur les données.</span>

<span style="white-space: pre-wrap;">En cas de doute, le mode </span>****Auto****<span style="white-space: pre-wrap;"> laisse Copilot choisir le modèle le plus adapté à chaque requête.</span>

#### Commandes slash

Dans le Chat, des commandes slash permettent de déclencher des actions rapidement sur le code sélectionné :

- `<span class="editor-theme-code">/explain</span>`<span style="white-space: pre-wrap;"> — explique le code sélectionné</span>
- `<span class="editor-theme-code">/fix</span>`<span style="white-space: pre-wrap;"> — corrige les problèmes détectés</span>
- `<span class="editor-theme-code">/tests</span>`<span style="white-space: pre-wrap;"> — génère des tests unitaires</span>
- `<span class="editor-theme-code">/doc</span>`<span style="white-space: pre-wrap;"> — génère la documentation PHPDoc</span>
- `<span class="editor-theme-code">/optimize</span>`<span style="white-space: pre-wrap;"> — propose des optimisations</span>

---

#### Générer un message de commit avec Copilot

Dans la fenêtre de commit de PhpStorm, l'icône Copilot située au-dessus du champ de message permet de générer automatiquement un message en analysant le diff des fichiers stagés. Il ne reste plus qu'à relire, ajuster si besoin, et valider.

#### Personnaliser le format des messages générés

Par défaut, Copilot génère des messages dans son propre format. Il est possible de lui fournir des instructions globales pour qu'il respecte les conventions du projet.

<span style="white-space: pre-wrap;">Pour cela, aller dans </span>****Settings &gt; Tools &gt; GitHub Copilot &gt; Customizations****<span style="white-space: pre-wrap;">, puis dans la section </span>****Git Commit Instructions****<span style="white-space: pre-wrap;">, cliquer sur </span>****Global****<span style="white-space: pre-wrap;">. Cela génère et ouvre le fichier </span>`<span class="editor-theme-code">global-git-commit-instructions.md</span>`<span style="white-space: pre-wrap;"> directement dans l'éditeur, prêt à être renseigné.</span>  
  
<span style="white-space: pre-wrap;">Ci-dessous les instructions configurées pour que Copilot génère des messages de commit conformes aux conventions de l'équipe tech, intégrant l'utilisation de </span>[Gitmoji](https://gitmoji.dev).

<details id="bkmrk-%23-github-copilot-ins">```
# GitHub Copilot Instructions

## Commit Messages

Always generate commit messages following the format below and using the appropriate emoji for the type of change being made. This helps maintain a clear and consistent commit history, making it easier for everyone to understand the purpose of each commit at a glance.

### Format
```
<emoji> [<scope>] <short description>
[optional body]

[optional footer]
```

### Types et emojis associés (liste officielle Gitmoji)

| Emoji | Code | Type à utiliser | Description |
|-------|------|-----------------|-------------|
| ✨ | `:sparkles:` | `feat` | Introduce new features |
| 🐛 | `:bug:` | `fix` | Fix a bug |
| 🚑️ | `:ambulance:` | `fix` | Critical hotfix |
| 🩹 | `:adhesive_bandage:` | `fix` | Simple fix for a non-critical issue |
| ♻️ | `:recycle:` | `refactor` | Refactor code |
| 🎨 | `:art:` | `style` | Improve structure / format of the code |
| 💄 | `:lipstick:` | `style` | Add or update the UI and style files |
| 📝 | `:memo:` | `docs` | Add or update documentation |
| 💡 | `:bulb:` | `docs` | Add or update comments in source code |
| ✅ | `:white_check_mark:` | `test` | Add, update, or pass tests |
| 🧪 | `:test_tube:` | `test` | Add a failing test |
| 🔧 | `:wrench:` | `chore` | Add or update configuration files |
| 🔨 | `:hammer:` | `chore` | Add or update development scripts |
| ⬆️ | `:arrow_up:` | `chore` | Upgrade dependencies |
| ⬇️ | `:arrow_down:` | `chore` | Downgrade dependencies |
| ➕ | `:heavy_plus_sign:` | `chore` | Add a dependency |
| ➖ | `:heavy_minus_sign:` | `chore` | Remove a dependency |
| 📌 | `:pushpin:` | `chore` | Pin dependencies to specific versions |
| 📦️ | `:package:` | `chore` | Add or update compiled files or packages |
| 🙈 | `:see_no_evil:` | `chore` | Add or update a .gitignore file |
| ⚡️ | `:zap:` | `perf` | Improve performance |
| 👷 | `:construction_worker:` | `ci` | Add or update CI build system |
| 💚 | `:green_heart:` | `ci` | Fix CI Build |
| ⏪️ | `:rewind:` | `revert` | Revert changes |
| 🔥 | `:fire:` | `chore` | Remove code or files |
| 🚀 | `:rocket:` | `chore` | Deploy stuff |
| 🎉 | `:tada:` | `chore` | Begin a project |
| 🔒️ | `:lock:` | `fix` | Fix security or privacy issues |
| 🔐 | `:closed_lock_with_key:` | `chore` | Add or update secrets |
| 🔖 | `:bookmark:` | `chore` | Release / Version tags |
| 🚨 | `:rotating_light:` | `fix` | Fix compiler / linter warnings |
| 🚧 | `:construction:` | `chore` | Work in progress |
| 📈 | `:chart_with_upwards_trend:` | `feat` | Add or update analytics or track code |
| 🌐 | `:globe_with_meridians:` | `feat` | Internationalization and localization |
| ✏️ | `:pencil2:` | `fix` | Fix typos |
| ⏪️ | `:rewind:` | `revert` | Revert changes |
| 🔀 | `:twisted_rightwards_arrows:` | `chore` | Merge branches |
| 👽️ | `:alien:` | `fix` | Update code due to external API changes |
| 🚚 | `:truck:` | `refactor` | Move or rename resources |
| 📄 | `:page_facing_up:` | `chore` | Add or update license |
| 💥 | `:boom:` | `feat` | Introduce breaking changes |
| 🍱 | `:bento:` | `chore` | Add or update assets |
| ♿️ | `:wheelchair:` | `feat` | Improve accessibility |
| 💬 | `:speech_balloon:` | `feat` | Add or update text and literals |
| 🗃️ | `:card_file_box:` | `feat` | Perform database related changes |
| 🔊 | `:loud_sound:` | `chore` | Add or update logs |
| 🔇 | `:mute:` | `chore` | Remove logs |
| 🚸 | `:children_crossing:` | `feat` | Improve user experience / usability |
| 🏗️ | `:building_construction:` | `refactor` | Make architectural changes |
| 📱 | `:iphone:` | `feat` | Work on responsive design |
| 🥅 | `:goal_net:` | `fix` | Catch errors |
| 💫 | `:dizzy:` | `feat` | Add or update animations and transitions |
| 🗑️ | `:wastebasket:` | `refactor` | Deprecate code that needs to be cleaned up |
| 🛂 | `:passport_control:` | `feat` | Work on authorization, roles and permissions |
| 🧐 | `:monocle_face:` | `chore` | Data exploration/inspection |
| ⚰️ | `:coffin:` | `refactor` | Remove dead code |
| 👔 | `:necktie:` | `feat` | Add or update business logic |
| 🩺 | `:stethoscope:` | `chore` | Add or update healthcheck |
| 🧱 | `:bricks:` | `chore` | Infrastructure related changes |
| 🧑‍💻 | `:technologist:` | `chore` | Improve developer experience |
| 🦺 | `:safety_vest:` | `feat` | Add or update code related to validation |
| 🏷️ | `:label:` | `chore` | Add or update types |
| 🌱 | `:seedling:` | `chore` | Add or update seed files |
| 🚩 | `:triangular_flag_on_post:` | `feat` | Add, update, or remove feature flags |
| 🔍️ | `:mag:` | `chore` | Improve SEO |
| ⚗️ | `:alembic:` | `chore` | Perform experiments |
| 📸 | `:camera_flash:` | `test` | Add or update snapshots |
| 🧵 | `:thread:` | `feat` | Add or update code related to multithreading |
| 💸 | `:money_with_wings:` | `feat` | Add sponsorships or money related infrastructure |
| 🦖 | `:t-rex:` | `refactor` | Code that adds backwards compatibility |
| ✈️ | `:airplane:` | `feat` | Improve offline support |
| 🤡 | `:clown_face:` | `test` | Mock things |
| 🥚 | `:egg:` | `chore` | Add or update an easter egg |
| 👥 | `:busts_in_silhouette:` | `chore` | Add or update contributor(s) |

### Règles
- L'**emoji** est obligatoire et doit correspondre au type de modification
- Le **scope** est obligatoire et doit être entre crochets, indiquant la partie du code affectée (ex: `[API]`, `[UI]`, `[Auth]`)
- La **description** doit être courte (50 caractères max), en minuscules, sans point final
- Le **body** est optionnel, séparé par une ligne vide, pour expliquer le "pourquoi"
- Utiliser `BREAKING CHANGE:` dans le footer si la modification est non rétrocompatible

### Exemples
```
✨ [Home] add new account number display
🐛 [API] handle null response on user fetch
♻️ [Service] extract payment logic into PaymentService
🔧 [Deps] update symfony to 6.4.1
✅ [Auth] add unit tests for JWT expiration
💥 [API] remove deprecated v1 endpoints

BREAKING CHANGE: v1 endpoints have been removed
```

<emoji> [<scope>] <short description>
```

</details>---

#### Bonnes pratiques

- ****Nommer ses variables clairement****<span style="white-space: pre-wrap;"> : Copilot s'appuie sur le contexte sémantique</span>
- ****Toujours relire le code généré****<span style="white-space: pre-wrap;"> : les suggestions sont un point de départ, pas une vérité</span>
- ****Ne jamais écrire de secrets dans le code****<span style="white-space: pre-wrap;"> lors de l'utilisation de Copilot (clés API, mots de passe…)</span>

---

<span style="white-space: pre-wrap;">Liens utiles : </span>[Documentation officielle](https://docs.github.com/fr/copilot)<span style="white-space: pre-wrap;"> | </span>[Plugin JetBrains](https://plugins.jetbrains.com/plugin/17718-github-copilot)

# Git town 🏙️

<p class="callout info"><span style="white-space: pre-wrap;">Git town est un outil pour simplifier l'utilisation de Git CLI, permettant de garder facilement toutes ses branches à jour, même lorsqu'on a une arborescence de branches complexe. </span></p>

#### Créer une branche

<span style="white-space: pre-wrap;">Le première commande a connaître est celle qui permet de créer une nouvelle branche : </span>****hack****

```
git town hack 'feature/my-feature'
```

<span style="white-space: pre-wrap;">Git town va d'abord fetch les derniers changements du repository, puis mettre à jour la branche main, avant de créer la branche de feature à partir de main. De cette façon, on est sûr d'avoir une branche de feature à jour avec la dernière version de main. </span>

#### Publier sa branche

<span style="white-space: pre-wrap;">Une fois que j'ai fini et commité le travail sur ma branche, je peux publier celle-ci et ouvrir une pull request grâce à une simple commande : </span>****propose****

```
git town propose
```

Avant de pousser la branche locale, git town va mettre à jour la branche parente locale (main par exemple) et rebase la branche de feature sur celle-ci. Ensuite, il push la branche et ouvre directement un onglet de navigateur sur la page de création d'une PR. Plus qu'à mettre à jour le titre/la description et valider !

#### Créer une branche enfant

<span style="white-space: pre-wrap;">En ma plaçant sur la branche dont je veux créer un enfant, je peux le faire simplement avec </span>****append****

```
git town append 'feature/children-feature'
```

<span style="white-space: pre-wrap;">Encore une fois, git town va mettre à jour toutes les branches parentes avant de créer la nouvelle. </span>

#### Mettre à jour sa branche

<span style="white-space: pre-wrap;">Si j'ai besoin de pull ou push des changements de ma branche, je peux le faire très simplement avec </span>****sync****

```
git town sync
```

<span style="white-space: pre-wrap;">Git town va mettre à jour </span>****toutes****<span style="white-space: pre-wrap;"> les branches parentes, puis la branche actuelle, puis pousser la branche locale. S'il y a des modifications non commitées, il effectue un stash avant toute chose, puis un pop en dernière étape, de façon à reprendre facilement de là où on en était. </span>

#### Afficher les branches locales

<span style="white-space: pre-wrap;">La commande </span>****branch****<span style="white-space: pre-wrap;"> permet de lister les branches locales et d'afficher ça de façon hiérarchique, ce qui peut être plutôt pratique : </span>[![image.png](https://ambroise.reconnect.fr/uploads/images/gallery/2026-03/scaled-1680-/lu6image.png)](https://ambroise.reconnect.fr/uploads/images/gallery/2026-03/lu6image.png)

#### Configurer les branches pérennes (perennial branches)

<span style="white-space: pre-wrap;">Par défaut, git town considère uniquement </span>`<span class="editor-theme-code">main</span>`<span style="white-space: pre-wrap;"> comme branche permanente. Si l'on souhaite ajouter la branche </span>`<span class="editor-theme-code">dev</span>`<span style="white-space: pre-wrap;"> comme branche permanente afin de pouvoir utiliser git town de la même façon, il faut l'indiquer explicitement pour que git town la traite comme une racine valide et ne tente pas de la rebase sur </span>`<span class="editor-theme-code">main</span>`<span style="white-space: pre-wrap;"> :</span>

```
git town config perennial-branches dev
```

<span style="white-space: pre-wrap;">Cette commande est à exécuter une fois par repo. Après ça, git town sait que </span>`<span class="editor-theme-code">dev</span>`<span style="white-space: pre-wrap;"> est une branche permanente, et </span>`<span class="editor-theme-code">sync</span>`<span style="white-space: pre-wrap;"> la mettra à jour sans chercher à la rattacher à une branche parente.</span>

#### Changer la branche parente (set-parent)

<span style="white-space: pre-wrap;">Il peut arriver qu'une branche ait été créée depuis </span>`<span class="editor-theme-code">main</span>`<span style="white-space: pre-wrap;"> mais qu'on veuille finalement la rattacher à </span>`<span class="editor-theme-code">dev</span>`<span style="white-space: pre-wrap;"> , ou simplement que l'on ait créé une branche de façon classique et que l'on souhaite la rattacher pour pouvoir </span>`<span class="editor-theme-code">sync</span>`<span style="white-space: pre-wrap;"> ensuite. Dans ce cas :</span>

```
git town set-parent dev
```

<span style="white-space: pre-wrap;">Git town va alors considérer </span>`<span class="editor-theme-code">dev</span>`<span style="white-space: pre-wrap;"> comme branche parente, ce qui a deux effets concrets : </span>`<span class="editor-theme-code">sync</span>`<span style="white-space: pre-wrap;"> mettra d'abord </span>`<span class="editor-theme-code">dev</span>`<span style="white-space: pre-wrap;"> à jour avant de mettre à jour la branche courante, et </span>`<span class="editor-theme-code">propose</span>`<span style="white-space: pre-wrap;"> ouvrira la PR vers </span>`<span class="editor-theme-code">dev</span>`<span style="white-space: pre-wrap;"> plutôt que vers </span>`<span class="editor-theme-code">main</span>`.

#### Autre informations

<span style="white-space: pre-wrap;">Il faut penser à configurer la stratégie désirée pour la mise à jour des branches (merge ou rebase). Il faudra indiquer quelle est la branche main sur le repo lors de la première utilisation. </span>

<span style="white-space: pre-wrap;">En cas de conflit lors d'une opération, git town s'interrompt. Il suffit alors de résoudre les conflits et de taper la commande </span>****git town continue****

<span style="white-space: pre-wrap;">Liens utiles : </span>[Documentation officielle](https://www.git-town.com/)<span style="white-space: pre-wrap;"> | </span>[Github](https://github.com/git-town/git-town)

# Bruno, le meilleur ami du dev

### <span style="white-space: pre-wrap;">Qu'est-ce que Bruno ? </span>

<span style="white-space: pre-wrap;">Bruno est un client api (comme Postman), léger, dispo sous la forme d'une application de bureau, qui permet de tester des API REST, GraphQL etc... </span>

### <span style="white-space: pre-wrap;">Pourquoi on préfère utiliser Bruno que Postman ? </span>

<span style="white-space: pre-wrap;">Plusieurs avantages : </span>

- Pas besoin de compte, disponible offline
- Moins de fonctionnalités que Postman, on garde juste l'essentiel (Mais du coup ne propose pas toutes les fonctionnalités de Postman)
- Tout ce qu'on ajoute dans Bruno est inscrit dans des fichiers que l'on peut facilement versionner (et c'est là le gros point fort par rapport à Postman)

### A quoi ça sert dans nos projets ?

En gardant des collections d'API à jour sur le projet, ça créé une documentation technique ainsi que la possibilité de tester facilement les API cibles.

#### Ressources supplémentaires

<span style="white-space: pre-wrap;">Lien vers la documentation : </span>[<span style="white-space: pre-wrap;">https://docs.usebruno.com/ </span>](https://docs.usebruno.com/%20)

<span style="white-space: pre-wrap;">Bruno VS Postman : </span>[https://www.usebruno.com/compare/bruno-vs-postman](https://www.usebruno.com/compare/bruno-vs-postman)