.. _sec_Git: Git === `Git `_ est un logiciel de gestion de version. C'est un logiciel complexe imaginé pour permettre le développement de très gros logiciels (plusieurs millions de lignes de code) dans une communauté open source mondiale (des dizaines de milliers de contributeurs). Ce guide est une introduction permettant de faire ses tous premiers pas avec Git dans un environnement simple (en utilisant `Github `_, avec un seul utilisateur sur le projet et avec un client graphique intégré à Visual Studio). Introduction à Git ****************** Git gère des **dépôts** (**repository**) qui permettent de stocker des fichiers et l'historique de leurs changements. Git a un fonctionnement décentralisé: un même dépôt peut exister sur plusieurs machines différentes. Dans notre cas, nous auront un premier dépôt stocké sur un service en ligne **Github** et nous réaliserons un **clone** de ce dépôt sur notre machine locale: le dépôt se trouvant sur Github sera appelé **origin**. Un dépôt peut contenir plusieurs **branches** de travail, par exemple il peut y avoir une branche qui contient la version stable courante du logiciel et une branche qui contient la version en cours de développement. La branche principale est généralement appellée **main** (ou **master**). Dans notre cas, nous travaillerons toujours sur la branche principale. Chaque branche est composée d'une suite de **commits** qui représentent les modifications apportées aux fichiers de la branche (ajout/suppression/modification). Lorsque l'on travail sur un dépôt Git, il y a principalement 3 versions des données qui existent en parralèle: 1) les données stockées sur le dépôt d'origine (dans notre cas celui hébergé sur Github); 2) les données stockées sur le dépôt local (sur votre ordinateur) 3) l'état actuel des fichiers que l'on est en train de modifier (en partant d'une branche et d'un commit particulier, dans notre cas le dernier commit de la branche principale). Bien entendu, si vous travailler sur plusieurs ordinateurs différents (par exemple les ordinateurs des salles de TPs et votre ordinateur personnel chez vous), vous serez amené à cloner plusieurs fois le dépôt d'origine et les items 2 et 3 existeront sur autant d'ordinateurs différents. Contrairement aux sytèmes de disques réseaux comme Dropbox, il n'y a pas de synchronisation automatique entre ces différents points de stockage: c'est à vous de choisir lorsque vous voulez transvaser des informations d'un niveau à l'autre. .. warning:: Cela signifie que si vous oubliez de **pousser** vos modifications sur le dépôt d'origine sur Github à la fin d'une séance de travail, vous ne retrouvez pas votre travail sur Internet lors de votre prochaine séance de travail (par exemple pour continuer à travailler chez vous). Si vous perdez en plus votre dépôt local (en cas de changement de machine par exemple) : **votre travail sera définitivement perdu**. .. warning:: Git est un outil professionnel, certaines commandes peuvent entrainer des suppressions de fichiers ou de modifications qui seront définitives. Faites toujours bien attention à lire les messages d'avertissement avant d'exécuter une commande et dans le doute faites d'abord un test sur un dépôt jouet. Cloner un dépôt ^^^^^^^^^^^^^^^ Afin de récupérer un dépôt depuis Github, on réalise ce qu'on appelle un **clone**. Lors du lancement de Visual Studio, vous pouvez choisir l'option "Cloner un dépôt": .. image:: clone_repot1.png :align: center Il vous faut alors spécifier l'adresse ``https`` du dépôt à cloner dans le cadre 1 (quelque chose du genre ``https://github.com/monLogin/monProjet``) et l'emplacement où stocker le dépôt sur votre ordinateur local dans le cadre 2. .. image:: clone_repot2.png :align: center Commit ^^^^^^ Pour sauvegarder l'état actuel des fichiers dans le dépôt local, on fait un **commit**. Dans l'exemple ci-dessous, on peut voir les élements suivants: 1) On a ajouté un commentaire à la classe ``Game`` 2) L'onglet "Modifications Git" permet d'avoir une IHM pour réaliser les opérations courantes de Git 3) On y voit la liste des fichiers modifiés (ici le fichier ``Game.cs``) 4) On va indiquer que l'on veut ajouter tous les fichiers modifés dans le prochain commit avec le bouton "indexer" (on peut choisir chaque modification individuellement également) .. image:: commit1.png :align: center On voit alors que: 1) Les modifications sélectionnées passent maintenant dans la catégorie "Changements indéxés" 2) On doit écrire un message décrivant le contenu du commit, ici "Comment for class Game" 3) On créé finalement le commit en cliquant sur "Valider les changements indexés" .. image:: commit2.png :align: center Push ^^^^ Pour transmettre un ou plusieurs commit sur le dépôt d'origine, on réalise un **push**. Sur la copie d'écran ci-dessous, on voit qu'il y a 1 commit en attente d'être poussé sur le dépôt d'origine (cadre 1). On réalise cette opération en cliquant sur **push** (fléche vers le haut, cadre 2). .. image:: push1.png :align: center On peut vérifier sur Github que notre commit a bien été poussé sur le dépôt d'origine: .. image:: push2.png :align: center Pull ^^^^ L'opération inverse d'un push est un **pull** qui consiste à récupérer des commits depuis le dépôt d'origine. Pour faire cela on clique sur le boutton "Tirer" (flêche pleine vers le bas): .. image:: pull1.png :align: center En allant dans le menu "Git" puis "Voir l'historique de la branche", on peut vérifier que l'on retrouve bien tous nos commits : .. image:: pull2.png :align: center Mots de la fin ^^^^^^^^^^^^^^ Ces 4 opérations (clone, commit, push, pull) vous permettront d'utiliser git dans une configuration extrêmement basique (projet simple avec 1 seul utilisateur). Il vous reste donc de nombreuses choses à apprendre sur l'utilisation de Git comme par exemple le workflow classique de contribution dans un dépôt open-source (fork, clone, branch, commit, pull-request): voir par exemple ce `tutorial `_ sur Github. Dans cette introduction, nous avons utilisé l'interface Git intégrée à Visual Studio. Aujourd'hui toutes les IDE modernes offrent ce type d'outils mais vous pouvez également utiliser Git en ligne de commande ou avec des surcouches graphiques indépendantes comme `GitKraken `_ (multiplateforme, version pro gratuite pour les étudiants) ou `Tortoise Git `_ (Windows, intégration dans l'explorateur de fichiers).