2025-11-20
Pré-requis : notions de base sur le système de fichiers et l’utilisation d’un terminal.
Gérer un projet de programmation sans gestionnaire de versions peut entraîner plusieurs problèmes :
diff : Comparaison manuelle des différences entre deux fichiers/dossiers.Pour résoudre ces problèmes, nous allons introduire Git, un gestionnaire de versions distribué qui permet de :
Comment revenir à une version antérieure ?
Comment travailler à plusieurs sur un même projet ?
Comment gérer des fonctionnalités expérimentales ?
Avant Git : gestion manuelle des versions (copies, archives)
brew install git.sudo apt-get install git.git config --global user.name "Votre Nom"git config --global user.email "votre.email@example.com"Dépot (repository) : emplacement où Git stocke les fichiers et l’historique des versions.
Local vs. Distant :
git initExercice: Initialiser un dépôt local
Créez un répertoire de travail temporaire et initialisez-y un dépôt Git.
git add nom-du-fichier
git add . (git add --all)
git add -u
git status
Exercice: Créer un fichier README et le mettre en suivi
Créez un fichier README contenant un titre et vérifiez l’état du dépôt avant et après le stage.
Solution
On branch master
No commits yet
Untracked files:
(use "git add <file>..." to include in what will be committed)
README
nothing added to commit but untracked files present (use "git add" to track)
a1b2c3d4)git commit -m "Ajout de la fonctionnalité X"git tag nom-du-tag : créer un tag léger.git tag -a nom-du-tag -m "message" : créer un tag annoté avec un message.Ajoute validation du formulaire.type(scope): description (ex : feat(auth): ajouter gestion du token). Types courants : feat, fix, docs, chore, refactor, test.Fixes #42 ou See #123.Exercice: Valider les modifications avec un message de commit
Réalisez un commit décrivant brièvement la modification effectuée.
git logExercice: Créer un fichier .gitignore pour ignorer les fichiers temporaires
Créez un fichier temporaire et ajoutez une règle dans .gitignore pour l’exclure du suivi.
git diffdiff --git a/README b/README index fec5601..9aeec5f 100644 --- a/README +++ b/README @@ -1 +1,2 @@ # Hello +Bla bla
* 53d47cc - (0 seconds ago) refactor(README): update README content - John Doe (HEAD -> master) * 10af630 - (1 second ago) feat(.gitignore): add a .gitignore file to exclude temporary files - John Doe * 9a32adf - (3 seconds ago) feat(README): add basic documentation - John Doe
git branch nom-de-branchegit checkout nom-de-branche (historique, très répandue).
git checkout -b nom-de-branche (historique).git switch nom-de-branche (Git 2.23+) pour changer de branchegit switch -c nom-de-branche pour créer + basculer.git restore <fichier> pour restaurer un fichier depuis l’index ou depuis un commit.main (ou master).HEAD : pointeur vers la branche courante ou un commit spécifique (détaché).Exercice: Créer la branche feature/main et y basculer
Créez feature/main, ajoutez un fichier d’exemple et validez votre changement.
Solution
Switched to a new branch 'feature/app' [feature/app ba42833] feat: ajouter App.java 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 App.java * ba42833 (HEAD -> feature/app) feat: ajouter App.java * 53d47cc (master) refactor(README): update README content * 10af630 feat(.gitignore): add a .gitignore file to exclude temporary files * 9a32adf feat(README): add basic documentation
git merge nom-de-brancheExercice: Fusionner la branche feature/main dans main
Basculez sur la branche main et fusionnez la branche feature/app (créée précédemment) en conservant un commit de merge (--no-ff). Observez ensuite l’historique graphique pour vérifier que le merge a créé un commit dédié.
Solution
fatal: invalid reference: main Already up to date. * ba42833 (HEAD -> feature/app) feat: ajouter App.java * 53d47cc (master) refactor(README): update README content * 10af630 feat(.gitignore): add a .gitignore file to exclude temporary files * 9a32adf feat(README): add basic documentation
git status : Affiche les fichiers en conflit.git diff : Montre les différences entre les versions en conflit.<<<<<<<, =======, et >>>>>>>.git add.git commit.git clone URL-du-référentiel : cloner un dépôt distant.git push : envoyer les modifications locales vers le dépôt distant.git fetch : récupérer les modifications du dépôt distant sans les fusionner.
git pull : récupérer les modifications du dépôt distant et les fusionner avec le dépôt local. (équivalent de git fetch + git merge)git clone URL-du-référentielCloning into 'HelloGit'...
remote: Enumerating objects: 39, done.
remote: Counting objects: 2% (1/39)remote: Counting objects: 5% (2/39)remote: Counting objects: 7% (3/39)remote: Counting objects: 10% (4/39)remote: Counting objects: 12% (5/39)remote: Counting objects: 15% (6/39)remote: Counting objects: 17% (7/39)remote: Counting objects: 20% (8/39)remote: Counting objects: 23% (9/39)remote: Counting objects: 25% (10/39)remote: Counting objects: 28% (11/39)remote: Counting objects: 30% (12/39)remote: Counting objects: 33% (13/39)remote: Counting objects: 35% (14/39)remote: Counting objects: 38% (15/39)remote: Counting objects: 41% (16/39)remote: Counting objects: 43% (17/39)remote: Counting objects: 46% (18/39)remote: Counting objects: 48% (19/39)remote: Counting objects: 51% (20/39)remote: Counting objects: 53% (21/39)remote: Counting objects: 56% (22/39)remote: Counting objects: 58% (23/39)remote: Counting objects: 61% (24/39)remote: Counting objects: 64% (25/39)remote: Counting objects: 66% (26/39)remote: Counting objects: 69% (27/39)remote: Counting objects: 71% (28/39)remote: Counting objects: 74% (29/39)remote: Counting objects: 76% (30/39)remote: Counting objects: 79% (31/39)remote: Counting objects: 82% (32/39)remote: Counting objects: 84% (33/39)remote: Counting objects: 87% (34/39)remote: Counting objects: 89% (35/39)remote: Counting objects: 92% (36/39)remote: Counting objects: 94% (37/39)remote: Counting objects: 97% (38/39)remote: Counting objects: 100% (39/39)remote: Counting objects: 100% (39/39), done.
remote: Compressing objects: 4% (1/21)remote: Compressing objects: 9% (2/21)remote: Compressing objects: 14% (3/21)remote: Compressing objects: 19% (4/21)remote: Compressing objects: 23% (5/21)remote: Compressing objects: 28% (6/21)remote: Compressing objects: 33% (7/21)remote: Compressing objects: 38% (8/21)remote: Compressing objects: 42% (9/21)remote: Compressing objects: 47% (10/21)remote: Compressing objects: 52% (11/21)remote: Compressing objects: 57% (12/21)remote: Compressing objects: 61% (13/21)remote: Compressing objects: 66% (14/21)remote: Compressing objects: 71% (15/21)remote: Compressing objects: 76% (16/21)remote: Compressing objects: 80% (17/21)remote: Compressing objects: 85% (18/21)remote: Compressing objects: 90% (19/21)remote: Compressing objects: 95% (20/21)remote: Compressing objects: 100% (21/21)remote: Compressing objects: 100% (21/21), done.
Receiving objects: 2% (1/39)Receiving objects: 5% (2/39)Receiving objects: 7% (3/39)Receiving objects: 10% (4/39)Receiving objects: 12% (5/39)Receiving objects: 15% (6/39)Receiving objects: 17% (7/39)Receiving objects: 20% (8/39)Receiving objects: 23% (9/39)Receiving objects: 25% (10/39)remote: Total 39 (delta 3), reused 38 (delta 2), pack-reused 0 (from 0)
Receiving objects: 28% (11/39)Receiving objects: 30% (12/39)Receiving objects: 33% (13/39)Receiving objects: 35% (14/39)Receiving objects: 38% (15/39)Receiving objects: 41% (16/39)Receiving objects: 43% (17/39)Receiving objects: 46% (18/39)Receiving objects: 48% (19/39)Receiving objects: 51% (20/39)Receiving objects: 53% (21/39)Receiving objects: 56% (22/39)Receiving objects: 58% (23/39)Receiving objects: 61% (24/39)Receiving objects: 64% (25/39)Receiving objects: 66% (26/39)Receiving objects: 69% (27/39)Receiving objects: 71% (28/39)Receiving objects: 74% (29/39)Receiving objects: 76% (30/39)Receiving objects: 79% (31/39)Receiving objects: 82% (32/39)Receiving objects: 84% (33/39)Receiving objects: 87% (34/39)Receiving objects: 89% (35/39)Receiving objects: 92% (36/39)Receiving objects: 94% (37/39)Receiving objects: 97% (38/39)Receiving objects: 100% (39/39)Receiving objects: 100% (39/39), 11.18 KiB | 602.00 KiB/s, done.
Resolving deltas: 0% (0/3)Resolving deltas: 33% (1/3)Resolving deltas: 66% (2/3)Resolving deltas: 100% (3/3)Resolving deltas: 100% (3/3), done.
git pushgit pull
git pull --rebase
--rebase réécrit l’historique local — ne l’utilisez pas sur des branches déjà partagées publiquement.git remote add nom URLgit remote remove nomgit remote -vExercice: Pousser un dépôt local vers un dépôt distant (GitHub)
Configurez un remote origin vers un dépôt GitHub et poussez votre branche locale.
git stash : Met de côté les modifications non validées.git cherry-pick <commit> : Applique un commit spécifique d’une autre branche.git reset --hard <commit> : replace HEAD et copie de travail — les modifications non committées sont perdues.git clean -fd : supprime les fichiers non suivis (dossiers et fichiers) — utilisez git clean -n pour faire un essai.git init — initialiser un dépôt local.git clone <url> — cloner un dépôt distant (ex : git clone https://github.com/user/repo.git).git add -A — stage toutes les modifications (ajouts, modifications, suppressions).git add -p — sélectionner des morceaux (hunks) à stage.git commit -m "message" — créer un commit avec un message concis.git commit --amend — modifier le dernier commit (avant push).git status — état du working tree et de l’index.git restore <fichier> — annuler les modifications locales d’un fichier.git diff — différences non indexées.git diff --staged — différences index vs HEAD.git log --oneline --graph --decorate --all — vue compacte et visuelle de l’historique.lg pour une vue enrichie (expliqué plus haut).git branch — lister les branches locales.git switch -c <branche> — créer et basculer sur une branche (moderne; historique: git checkout -b).git switch <branche> — basculer sur une branche (moderne; historique: git checkout <branche>).git rev-parse --abbrev-ref HEAD — afficher le nom de la branche courante.git merge <branche> — fusionner une branche dans la courante.git merge --no-ff <branche> — garder un commit de merge explicite.git rebase <base> — réappliquer les commits sur une autre base.git rebase -i <base> — rebase interactif pour réorganiser/écrire l’historique local.git remote add origin <url> — ajouter un remote (rm pour supprimer).git fetch — récupérer les refs distantes sans fusionner.git pull --rebase — récupérer puis rebaser vos commits au-dessus des commits distants (préférer pour branches locales; attention).git push -u origin <branche> — pousser et définir l’upstream.git push --force-with-lease — forcer un push en sécurité relative (préférer à --force).git stash push -m "note" / git stash pop — mettre de côté et restaurer des modifications non validées.git restore --source=<commit> <fichier> — restaurer un fichier depuis un commit précis.git reset --soft|--mixed|--hard <commit> — déplacer HEAD (danger : --hard détruit les modifications non committées).git reflog — retrouver des références perdues après des opérations destructrices.git tag -a v1.0 -m "message" — créer une tag annotée.git cherry-pick <commit> — appliquer un commit spécifique sur la branche courante.git bisect start / git bisect good|bad — bisect pour trouver le commit fautif.E. Bruno - Introduction à GIT