.. _git: Git === Git est le logiciel de gestion de versions décentralisé le plus utilisé pour le développement informatique. Il permet de synchroniser les contenus d'une (ou plusieurs) machine locale et d'un dépôt distant. .. image:: ../_Commons/images/git-02.png :width: 75 % :align: center On peut en avoir une utilisation plus ou moins avancée : - un seul développeur : l'utilisation standard permet d'enregistrer les différentes versions d'un projet et de les synchroniser avec un dépôt distant (Git ESIEE, GitHub, BitBucket, ...) ; - plusieurs développeurs : maintient une version centralisée du projet et permet à plusieurs personnes de contribuer au développement, chacun ayant une version à jour du code sur sa machine locale. Installation ------------ Windows 10 .......... Git n'est pas installé par défaut. Il doit être installé depuis `cette page `_. .. image:: ../_Commons/images/git-03.png :width: 75 % :align: center Il est ensuite disponible dans un terminal Git Bash que l'on trouve dans le menu Démarrer:: $ git --version git version 2.38.1.windows.1 La version peut varier. Linux et MacOS .............. Git est installé par défaut et accessible directement dans le terminal standard :: $ git --version git version 2.38.0 La version peut varier. .. _creer-un-repertoire-local: Créer un répertoire local ------------------------- On crée un répertoire local destiné à héberger les fichiers du projet :: $ mkdir myproject Pour créer un contenu minimal, éditer un fichier :file:`README.md` avec uniquement le titre du projet. .. _creer-un-repo-distant: Créer un repo distant --------------------- Pour synchroniser son travail entre la machine locale et le repo distant, il faut disposer d'un compte sur une plateforme. Pour les élèves de l'ESIEE, un compte est déjà créé sur `https://git.esiee.fr `_. .. image:: ../_Commons/images/git-04.png :width: 75 % :align: center Il faut ensuite créer le repo distant proprement dit : #. New project #. Create blank project #. Project name : myproject #. Visibility level : Public #. **DON’T** Initialize repository with a README puis exécuter les instructions : - de la section "Git global setup" ; - et de la section "Push an existing folder" en utilisant le répertoire local créé à l'étape précédente. .. warning:: Sur une autre plateforme, `GitHub `_ par exemple, la procédure est similaire même si les termes peuvent varier. Maintenant on dispose d'un répertoire local synchronisé avec un repo distant. Recharger la page du projet sur la plateforme distante. Le fichier :file:`README.md` créé à l'étape précédente doit maintenant être présent. Forker un projet ---------------- Chaque utilisateur dispose de son propre espace distant. .. image:: ../_Commons/images/git-07.png :width: 75 % :align: center Un utilisateur peut héberger plusieurs repos dans son espace. .. image:: ../_Commons/images/git-08.png :width: 75 % :align: center Si un repo est public, on peut le copier dans son espace distant avec un *fork*. .. image:: ../_Commons/images/git-09.png :width: 75 % :align: center Ici, Lazare Garçin se rend sur la page public du repo ``myproject`` de Adam Labrosse, s'identifie, et *fork* le projet. Il dispose ensuite d'une copie exacte du projet dans son propre espace. Cloner un projet ---------------- Le *fork* est une copie d'un repo distant vers un espace distant. L'opération permettant de copier un repo distant sur une machine locale est un *clonage*. .. image:: ../_Commons/images/git-10.png :width: 75 % :align: center On peut cloner sur sa machine : - les repos dont on est propriétaire ; - les repos publics. Dans chaque cas, une procédure d'authentification est déclenchée. Il y a 2 alternatives. - l'authentification ``https`` ne nécessite aucune opération supplémentaire mais le login/password est demandée à chaque transaction:: $ git clone https://git.esiee.fr/labrossa/myproject.git - l'authentification ``ssh`` nécessite un paramétrage (`génération de clés SSH `_ et `ajout au compte Gitlab `_), mais elle est ensuite réalisée automatiquement par comparaison des clés locales et distantes:: $ git clone git@git.esiee.fr:labrossa/myproject.git .. _synchroniser-son-travail-avec-le-repo-distant: Synchroniser son travail avec le repo distant --------------------------------------------- Tout au long de la vie du projet, vous pouvez être amenés à utiliser plusieurs machines de développement (des machines différentes dans les salles de l’ESIEE, votre machine personnelle, etc...). Si vous maintenez la synchronisation entre repo distant et repo local, vous pourrez disposer à tout moment de la dernière version de votre travail. Vous pouvez utiliser :command:`git`, depuis le terminal ou depuis Visual Studio Code, pour maintenir la synchronisation entre votre répertoire local et votre repo distant. .. image:: ../_Commons/images/git-11.png :width: 75 % :align: center Avant une phase de développement, on récupére les modifications depuis le repo distant avec la commande:: $ git pull Lorsqu'une nouvelle fonctionnalité est implémentée : - on ajoute les fichiers du répertoire à l'index :: $ git add . - on enregistre les modifications dans le repo local avec un message explicatif:: $ git commit -m "ajout d'une interface graphique" - on pousse les modifications de la machine locale vers le repo distant :: $ git push origin master .. warning:: Ne pas oublier de pusher votre travail à chaque étape significative du projet. .. _travail-collaboratif: Travail collaboratif -------------------- Un projet informatique implique généralement plusieurs contributeurs et il est primordial de disposer d'une version à jour du travail effectué par chacun. Git est très efficace dans ce domaine. .. image:: ../_Commons/images/git-12.png :width: 75 % :align: center Un prérequis est que le propriétaire du repo distant (Adam Labrosse dans ce cas) invite l'autre développer en lui donnant les droits nécessaires (Developer). Sur la plateforme `https://git.esiee.fr `_:: Project Information > Members > Invite members 1. une version v1 du projet est développée par Adam Labrosse et incluse dans le repo local ; 2. le repo local est transféré vers le repo distant ; 3. Lazare Garçin n'a pas encore contribué au projet. Il récupère le travail de Adam Labrosse en *clonant* le projet ; 4. il produit une version v2 en apportant des modifications au projet ; 5. puis ajoute ses fichiers à l'index ; 6. les inclut dans le repo local ; 7. et transfère son repo local modifié vers le repo distant ; 8. Lazare Garçin récupère la dernière version du repo et dispose maintenant de la v2 sur sa machine. .. warning:: Sur une autre plateforme, `GitHub `_ par exemple, la procédure est similaire même si les termes peuvent varier. Utilisation plus avancée ------------------------ Git a été utilisé jusqu'à présent de façon basique avec en particulier une seule branche de développement. Pour un projet complexe, on peut mettre en oeuvre un développement sur plusieurs branches. .. image:: ../_Commons/images/git-06.png :width: 75 % :align: center Chaque disque représente un *commit* et chaque couleur, une branche différente, indépendante des autres, permettant de développer des fonctionnalités nouvelles sans impacter le projet qui reste toujours dans une version stable. On peut se familiariser avec la gestion des branches avec `Learn Git Branching `_. Ressources Git -------------- Git est un système de développement logiciel et de versioning puissant, mais sa maitrise avancée nécessite du temps d'apprentissage et de l'expérience. Ci dessous quelques ressources supplémentaires pour approfondir les choses : - `GIT Workflow - Georgia Tech - Software Development Process `_ - `Introduction à Git (IUT Lyon 1) `_ - `Gérez vos codes source avec Git (Open Classroom) `_ - `git - petit guide `_ - `Visualizing Git Concepts with D3 `_ - `A Visual Git Reference `_