# 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)