Git

Tags :
  • COURS
  • git
  • informatique
Auteurs :
  • Loïck Goupil-Hallay

Liens utiles

gitGraph
  commit id: "ZERO-0"
  branch "hotfix"
  commit
  branch "develop"
  commit id: "bugfix"
  checkout hotfix
  cherry-pick id:"bugfix"
  checkout main
  merge hotfix

Git est un logiciel de gestion de versions décentralisé. C'est un logiciel libre créé par Linus Torvalds, le créateur de Linux. Il est utilisé pour le suivi des modifications apportées à un ensemble de fichiers. Il permet de travailler à plusieurs sur un même projet, de suivre l'évolution du code, de revenir en arrière, de gérer des branches, etc.

Vocabulaire

Code source

Edition du code

Enregistrement des modifications

Gestion des branches

Alias

Prise en main

Installation

Configuration

Configuration "profil"

Pour pouvoir effectuer des commits et des opérations Git, il est nécessaire de configurer son identité (nom et email).

Configuration "préférences"

Configuration "signature"

Afin de garantir de l'intégrité (et de l'auteur) des commits, il est possible de signer ses commits avec une clé GPG.

Cela permet notamment d'ajouter le badge "verified" lors de commits sur GitHub (il faut penser à ajouter la clé GPG sur GitHub). Verified GitHub Commit

Utilisation

Exemple



# Initialisation d'un repository
cd /chemin/vers/mon/projet
git init

# Création d'une branche pour travailler
git checkout -b ma-branche

# ... Travail sur des fichiers

# Ajout des fichiers modifiés
git add fichier1 fichier2

# Enregistrement des modifications
git commit -m "Ajout de fichier1 et fichier2"

# Définition du repository distant
git remote add origin 

# Envoi des modifications
git push -u origin ma-branche


Submodules

Un git submodule correspond à une inclusion d'un dépôt Git dans un autre dépôt Git. Cela permet d'inclure de manière transparente un projet externe dans un projet principal, tout en permettant de sélectionner une version spécifique du projet externe à inclure.

Exemple: Do-It

architecture-beta
    group doit(internet)[Do It]

    service cs(disk)[Cours] in doit
    service compliance(server)[Compliance Check] in doit
    service promo1(disk)[Promo 2022] in doit
    service promo2(disk)[Promo 2023] in doit
    service promo3(disk)[Promo 2024] in doit
    service promo4(disk)[Promo 2025] in doit

Commandes

Fichiers spécifiques

.gitignore

Le fichier .gitignore permet d'ignorer certains fichiers ou répertoires lors des opérations de suivi des modifications. Il est utile pour exclure des fichiers temporaires, des fichiers de configuration locaux, des fichiers de build, des fichiers sensibles, etc.

Pour créer un fichier .gitignore, il suffit de créer un fichier nommé .gitignore à la racine du repository et d'y ajouter les fichiers ou répertoires à ignorer, un par ligne. Les règles de syntaxe permettent d'utiliser des wildcards (*) pour spécifier des motifs de fichiers à ignorer.
Pour spécifier un directory entier, il suffit de mettre le nom du directory suivi d'un /.

Exemple de contenu d'un fichier .gitignore:



# Fichiers temporaires
*.tmp
*.log

# Répertoires de build
build/
dist/

# Fichiers de configuration locaux
.env
config.json

# Fichiers sensibles
passwords.txt

# Contenu spécifique à un éditeur
.vscode/
.idea/

# Node.js
node_modules/


.git/

Le répertoire .git/ est le répertoire caché qui contient l'ensemble des fichiers et répertoires nécessaires au fonctionnement de Git dans un repository. Il stocke les métadonnées, l'historique des commits, les branches, les tags, les configurations, les hooks, etc.

Il est généralement situé à la racine du repository et ne doit pas être modifié manuellement, sauf si vous savez ce que vous faites. Il est essentiel au fonctionnement de Git et permet de conserver l'historique des modifications et les informations nécessaires à la gestion de versions.

.gitconfig

Le fichier .gitconfig est un fichier de configuration global de Git qui stocke les paramètres de configuration spécifiques à l'utilisateur. Il est généralement situé dans le répertoire utilisateur (~/.gitconfig ou $HOME/.gitconfig) et peut contenir des configurations telles que le nom d'utilisateur, l'adresse e-mail, les alias de commandes, les couleurs de l'interface, etc.

.gitmodules

Le fichier .gitmodules est utilisé pour déclarer les submodules inclus dans un repository, en spécifiant le chemin du submodule, l'URL du dépôt externe, et d'autres informations spécifiques. Il est généré automatiquement lors de l'ajout d'un submodule et permet de configurer les submodules de manière centralisée.

Exemple de contenu d'un fichier .gitmodules:



[submodule "src/promos/2022-2023"]
	path = src/promos/2022-2023
	url = https://github.com/do-it-ecm/promo-2022-2023.git
	branch = main
[submodule "src/promos/2023-2024"]
	path = src/promos/2023-2024
	url = https://github.com/do-it-ecm/promo-2023-2024.git
	branch = main
[submodule "src/promos/2024-2025"]
	path = src/promos/2024-2025
	url = https://github.com/do-it-ecm/promo-2024-2025.git
	branch = main
[submodule "src/cs"]
	path = src/cs
	url = https://github.com/do-it-ecm/courses.git
	branch = main
[submodule "scripts/compliance"]
	path = scripts/compliance
	url = https://github.com/do-it-ecm/compliance-check.git
  branch = main


Guide de debug

Spécialement pour vous, voici un guide de debug pour les erreurs les plus courantes (lorsque l'on veut publier son code)

flowchart TD
    giterror[\J'ai une erreur avec Git ?/] -->|Erreur repo distant / origin|originerror[git remote -v]

    originerror -->|Pas de remote|gitremoteadd[git remote add origin URL]
    originerror -->|Mauvaise URL|gitremotechange[git remote set-url origin URL]

    gitremoteadd --> problemsolvedquestion[\Problème résolu ?/]
    gitremotechange --> problemsolvedquestion
    problemsolvedquestion -->|Oui|problemsolved([Problème résolu])
    problemsolvedquestion -->|Oui mais nouvelle erreur|giterror
    problemsolvedquestion -->|Non|askforhelp([Chercher sur internet ou demander de l'aide])

    giterror -->|Erreur de branche|brancherror[git branch]
    brancherror -->|Pas de branche|gitcheckout[git checkout -b NOM_BRANCHE]
    brancherror -->|Mauvaise branche|gitcheckout[git checkout NOM_BRANCHE]
    brancherror -->|Pas droit de push|gitpush[git push --set-upstream origin NOM_BRANCHE_AVEC_DROITS]

    gitcheckout --> problemsolvedquestion
    gitpush --> problemsolvedquestion

    giterror -->|Synchronisation|syncerror[synchronisation]

    syncerror -->|Dépassement de commits ahead/behind|syncpullpush[git pull origin NOM_BRANCHE puis git push]
    syncerror -->|Conflits de merge|mergeconflict[Résoudre les conflits puis git add . et git commit]
    syncerror -->|Changements locaux non commités|stagedchanges[git add . puis git commit -m MESSAGE]

    syncpullpush --> problemsolvedquestion
    mergeconflict --> problemsolvedquestion
    stagedchanges --> problemsolvedquestion