
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.
![]()
gitGraph
commit id: "Initial"
branch develop
checkout develop
commit id: "Feature A"
commit id: "Feature B"
checkout main
merge develop
commit id: "Merge feature"
C’est simple, on suit ce cycle :
git add) : On prépare ce qu’on veut envoyer.git commit) : On valide dans notre historique local.git push) : On partage avec les copains.# 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
Ç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 !
Parfois, on fait des commits… disons, “pas top”. Reset est notre machine à remonter le temps.
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
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)"
Quand on veut annuler un commit SANS toucher à l’historique (super pour les projets partagés).
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
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 permet de réorganiser l’historique pour le rendre plus propre.
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)
git rebase -i HEAD~3 # 3 derniers commits
Les options magiques :
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
Pourquoi ? Parce que rebase réécrit l’historique. Si quelqu’un a déjà tiré vos commits, ça va être le chaos !
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]
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 ! 🚀