1 / 24

Git pour les nouveaux : Domptez le dragon 🐉 sans brûler 🔥 le projet

Apprendre à collaborer sans stress

Git Collaboration

C’est quoi ce fameux Git ?

En simple

C’est votre machine à remonter le temps. Créé par Linus Torvalds en 2005 (merci Linus !), c’est l’outil indispensable pour ne plus avoir de fichiers index_final_v2_copie.html. Git Logo|100

Pourquoi on ne peut plus s’en passer

  • Équipe : On travaille tous ensemble sans s’écraser les pieds.
  • Sécurité : Si on casse tout, on peut revenir en arrière.
  • Liberté : On peut tester des trucs fous dans son coin (les branches !).

Un peu d’histoire (pour la culture)

  • Avant 2005 : C’était un peu la galère (CVS, SVN).
  • Le déclic : Le kernel Linux avait besoin d’un truc plus solide.
  • Aujourd’hui : C’est partout (GitHub, GitLab, Bitbucket).

Comprendre le “Graphe”

La structure de base

gitGraph
    commit id: "Initial"
    branch develop
    checkout develop
    commit id: "Feature A"
    commit id: "Feature B"
    checkout main
    merge develop
    commit id: "Merge feature"

Les mots qu’on utilise souvent

  • Commit : Une photo de votre code à un instant T.
  • Branche : Un univers parallèle pour développer une feature.
  • Merge : On rassemble les univers.

Le workflow quotidien

C’est simple, on suit ce cycle :

  1. Modified : On change le code.
  2. Staged (git add) : On prépare ce qu’on veut envoyer.
  3. Committed (git commit) : On valide dans notre historique local.
  4. Pushed (git push) : On partage avec les copains.

Mes commandes favorites

# Pour savoir où on en est (ma préférée)
git status

# Pour préparer le terrain
git add .

# Pour immortaliser le moment
git commit -m "feat: ajout d'une super fonction"

# Pour voir ce qu'on a fait
git log --oneline

Zen face aux conflits

Ça arrive même aux meilleurs (et surtout à moi après 15 ans).

<<<<<<< HEAD
Votre super code
=======
Le code du collègue (qui est pas mal aussi)
>>>>>>> branch-name

La recette : On respire, on choisit le meilleur des deux, on commit, et c’est fini !

Les bonnes manières

  • Commitez souvent : Des petits changements valent mieux qu’un énorme bloc.
  • Messages clairs : Vos collègues (et votre futur “vous”) vous remercieront.
  • Relisez-vous : Une petite vérification avant le push, ça ne mange pas de pain.

Les commandes de secours (quand ça part en vrille)

Reset - La machine à voyager dans le temps

Parfois, on fait des commits… disons, “pas top”. Reset est notre machine à remonter le temps.

Les 3 saveurs de reset

gitGraph
    commit id: "Commit A"
    commit id: "Commit B (pas top)"
    commit id: "Commit C (pire)"
    commit id: "Commit D (catastrophe)"

–soft : On annule le commit mais garde les changements dans la zone de staging

git reset --soft HEAD~1  # Revient d'un commit en douceur

–mixed (par défaut) : On annule le commit et les changements reviennent dans le working directory

git reset HEAD~1  # Revient d'un commit, changements disponibles

–hard : On annule TOUT, même les changements (attention, destructif !)

git reset --hard HEAD~1  # Revient d'un commit, tout disparait

Reset en pratique

gitGraph
    commit id: "Feature 1"
    commit id: "Bug introduit"
    commit id: "Feature 2"
    checkout main
    commit id: "Fix urgent"

Si on veut annuler le “Bug introduit” mais garder “Feature 2” :

git reset --hard HEAD~2  # On revient avant le bug
# Puis on refait proprement
git add .
git commit -m "Feature 2 (sans le bug)"

Revert - L’annulation propre

Quand on veut annuler un commit SANS toucher à l’historique (super pour les projets partagés).

Reset vs Revert

gitGraph
    commit id: "Commit A"
    commit id: "Commit B (à annuler)"
    commit id: "Commit C"

Reset : Réécrit l’historique (DANGEREUX en équipe) Revert : Crée un nouveau commit qui annule les changements

Revert en action

gitGraph
    commit id: "Commit A"
    commit id: "Commit B (à annuler)"
    commit id: "Commit C"
    commit id: "Revert de B"
git revert commitSHA  # Crée un commit qui annule les changements

Rebase - La magie du réaménagement

Rebase permet de réorganiser l’historique pour le rendre plus propre.

Rebase vs Merge

flowchart TD
    A[Initial] --> B[Feature 1]
    B --> C[Feature 2]
    A --> D[Fix urgent]
    D --> E[Merge feature]
    C --> E

Avec merge : On garde l’historique exact (avec commits de merge)

flowchart TD
    A[Initial] --> B[Feature 1]
    B --> C[Feature 2]
    A --> D[Fix urgent]
    D --> E[Rebase feature]
    C --> E
    E --> F[Merge feature]

Avec rebase : On déplace nos commits après le fix urgent (plus propre)

Rebase interactif - Le mode “je suis le chef”

git rebase -i HEAD~3  # 3 derniers commits

Les options magiques :

  • pick : Garde le commit tel quel
  • reword : Change juste le message
  • edit : Arrête sur ce commit pour le modifier
  • squash : Fusionne avec le commit précédent
  • drop : Supprime le commit

Rebase interactif en pratique

flowchart TD
    A[WIP: début] --> B[fix: typo]
    B --> C[WIP: suite]
    C --> D[feat: presque fini]
    D --> E[fix: autre typo]

Après rebase interactif (squash + reword) :

flowchart TD
    A[feat: fonctionnalité complète]
# On édite dans l'éditeur qui s'ouvre :
pick 1234abcd WIP: début
squash 5678efgh fix: typo
squash 9012ijkl WIP: suite
squash 3456mnop feat: presque fini
squash 7890qrst fix: autre typo

# Devient :
pick 1234abcd feat: fonctionnalité complète

Les règles d’or du rebase

À FAIRE

  • ✅ Rebase ses branches personnelles
  • ✅ Avant de merge dans main
  • ✅ Pour nettoyer son historique

À NE SURTOUT PAS FAIRE

  • ❌ Rebase une branche déjà partagée
  • ❌ Rebase main/master directement
  • ❌ Rebase pendant qu’une autre personne travaille sur la même branche

Pourquoi ? Parce que rebase réécrit l’historique. Si quelqu’un a déjà tiré vos commits, ça va être le chaos !

Schéma récapitulatif

flowchart TD
    A[Problème à résoudre] --> B{Est-ce partagé ?}
    B -->|Non| C[Rebase possible]
    B -->|Oui| D[Revert obligatoire]
    C --> E{Type de correction ?}
    E -->|Annuler tout| F[git reset --hard]
    E -->|Garder changements| G[git reset --soft]
    E -->|Nettoyer historique| H[git rebase -i]
    D --> I[git revert commitSHA]
    F --> J[Historique réécrit]
    G --> K[Changements dans staging]
    H --> L[Historique propre]
    I --> M[Nouveau commit d'annulation]

Allez, à vous de jouer

N’ayez pas peur de casser des trucs sur des projets de test. C’est comme ça qu’on apprend. Et rappelez-vous : on est tous passés par là !

Bon code à tous ! 🚀