# Introduction à Git & Github > Git est un système de contrôle de version qui permet de suivre les modifications de votre code. Github est une plateforme qui permet d'héberger votre code et de collaborer avec d'autres. Publié le 2022-09-05 | Mis à jour le 2025-03-23 | Tags: git, github https://xsec.fr/gnu-linux/git-github/ --- import Callout from '@shared/components/Callout.astro' import { Tabs, Tab } from '@/components/ui/tabs' import { Steps, Step } from '@/components/ui/steps' Cet outil possède trois fonctions principales : - Revenir à une version antérieure de votre code en cas de problèmes - Suivre l'évolution de votre code étape par étape - Travailler en collaboration sans risquer la suppression des modifications d'autres contributeurs Il existe plusieurs alternatives à Github, la plus connue étant **Gitlab** qui est un **fork de Github** qui ajoute des améliorations et offre la possibilité d'**auto-hébergement**. Le fonctionnement reste similaire. ## Comment ça fonctionne Git fonctionne de manière similaire à une sauvegarde incrémentale, où un ensemble de dossiers/fichiers seront ajoutés au projet. Par la suite, un historique complet des modifications du projet sera disponible - ces modifications peuvent être ignorées, ajoutées, supprimées ou fusionnées. Git offre un système de branches, ce qui permet par exemple, de développer du contenu sur la branche principale sans l'altérer. C'est parce que Git aura préalablement fait une sorte de clone secondaire de la branche (en utilisant la commande `git checkout -b mabranche`). ![Ce diagramme illustre les 3 étapes de fonctionnement de Git (source Openclassrooms)](https://user.oc-static.com/upload/2021/10/05/16334576106761_image27.png) - **Le répertoire de travail (Working directory)** correspond au dossier du projet sur la machine. - **Le Stage ou Index** est l'étape intermédiaire représentant tous les fichiers modifiés qui ont été **"staged"**. Voir [comment ajouter des dossiers et fichiers au dépôt](#ajout-de-dossiersfichiers-au-dépôt). - **Le dépôt (repository)** est l'ensemble du projet avec ses commits. ## Dépôt local - Un dépôt est l'ensemble des dossiers/fichiers qui constituent un projet initié par Git. - Dans la documentation en ligne ou en milieu professionnel, on parle souvent de repositories. - Le dépôt local est stocké directement sur la machine. ## Dépôt distant - Le dépôt distant est hébergé sur un serveur distant ## Initialiser un dépôt Se rendre dans le répertoire souhaité, par exemple : `cd ~/monprojet` ```sh title="git init" {11} tip: Using 'master' as the name of the initial branch. This default branch name tip: is subject to change. To configure the initial branch name for all new tip: repositories, and suppress this warning, run: tip: tip: git config --global init.defaultBranch tip: tip: Names commonly chosen instead of 'master' are 'main', 'trunk' and tip: 'development'. The newly created branch can be renamed with: tip: tip: git branch -m Empty Git repository initialized in /home/contact/contactit.fr/.git/ ``` ```sh title="git clone https://github.com/username/project/myproject.git" Cloning into 'myproject.git'... remote: Enumerating objects: 11779, done. remote: Counting objects: 100% (82/82), done. remote: Compressing objects: 100% (66/66), done. remote: Total 11779 (delta 52), reused 33 (delta 16), pack-reused 11697 Receiving objects: 100% (11779/11779), 23.50 MiB | 11.34 MiB/s, done. Resolving deltas: 100% (7047/7047), done. ``` La commande `git clone` va directement **importer le projet** et ses fichiers sources dans un dossier portant son nom. - Il peut être nécessaire de mettre à jour le dépôt suite à un changement effectué par un autre contributeur du projet, utilisez la commande : ```sh git pull origin mabranche ``` **"Pull"** et **"fetch"** permettent de requêter un dépôt ### Vérification ```sh title="ls -la" total 12 drwxr-xr-x 3 contact contact 4096 Sept. 5 15:26 . drwxr-x--- 14 contact contact 4096 Sept. 5 15:23 .. drwxrwxr-x 7 contact contact 4096 Sept. 5 15:26 .git ``` Le dépôt `.git` est présent dans le répertoire sous forme de dossier caché. ## Ajout de dossiers/fichiers au dépôt : La commande `git add` permet d'indexer des fichiers à Git. - Une fois les dossiers/fichiers indexés, il est possible d'effectuer un commit après avoir modifié un élément. Quelques exemples : - `git add README` ajoute le fichier `README` - `git add .` ajoute tous les dossiers et fichiers du répertoire où `.git` est situé. ## .gitignore - `.gitignore` est un fichier qui **liste les dossiers/fichiers ignorés par Git.** - Il suit une syntaxe définie. Quelques exemples : - `*.log` ignore tous les fichiers avec l'extension `.log` - `/dossier` ignore le dossier de manière récursive. Plus d'informations sont disponibles [ici](https://www.atlassian.com/git/tutorials/saving-changes/gitignore) `git status` permet de voir **les modifications** des dossiers/fichiers par rapport à la dernière version sauvegardée (**commit**). ## Commits Un "**commit**" est **une version des dossiers/fichiers précédemment indexés**, qui est différente de la version suivante. - La commande `git commit` permet de valider les modifications apportées aux fichiers indexés ou "staged" par Git. Ces modifications sont appliquées depuis le "répertoire de travail" et ne sont plus dans le "Stage", elles sont déplacées vers le "dépôt". Il est recommandé de nommer les commits avec un nom différent pour chaque étape de modification. `git commit -m etape1` permet de nommer (indiquer de manière concise le contenu du commit, max. 60 caractères). `git commit --amend -m "etape2"` permet de changer le nom d'un commit existant ! ## Installation de Git ```sh title="sudo apt install git" [sudo] Password for contact: Reading package lists... Done Building dependency tree... Done Reading state information... Done git is already the newest version (1:2.34.1-1ubuntu1.4). git set as "manually installed" 0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded. 1 partially installed or removed. After this operation, 0 B of additional disk space will be used. Do you want to continue? [Y/n] ``` - Validez l'installation : `Y` ou ajoutez l'option `-y` à la fin de la commande. ## Identité L'identité dans Git est simplement votre nom et votre adresse e-mail. Ces deux informations sont nécessaires pour la validation par Git : - ``` git config --global user.name "John Doe" ``` - ``` git config --global user.email contact@contactit.fr ``` Grâce à l'option `--global`, vous n'aurez besoin de le faire qu'une seule fois. Si vous souhaitez changer votre nom d'utilisateur pour un projet spécifique, vous devrez repasser cette ligne sans l'option `--global`. - Pour vérifier que vos paramètres ont été pris en compte, il suffit de passer la commande : `git config --list` Il est recommandé d'activer les couleurs pour une meilleure visibilité : ```sh git config --global color.diff auto git config --global color.status auto git config --global color.branch auto ``` ## Pousser le dépôt ```sh git remote add origin https://github.com/username/project/myproject.git ``` `git remote add nom https://github.com/username/project/myproject.git` permet de **raccourcir** le nom (**url > "nom"**) pour appeler le dépôt ultérieurement. ```sh git branch -M mabranche ``` ```sh git push -u origin mabranche ``` ## Branches - Une branche est une copie du projet à un instant `T` donné, toutes les modifications qui lui sont apportées n'affecteront que celle-ci. Cela permet d'avoir **plusieurs états du projet en même temps.** - La branche principale est la branche `main` (anciennement appelée `master` avant octobre 2020). Cette branche est souvent la branche de **production**, donc stable, du projet. - Il peut y avoir d'autres noms de branches comme : `dev` ou `staging`, ce sont des branches de développement non stables, des tests et vérifications seront effectués sur elles une fois le développement terminé. - Si le résultat est concluant, il peut être possible de fusionner ces branches vers la branche `main` ou `master`. Les branches sont souvent utilisées pour recréer un environnement de **test** / **pré-production et production**. ![Illustration des branches d'un dépôt Git](https://miro.medium.com/max/700/1*iXXW9M7NJ-2FzP5waw0z7A.gif) Git peut être comparé à un arbre : - Le tronc de l'arbre est la branche principale du projet (la plupart du temps : **main** ou **master**) - Les branches sont des éléments qui proviennent du tronc mais partent dans différentes directions - Les feuilles sont les unes au-dessus des autres, plus ou moins nombreuses et tombent ou restent sur les branches comme des **commits**. - Conclusion : en hiver il y a plus de commits - La commande `git branch` permet de lister les branches du dépôt : ```sh title="git branch" {2} list * master ``` - Ici il y a deux branches : **list** et **master** maintenant **main**. Le `*` indique que je suis actuellement dans la branche master. L'option `-d` supprime une branche (`git branch -d mabranche`) L'option `-b` crée une nouvelle branche (`git checkout -b mabranche`) - La commande `git checkout mabranche` permet de changer de branche : ```sh title="git checkout mabranche" Switched to branch 'mabranche' ``` - Il est possible de créer une branche depuis un commit avec l'une des commandes suivantes : ```sh git checkout -b manouvellebranche ``` Notez que `git checkout ` permet également de revenir à un commit. - Pour obtenir le `sha` (hash) du commit, on peut utiliser la commande : ```sh title="git log --oneline --graph" * 5aaf865 Deletion of README * 6746dbc Adding test text * 931dc0f Creation of README ``` Le `sha` est constitué des caractères hexadécimaux après le **"*"** **931dc0f**, par exemple. ## Git stash - La commande `git stash` permet de mettre un commit de côté pour que la branche actuelle devienne propre, donc sans données dans la zone de stage. Cette situation est adaptée lorsqu'un commit n'a pas été effectué et que les modifications sont toujours dans le stage. - En pratique, la commande `git status` retourne qu'il y a plusieurs modifications (dans la zone de stage) qui n'ont pas été commitées. - `Stash` permet de les mettre de côté, pour pouvoir les insérer dans une autre branche, ce qui peut être utile lorsque vous vous êtes trompé de branche ! - Après avoir exécuté la commande `git stash` si vous relancez la commande `git status`, elle retourne que le répertoire de travail est propre (stage vide). - Maintenant je peux aller vers une nouvelle branche ou une existante avant d'insérer les modifications effectuées : ```sh git branch manouvellebranche ``` ```sh git checkout manouvellebranche ``` ```sh title="git branch" * manouvellebranche master ``` ```sh git stash apply ``` ## Git reset - **Git reset** permet d'annuler des modifications de trois manières différentes : `soft`, `mixed` et `hard` ![Illustration des 3 types de Git reset (source Openclassrooms)](/media/linux/git-github/gitreset.webp) ### Supprimer le dernier commit - D'abord, regardez les logs et donc le dernier commit effectué et son identifiant : ```sh title="git log --format=fuller -1" {1} ca83a6dff817ec66f443420071545390a954664949 Author: contact Date: Mon Mar 19 21:52:11 2022 -0700 ``` - Notez l'identifiant : `ca83a6dff817ec66f443420071545390a954664949` si vous devez l'assigner à une autre branche après l'avoir supprimé. - Maintenant je peux supprimer le dernier commit avec la commande : ```sh git reset --hard HEAD^ ``` ## Authentification Github Github repose sur l'authentification avec SSH, donc une paire de clés. ```sh title="ssh-keygen -t ed25519" Generating public/private ed25519 key pair. Enter file in which to save the key (/home/contact/.ssh/id_ed25519): Created directory '/home/contact/.ssh'. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/contact/.ssh/id_ed25519 Your public key has been saved in /home/contact/.ssh/id_ed25519.pub The key fingerprint is: SHA256:myhash contact@mydomain The key's randomart image is: +--[ED25519 256]--+ |%@+. | |EBCVB. | |+=Bo. | |+.o* . | |oo..o . S S | |=+oo o | |B++ o . . | |+=.. o . | |o. . . | +----[SHA256]-----+ ``` `ed25519` est le **standard recommandé actuel en termes de sécurité**, **RSA** est compatible avec plus de systèmes (mais **moins sécurisé** (-4096 minimum)). ```sh title="cat ~/.ssh/id_ed25519.pub" ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAKC91uWop9DhfNh23i6u0yUlhEkGv0IOQKzhU5ltKBkAG contact@contactit.fr ``` Allez dans `Settings > SSH and GPG keys`, dans la section **title** mettez un nom quelconque et dans la section **key** collez votre clé publique, puis **validez** avec `Add SSH key`. ## Résumé de Git/Github ![(Source Openclassrooms](/media/linux/git-github/summary.webp)