Git : branches et fusions
Une branche est une ligne de développement indépendante : elle permet de travailler sur une fonctionnalité sans toucher à main.
Créer et changer de branche
Section intitulée « Créer et changer de branche »git branch # liste les branches locales (* = courante)git branch -a # locales et distantesgit branch -vv # avec le dernier commit et la branche distante suiviegit switch -c fonction-recherche # crée la branche et s'y placegit switch main # change de branchegit switch - # retour à la branche précédentegit branch fonction-b # crée sans changergit branch -m ancien nouveau # renommegit switch est la commande moderne ; git checkout fait la même chose et reste disponible.
Travailler sur une branche
Section intitulée « Travailler sur une branche »git switch -c fonction-recherche# modifications…git add -pgit commit -m "feat(search): add search endpoint"git log --oneline --graph --allFusionner : git merge
Section intitulée « Fusionner : git merge »git switch maingit merge fonction-recherche # intègre la branche dans maingit merge --no-ff fonction-recherche # force un commit de fusion (garde la trace de la branche)git branch -d fonction-recherche # supprime la branche fusionnée| Type de fusion | Résultat |
|---|---|
| Fast-forward | main n’a pas avancé : Git déplace simplement le pointeur, historique linéaire |
| Commit de fusion | Les deux branches ont avancé : Git crée un commit à deux parents |
Résoudre un conflit
Section intitulée « Résoudre un conflit »Quand deux branches modifient les mêmes lignes, git merge s’arrête :
CONFLICT (content): Merge conflict in fichier.txtAutomatic merge failed; fix conflicts and then commit the result.Le fichier contient des marqueurs :
<<<<<<< HEADversion de la branche courante=======version de la branche fusionnée>>>>>>> fonction-recherchegit status # liste les fichiers en conflit# éditer le fichier : garder la bonne version, supprimer les marqueursgit add fichier.txt # marquer comme résolugit commit # termine la fusiongit merge --abort # ou annuler la fusion et revenir à l'état d'avantPour les cas complexes : git mergetool, ou git checkout --ours fichier / git checkout --theirs fichier pour choisir une version entière.
Rebaser : git rebase
Section intitulée « Rebaser : git rebase »rebase rejoue les commits d’une branche au-dessus d’une autre, pour un historique linéaire :
git switch fonction-recherchegit rebase main # rejoue les commits de la branche sur le dernier maingit rebase --continue # après résolution d'un conflitgit rebase --abort # annuleRebase interactif, pour réécrire les derniers commits (regrouper, renommer, supprimer) :
git rebase -i HEAD~3Reprendre un commit : cherry-pick
Section intitulée « Reprendre un commit : cherry-pick »git switch maingit cherry-pick a1b2c3d # copie ce commit sur la branche courantegit cherry-pick a1b2c3d..e4f5g6h # une série de commitsTags : marquer une version
Section intitulée « Tags : marquer une version »git tag # listegit tag v1.0.0 # tag légergit tag -a v1.0.0 -m "Version 1.0.0" # tag annoté (recommandé : date, auteur, message)git show v1.0.0git tag -d v1.0.0 # supprime localementgit switch --detach v1.0.0 # se place sur cette version (lecture)L’envoi des tags vers un serveur est décrit dans Dépôts distants.
Workflow par branches de fonctionnalité
Section intitulée « Workflow par branches de fonctionnalité »maincontient toujours du code qui fonctionne.- Chaque fonctionnalité ou correction est développée dans sa branche (
feat/…,fix/…). - La branche est poussée, relue (demande de fusion sur le serveur), puis fusionnée dans
main. - La branche est supprimée.
git switch main && git pullgit switch -c fix/erreur-connexion# … commits …git push -u origin fix/erreur-connexionComparer des branches
Section intitulée « Comparer des branches »git log main..fonction-recherche --oneline # commits présents sur la branche et pas sur maingit diff main...fonction-recherche # modifications apportées par la branchegit branch --merged # branches déjà fusionnées dans la branche courantegit branch --no-mergedPour aller plus loin
Section intitulée « Pour aller plus loin »- Manuel : Branches in a Nutshell
- Suite : Dépôts distants