{"id":24054304,"url":"https://github.com/eric-gilles/tutogit","last_synced_at":"2025-02-26T10:25:20.212Z","repository":{"id":271498880,"uuid":"913658617","full_name":"eric-gilles/TutoGit","owner":"eric-gilles","description":"This project, Tuto GIT, is a comprehensive guide to using Git and GitHub/GitLab  Topics","archived":false,"fork":false,"pushed_at":"2025-01-28T09:58:15.000Z","size":808,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-01-28T10:32:50.392Z","etag":null,"topics":["git","github","gitlab"],"latest_commit_sha":null,"homepage":"","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/eric-gilles.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2025-01-08T05:35:25.000Z","updated_at":"2025-01-28T09:58:18.000Z","dependencies_parsed_at":"2025-01-08T06:28:03.938Z","dependency_job_id":"a42c7884-b708-4991-9eb7-7ce41e3d61bc","html_url":"https://github.com/eric-gilles/TutoGit","commit_stats":null,"previous_names":["eric-gilles/tutogit"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eric-gilles%2FTutoGit","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eric-gilles%2FTutoGit/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eric-gilles%2FTutoGit/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eric-gilles%2FTutoGit/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/eric-gilles","download_url":"https://codeload.github.com/eric-gilles/TutoGit/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":240833216,"owners_count":19865083,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["git","github","gitlab"],"created_at":"2025-01-09T03:03:19.398Z","updated_at":"2025-02-26T10:25:20.190Z","avatar_url":"https://github.com/eric-gilles.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"# Tuto GIT\n\n## Introduction\nBienvenue dans ce guide complet sur Git et GitHub. Ce tutoriel vous expliquera les bases de Git, comment résoudre les conflits, configurer votre environnement et bien plus encore.\n\nVoir toutes les commandes GIT de base : [ici](https://github.com/eric-gilles/tutoGit/blob/main/ressources/git-cheat-sheet-education.pdf)\n\n# Sommaire\n\n1. [Introduction](#introduction)\n2. [Découverte de Git et premiers codes versionnés](#découverte-de-git-et-premiers-codes-versionnés)\n3. [Création d'un compte GitLab/GitHub](#création-dun-compte-gitlabgithub)\n4. [SSH](#ssh)\n5. [Commandes](#commandes)\n6. [Utilitaires Git](#utilitaires-git) dont [GitHub Desktop](#github-desktop)\n7. [Prise en main de Git](#prise-en-main-de-git) dont [Configuration locale de Git](#configuration-locale-de-git)\n8. [Git Add, Git Status et Git Commit](#git-add-git-status-et-git-commit) dont [Conventions de commit](#conventions-de-commit) et [Résumé des commandes](#résumé-des-commandes)\n9. [.Gitignore ignorer les fichiers inintéressants](#gitignore-ignorer-les-fichiers-inintéressants) dont [Génération de fichier `.gitignore`](#génération-de-fichier-gitignore)\n10. [Git Pull récupérer les modifications distantes](#git-pull-récupérer-les-modifications-distantes)\n11. [Git Log : Affichage du journal des enregistrements (`commit`)](#git-log--affichage-du-journal-des-enregistrements-commit)\n12. [Résolution des conflits](#résolution-des-conflits)\n13. [Sub Module Git](#sub-module-git)\n14. [Cosmétique (optionnel)](#un-peu-plus-de-cosmétique-optionnel)\n15. [Aller plus loin avec Git](#aller-plus-loin-avec-git)\n16. [Auteur et Remerciements](#auteur)\n\n\n## Découverte de Git et premiers codes versionnés\n\nL'objectif de ce tutoriel est de vous familiariser avec des outils qui vous aideront à vous organiser dans votre travail de programmation.  \nLe but d'un [gestionnaire de version](https://fr.wikipedia.org/wiki/Gestion_de_versions) est de vous permettre de conserver l'historique de vos réalisations, de revenir à une étape en arrière de votre historique et de collaborer avec d'autres utilisateurs.  \nOn dit qu'un code est _versionné_ s'il y a une trace de son historique que l'on peut facilement retrouver et partager avec quelqu'un d'autre.\n\n### Introduction à Git et préparation de l'environnement\n\nLe gestionnaire de version que vous allez utiliser ici sera [Git](https://fr.wikipedia.org/wiki/Git).  \nIl s'installe localement sur la machine sur laquelle vous travaillez.  \nEnsuite pour diffuser votre travail et permettre à tous vos postes de travail de partager le même projet, vous devrez utiliser une **plateforme collaborative**.  \n[GitLab](https://gitlab.com) ou [GitHub](https://github.com/login) sont des exemples de telles plateformes. Elles vous permettent de stocker votre projet sur un serveur distant et de le partager avec d'autres utilisateurs.\n\n## Création d'un compte GitLab/GitHub\nIl est nécessaire de réaliser la création de compte sur une plateforme collaborative pour pouvoir stocker vos projets. \n- [Créer un compte GitLab](https://gitlab.com/users/sign_in)\n- [Créer un compte GitHub](https://github.com/login)\n\nSans compte sur une de ces plateformes, vous ne pourrez pas utiliser Git de manière optimale, ainsi que les fonctionnalités de collaboration qu'elles offrent et la suite de ce tutoriel.\n\n## SSH \nAvant de commencer à créer des projets, il faudrait établir un canal sécurisé d'authentification entre votre machine et le serveur distant.  \nPour cela, ouvrez un terminal sur votre machine et générer une clé SSH avec `ssh-keygen` dans le dossier `.ssh/`  \nAppuyez sur `Entrée` à la demande `Enter the file` puis tapez 2 fois un mot de passe (passphrase)\n\n\u003cimg src=\"ressources/keygen.png\" width=\"75%\" style=\"margin:auto;display:block;\"/\u003e\n\n### Commandes :\n```sh\ncd ~/.ssh\nssh-keygen\n```\n\nEnsuite, copiez la clé SSH :\n```sh\ncat id_rsa.pub\n```\n\n\u003cimg src=\"ressources/less_key.png\" width=\"75%\" style=\"margin:auto;display:block;\"/\u003e\n\nPour GitLab, ouvrir le lien suivant : _[GitLab Lien SSH Key](https://gitlab.com/-/user_settings/ssh_keys)_ et cliquez sur le bouton \"Add new Key\", puis collez la clé que vous avez copiée précédemment dans le champ \"Key\" et donnez un nom à votre clé.\n\n\u003cimg src=\"ressources/add_key_GitLab.png\" width=\"75%\" style=\"margin:auto;display:block;\"/\u003e\u003cbr/\u003e\n\nPour GitHub, ouvrir le lien suivant : _[GitHub Lien SSH Key](https://github.com/settings/ssh/new)_ et donnez un titre à votre clé et collez la clé dans le champ \"Key\".\n\n\u003cimg src=\"ressources/add_key_GitHub.png\" width=\"75%\" style=\"margin:auto;display:block;\"/\u003e\u003cbr/\u003e\n\n**Remarque** : avant d'aller plus loin sachez que si vous voulez travailler depuis un autre ordinateur chez vous,\nvous devez faire au préalable la procédure d'échange de clé décrite ci-dessus.\n\n**Remarque :** Le mini-tutoriel qui suit est fait pour Linux. Il s'adapte facilement sur Mac OS.\nPour les utilisateurs de Windows il faudrait adapter les commandes Unix à celles de Windows ou installer un émulateur comme [Git for Windows](https://gitforwindows.org/) qui permet de simuler l'utilisation de Git comme si vous étiez sous Linux ou alors utilisez [GitHub Desktop](https://desktop.github.com/).\n\n## Utilitaires Git\nIl existe plusieurs utilitaires pour Git qui facilitent l'utilisation de Git en offrant une interface graphique :\n- [GitKraken](https://www.gitkraken.com/)\n- [GitHub Desktop](https://desktop.github.com/)\n- [Sourcetree](https://www.sourcetreeapp.com/)\n- IDE : la plupart des IDE ([IntelliJ](https://www.jetbrains.com/fr-fr/idea/), [VSCode](https://code.visualstudio.com/), [Eclipse](https://www.eclipse.org/), etc) ont des plugins intégrés pour utilisés Git.  \n\nNous montrerons ici comment installer GitHub Desktop, mais vous pouvez choisir l'outil qui vous convient le mieux.\n### GitHub Desktop\nGitHub Desktop est une application qui vous permet de gérer vos dépôts GitHub directement depuis votre ordinateur. Vous pouvez cloner des dépôts, créer des branches, effectuer des commits, et bien plus encore.\n\n- Windows : [GitHub Desktop Windows](https://desktop.github.com/download/)\n- Mac : [GitHub Desktop Mac](https://desktop.github.com/download/)\n- Linux : [GitHub Desktop Linux](https://github.com/shiftkey/desktop/releases/download/release-3.4.8-linux1/GitHubDesktop-linux-amd64-3.4.8-linux1.deb) et lancez la commande `dpkg` pour installer l'application:\n    ```sh\n    sudo dpkg -i GitHubDesktop-linux-amd64-3.4.8-linux1.deb\n    ```\n    Ou alors avec `apt`:\n    ```sh\n    sudo apt install ./GitHubDesktop-linux-amd64-3.4.8-linux1.deb\n    ```\n- Après l'installation, lancez l'application et connectez-vous avec votre compte GitHub.\n\n## Prise en main de Git\n\nTout d'abord rappelez-vous que GitLab/GitHub est juste un **serveur d'hébergement** et Git est le **gestionnaire de versions** qui est utilisé au coeur de GitLab/GitHub.  \nVous utilisez Git localement sur votre machine. Et vous pouvez à tout moment décider de diffuser votre programme à travers le serveur d'hébergement.  \n\nLa première chose à faire c'est de créer un nouveau répertoire sur [GitLab](https://gitlab.com/projects/new#blank_project)/[GitHub](https://github.com/new), par exemple `MonProjet` (vous pouvez choisir un autre nom).  \nChoississez la visibilité de votre projet (public ou privé) et ajoutez un fichier `README.md` si vous voulez.  \nPuis cliquez sur le bouton `Create Project` sur Gitlab ou `Create repository` sur GitHub.\n\nMaintenant, téléchargez (ou clonez) une **copie** locale de votre projet depuis GitLab/GitHub sur votre machine et d'établir une connexion authentifiée entre cette copie locale et la copie sur le serveur GitLab/GitHub.  \nPour cela, ouvrez un terminal et tapez les commandes suivantes :\n```sh\ncd votre_répertoire_de_travail\ngit clone [adresse_du_projet]\n```\n\nLa commande `git clone` ne vous demandera pas le mot de passe que vous avez donné auparavant à `ssh-keygen`([voir SSH](#ssh)) , si `[adresse_du_projet]` est une adresse SSH.  \n\nSi vous avez choisi l'adresse HTTPS, Git vous demandera votre nom d'utilisateur et mot de passe.  \n\nAprès cela, un répertoire portant le même nom (`MonProjet`) sera téléchargé sur votre machine.\nCe répertoire est le _dépôt Git local_. La copie qui est sur GitLab/GitHub est appelée _dépôt distant_. Nous allons voir ce que dépôt local contient.\n\n```sh\ncd MonProjet\nls\ngit status\n```\nObservez la différence entre la commande `ls` et `git status`.  \nLa première est une commande Linux pour lister l'ensemble de fichiers dans votre répertoire, alors que la seconde montre l'état de \"sauvegarde\" de ces fichiers.  \nPour le moment, `git status` devra vous afficher le message \"_rien à valider, la copie de travail est propre_\" car vous n'avez pas encore effectué de modification de votre projet en local. Tapez les commandes suivantes pour voir la différence :\n\n```sh\ntouch toto.txt\ngit status\n```\nUn message comme ceci devrait apparaître (ce sera en français ou en anglais selon votre environnement) :\n\n\u003cimg src=\"ressources/PremierGitStatus.png\" width=\"75%\"  style=\"margin:auto;display:block;\"/\u003e\n\nIl indique que votre répertoire de travail contient un fichier **non versionné** (la couleur rouge et le terme \"not staged\" l'indiquent). C'est normal, vous venez juste de créer ce fichier. Avant d'apprendre à sauvegarder (**versionner**) les modifications, vous allez configurer localement vos paramètres Git.\n\n### Configuration locale de Git\n\nMaintenant que vous avez fait le tutoriel, vous pouvez correctement configurer **localement** Git sur votre machine.\n\nOuvrez le fichier `~/.gitconfig` avec votre éditeur favori (créez le fichier si nécessaire).  \nRenseignez votre nom, prénom et email dans la section `[user]`.\n```\n# Personnalisez les champs ci-dessous!\n[user]\nusername = nom_utilisateur_git\nname = Prenom Nom\nemail = adresseMail_git \n```\n\nVous pouvez aller voir les modifications introduites dans le fichier `~/.gitconfig`.\n\n\n## Git Add, Git Status et Git Commit\nFaisons quelques modifications sur le fichier `toto.txt`que vous avez créé. Ajoutez-y une ligne : \"Hello World !\"\nSouvenez-vous, que pour le moment Git ignore ce fichier car vous ne lui avez pas demandé de _suivre son historique_.\n\nD'abord, ajoutez ce fichier à l'index de suivi de votre historique :\n\n```sh\ngit add toto.txt\n```\nCette commande indique à Git que vous voudriez suivre les modifications du fichier `toto.txt`, mais que la sauvegarde aura lieu plus tard (entre temps vous pouvez faire d'autres `git add`) !\n\nEn tapant `git status` vous devriez obtenir quelque chose comme ceci :\n\n\u003cimg src=\"ressources/PremierAdd.png\" width=\"75%\" style=\"margin:auto;display:block;\"/\u003e\n\nMaintenant, on va sauvegarder les changements de votre projet que vous avez indexés (avec plusieurs `git add` auparavant) :\n\n```sh\ngit commit -m \"Création d'un fichier important pour mon travail\"\n```\n\n En tapant `git status` vous devriez obtenir quelque chose comme ceci :\n\n\u003cimg src=\"ressources/PremierCommit.png\" width=\"75%\" style=\"margin:auto;display:block;\"/\u003e\n\nLe message indiqué montre que tout a été sauvegardé correctement. Et que votre _version locale_ de projet est en avance par rapport à la version sur le serveur d'hébergement GitLab/GitHub. Vous pouvez maintenant diffuser ces changements locaux sur le dépôt distant :\n\n```sh\ngit push -u origin main\n```\n\n**Remarque** : ̀`git push` est un raccourci de la commande `git push origin master`. Le mot-clé `origin` indique le dépôt distant (celui sur le serveur GitLab/GitHub).\nPour le moment vous n'avez pas besoin de connaître le sens du mot-clé `master`, donc vous pouvez ignorer sa signification pour l'instant et attendre la fin de ce tutoriel.\n\nRetournez sur Gitlab/GitHub et voyez que votre projet contient maintenant `toto.txt`.\n\n\nSi `fichier1.txt` et `fichier2.txt` sont deux fichiers dont vous voulez sauvegarder les changements :\n\n```sh\ngit add fichier1.txt fichier.txt\ngit commit -m \"ajout de 2 fichiers\"\ngit push\n```\nSi vous voulez sauvegarder tous les fichiers modifiés ou ajoutés :\n\n```sh\ngit add .\ngit commit -m \"ajout de tous les fichiers\"\ngit push\n```\n\n**Remarques** : \n- `git add .` ajoute tous les fichiers modifiés ou ajoutés dans le répertoire courant et ses sous-répertoires.\n- Les fichiers ou dossiers inscrits dans un fichier `.gitignore` à la racine de votre projet ne seront pas pris en compte par la commande `git add .`(voir la section sur [Gitignore](#gitignore)).\n- Pour le message de votre commit, il est recommandé d'utiliser des messages conventionnel en suivant les [conventions de commit](https://www.conventionalcommits.org/en/v1.0.0/).\n\n### Conventions de commit\nUn message de commit conventionnel est structuré comme suit :\n```\n\u003ctype\u003e[optional scope]: \u003cdescription\u003e\n\n[optional body]\n\n[optional footer(s)]\n```  \nLégende :\n- type : type de commit (feat, fix, docs, style, refactor, perf, test, chore)  \n- scope : domaine du commit (facultatif)  \n- description : description du commit\n- body : description plus détaillée du commit (facultatif)\n- footer : informations supplémentaires (ex: références à des tickets, etc) (facultatif)\n\n\n#### Résumé des commandes :\n * `git add` prépare la future sauvegarde en suivant l'ensemble de modifications locales\n * `git commit -m \"message de sauvegarde\"` crée un nouveau point d'historique de votre programme en y enregistrant l'ensemble de modifications suivies. Le message obligatoire doit décrire cette sauvegarde\n * `git push` diffuse l'état local (après le dernier commit) de votre projet sur le dépôt distant\n\n## .Gitignore ignorer les fichiers inintéressants\n\nLa plupart du temps, lors qu'on développe il y a des fichiers qu'on souhaite **ignorer** en permanence dans les sauvegardes.  \nPar exemple, si vous programmez en Java les fichiers '.class' ne devraient pas être versionnés pour plusieurs raisons : ils n'apportent aucune utilité à être suivi car ce sont des fichiers compilés non-destinés à la modification par le programmeur, ils polluent inutilement le dépôt...\n\nLe fichier `.gitignore` est un fichier texte qui permet d'ignorer certains fichiers ou dossiers lors de l'ajout de fichiers à l'index.\nIl doit être placé à la racine du dépôt Git.  \nIl est très utile pour ne pas versionner des fichiers inutiles ou sensibles (logs, fichiers de configuration, fichiers temporaires, etc).\n\nDans ce fichier, vous pouvez ajouter tout ce que vous voulez ignorer dans vos commits. Par exemple le ['.gitignore'](.gitignore) du projet que vous êtes en train de lire, permet d'ignorer 3 extensions '.class', '.o', '.log'.\n\nFichier `.gitignore` de ce projet :\n```sh\n# Fichiers temporaires\n*~\n\n# Logs\n*.log\n\n# Fichiers de configuration\n*.conf\n\n# Fichiers de compilation\n*.o\n*.class\n```\n\nLorsque vous créez ou modifiez le fichier '.gitignore', pensez à le versionner car il fait partie du dépôt ! Donc pensez à utiliser les commandes suivantes :\n```sh\ngit add .gitignore\ngit commit -m \"\u003ctype\u003e: fichier .gitignore\"\ngit push\n```\ntype : add ou update\n\n### Génération de fichier `.gitignore`\n\nAfin de générer un fichier `.gitignore`, vous pouvez utiliser le site [gitignore.io](https://www.toptal.com/developers/gitignore) ou l'extension VSCode [gi](https://marketplace.visualstudio.com/items?itemName=rubbersheep.gi) via `Ctrl+P` dans VsCode puis entrez `ext install rubbersheep.gi`.\n\n\n## Git Pull récupérer les modifications distantes\nReclonons une copie de votre projet dans un autre répertoire et vérifions que l'on a bien récupéré le tout :\n\n```sh\ncd ..\nmkdir AutreRepertoire\ncd AutreRepertoire/\ngit clone adresse_du_projet\ncd MonProjet\nls\ngit status\n```\n\nModifiez le fichier `toto.txt` et \n\n```sh\ngit add toto.txt\ngit commit -m \"refactor: modification du fichier toto\"\ngit push\n```\n\nVotre dépôt distant est à jour mais la première copie locale du projet sur laquelle vous avez travaillé initialement est **en retard** dans l'historique. Donc il faut récupérer tous les nouveaux changements depuis le dépôt distant :\n\n```sh\ncd ~/MonProjet\ngit pull\n```\nVous devriez obtenir quelque chose comme ceci :\n\n\n\u003cimg src=\"ressources/PremierGitPull.png\" width=\"75%\" style=\"margin:auto;display:block;\"/\u003e\n\n## Git Log : Affichage du journal des enregistrements (`commit`)\n\nUne dernière commande utile est `git log` : elle affiche l'ensemble des enregistrements effectués (`commit`) avec leur message. Vous pouvez aussi retrouver toutes ces informations dans votre ges\n\n```sh\ngit log\ncommit 4d1861aeb356653643ee6f8bd32f76ccc331e93e (HEAD -\u003e main, origin/main)\nAuthor: Éric GILLES \u003ceric.gilles@etu.umontpellier.fr\u003e\nDate:   Wed Jan 8 05:04:33 2025 +0100\n\n    refactor: modification du fichier toto\n\ncommit a24cf021282dfc1d834082e21aaef3aa695c97a1\nAuthor: Éric GILLES \u003ceric.gilles@etu.umontpellier.fr\u003e\nDate:   Wed Jan 8 04:48:09 2025 +0100\n\n    ajout de 2 fichiers\n\ncommit 6a6087e69a1892f00396671eacedabe30a8889d8\nAuthor: Éric GILLES \u003ceric.gilles@etu.umontpellier.fr\u003e\nDate:   Wed Jan 8 04:05:18 2025 +0100\n\n    Création d'un fichier important pour mon travail\n```\n\nVous l'aurez compris, lorsque vous avez plusieurs dépôts locaux, sur des machines potentiellement différentes, vous pouvez très bien travailler sur une de ces copies locales, sauvegarder vos changements (`git add` + `git commit`), pousser le tout sur le dépôt distant (`git push`) et récupérer le tout (`git pull`) dans les autres dépôts locaux.\n\n## Résolution des conflits\nMais que se passe-t-il lorsque vous travaillez en parallèle sur deux dépôts locaux et que vous oubliez de les synchroniser correctement ? Simulons une telle situation :\n\n * faites une modification du fichier `toto.txt` en y ajoutant ou supprimant du texte dans le premier dépôt local\n * ensuite faites une sauvegarde des changements et diffusez sur le dépôt distant :\n\t```sh\n\tgit add .\n\tgit commit -m \"refactor: modification du fichier toto dans le 1er dépôt\"\n\tgit push\n\t```\n * maintenant, faites une modification différente du fichier `toto.txt` en y ajoutant ou supprimant du texte dans le deuxième dépôt local\n * faites une sauvegarde des changements :\n\t```sh\n\tgit add .\n\tgit commit -m \"refactor: modification du fichier toto dans le 2ème dépôt\"\n\t```\n * si vous essayez de pousser avec `git push` ce changement vous aurez un message indiquant un **conflit** car les nouveaux changements sur le dépôt distant n'ont pas été récupérés dans la deuxième copie locale; Git ne fera donc rien et attendra vos indications pour résoudre le problème\n\n\u003cimg src=\"ressources/PremierGitError.png\" width=\"75%\" style=\"margin:auto;display:block;\"/\u003e\n\n\nCe mécanisme de signalement de conflit est très pratique car vous n'êtes jamais à l'abri d'un oubli de synchroniser les dépôts. \n\nGit vous suggère d'intégrer d'abord les changements distants (avec `git pull`) avant de pousser à nouveau.\n\n\u003cimg src=\"ressources/PremierGitConflit.png\" width=\"75%\" style=\"margin:auto;display:block;\"/\u003e\n\nOn remarque ici, le message d'erreur 'fatal' indiquant un conflit de branches divergentes.  \n\nPour résoudre les conflits, Git propose plusieurs solutions :\n\n * si une fusion peut avoir lieu facilement (les changements qui sont en conflit ne portent pas sur les mêmes fichiers), il vous propose de fusionner le tout. Ici cela a échoué, voir le message précédent de `git pull`.\n * si le conflit porte sur le même fichier et vous voulez fusionner l'ensemble des changements, alors il faudrait l'indiquer explicitement à Git :\n     ```sh\n     git merge origin/main\n     ```\n   Avec la commande ci-dessus, Git va essayer d'intégrer l'ensemble des changements des deux historiques en un seul. Et plusieurs cas de figures sont à envisager :\n\n   1. Lorsque les deux historiques sont \"compatibles\", à savoir les changements du fichier `toto.txt` ne rentrent pas en conflit car ne porte pas sur les mêmes lignes du fichier, alors la fusion se fera sans aucune intervention de votre part. Vous pouvez vérifier le statut du dépôt, et vous devrez obtenir quelque chose comme ceci :\n\n       ```sh\n       git status\n       Sur la branche main\n       Votre branche est en avance par rapport à 'origin/main' avec 2 commits.\n       ```\n      Notez que le dernier commit correspond à la fusion des 2 versions qui étaient en conflit.\n\n   2. Si les deux historiques sont \"incompatibles\", alors le fichier `toto.txt` contiendra l'ensemble de modifications issues des deux dépôts (local et distant) et ce sera à vous de corriger le tout à la main : ouvrir le fichier `toto.txt` avec un éditeur de texte, regarder l'ensemble de conflits indiqués par des chevrons `\u003c\u003c\u003c\u003c\u003c` et remplacer les par la version qui vous convient. Une fois le conflit résolu, vous devrez sauvegarder la résolution et diffuser ces modifications :\n       ```sh\n       git add toto.txt\n       git commit -m \"résolution du conflit\"\n       git push\n       ```\n\n## Sub Module Git\nLes submodules dans Git permettent d'inclure un dépôt Git dans un autre dépôt. Cela permet de gérer des projets distincts qui sont liés tout en préservant leur indépendance. Par exemple, si vous voulez inclure une bibliothèque externe dans votre projet sans l'intégrer directement dans votre dépôt, vous pouvez utiliser un submodule.\n\nAjouter un submodule\n```sh\ngit submodule add [url_du_dépôt] [chemin/vers/le/dossier]\n```\nCela va cloner le dépôt externe à l'emplacement spécifié dans votre projet.\n\nInitialiser et mettre à jour les submodules\nAprès avoir cloné un projet avec des submodules, vous devez initialiser et mettre à jour ces submodules.\n\n```sh\ngit submodule init\ngit submodule update\n```\nRécupérer les dernières modifications d’un submodule\nPour récupérer les dernières modifications d’un submodule :\n\n```sh\ngit submodule update --remote\n```\nCommits avec des submodules\nQuand vous apportez des modifications dans un submodule, vous devez effectuer un commit dans le submodule, puis dans le dépôt principal.\n\nDans le submodule :\n\n```sh\ncd [chemin/du/submodule]\ngit commit -m \"Modifications dans le submodule\"\ngit push\n```\nDans le dépôt principal : Git conserve un pointeur vers la révision du submodule. Vous devez donc commettre la mise à jour du pointeur.\n\n```sh\ngit commit -m \"Mise à jour du submodule\"\ngit push\n```\nSupprimer un submodule\nPour supprimer un submodule :\n\n```sh\ngit submodule deinit [chemin/vers/le/dossier]\ngit rm [chemin/vers/le/dossier]\ngit commit -m \"Suppression du submodule\"\n```\nCommandes utiles\nVérifier l’état des submodules :\n```sh\ngit submodule status\n```\nMettre à jour tous les submodules :\n```sh\ngit submodule update --recursive --remote\n```\nLes submodules sont utiles pour gérer des dépendances externes sans dupliquer des données dans votre dépôt.\n\n## Un peu plus de cosmétique (optionnel)\nDans un terminal il n'y a pas d'information supplémentaire qui affiche si vous êtes dans un dépôt Git ou pas.\nPour faire plus joli, vous pouvez ajouter les lignes de commandes suivantes dans votre `~/.```shrc` pour afficher la branche courante:\n\n```sh\n    parse_git_branch() {\n         git branch 2\u003e /dev/null | sed -e '/^[^*]/d' -e 's/* \\(.*\\)/(\\1)/'\n    }\n    export PS1=\"\\u@\\h \\[\\e[32m\\]\\w\n    \\[\\e[91m\\]\\$(parse_git_branch)\\[\\e[00m\\]$ \"\n```\nplus d'infos [ici](https://medium.com/@thucnc/how-to-show-current-git-branch-with-colors-in-```sh-prompt-380d05a24745)\n\n## Aller plus loin avec Git\nPour le moment on vous a montré les fonctionnalités de base de Git qui devraient être suffisant. Sachez que la gestion de conflit a été survolé et plusieurs autres cas de conflits peuvent apparaître.\n\nAussi nous n'avons pas évoqué la notion de [**branche** Git](https://git-scm.com/book/fr/v1/Les-branches-avec-Git-Ce-qu-est-une-branche). En effet, il est possible dans le cadre du même projet d'avoir plusieurs branches de développement (une par grande fonctionnalité ou une par développeur). \n\nAu fur et à mesure les branches sont _fusionnées_ pour intégrer les fonctionnalités dans la branche principale : _main_.\nPour le moment vous n'avez utilisé que cette branche, mais vous êtes encouragé à vous documenter et à apprendre par vous-mêmes l'utilisation des branches avec Git.\n\nVous pouvez suivre un tuto plus complet sur les différents aspects de Git ici : https://fr.wikibooks.org/wiki/Git/Principes ou voir une liste des commandes GIT de base : [ici](https://github.com/eric-gilles/tutoGit/blob/main/ressources/git-cheat-sheet-education.pdf)\n\n## Auteur \nCe tutoriel a été écrit par [Eric Gilles](https://github.com/eric-gilles)\n\n\n## Remerciements\nCe tutoriel est basé sur le projet [tutoGit](https://gitlabinfo.iutmontp.univ-montp2.fr/valicov/tutoGit1ereAnnee) réalisé pour les étudiant de l'[IUT de Montpellier](https://iut-montpellier-sete.edu.umontpellier.fr/) du [département informatique](https://iut-montpellier-sete.edu.umontpellier.fr/formations-3/nos-formations/bachelor-universaire-de-technologie/b-u-t-informatique/).  \nLe projet [tutoGit](https://gitlabinfo.iutmontp.univ-montp2.fr/valicov/tutoGit1ereAnnee) a été réalisé par les enseignants/étudiants suivants :\n- [Petru Valicov](https://gitlabinfo.iutmontp.univ-montp2.fr/valicov)\n- [Gilles Trombettoni](https://gitlabinfo.iutmontp.univ-montp2.fr/trombettoni)\n- [Victor Poupet](https://gitlabinfo.iutmontp.univ-montp2.fr/poupet)\n- [Romain Lebreton](https://gitlabinfo.iutmontp.univ-montp2.fr/lebreton)\n- [la hoang](https://gitlabinfo.iutmontp.univ-montp2.fr/la)\n- [Gaelle Hisler](https://gitla[tutoGit](https://gitlabinfo.iutmontp.univ-montp2.fr/valicov/tutoGit1ereAnnee)binfo.iutmontp.univ-montp2.fr/hisler)\n\nUn remerciements pour leur travail.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feric-gilles%2Ftutogit","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Feric-gilles%2Ftutogit","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feric-gilles%2Ftutogit/lists"}