igloo

Git


mise en ligne: 06/2024


Git est un logiciel de gestion de versions décentralisé. C’est un logiciel libre créé en 2005 par Linus Torvalds, développé et optimisé pour le noyau Linux.
Il permet à des collaborateurs du monde entier de contribuer au code en travaillant localement sur une copie d’un répertoire distant tout en conservant un historique précis des différentes modifications..

Schéma d'opérations Git

Installation du client Git

Pour Windows et MacOs, suivre les instructions sur le site officiel: https://git-scm.com
pour Linux, Git est disponible via le gestionnaire de paquet de votre distribution.
Les utilisateurs de Windows pourront utiliser git-bash.exe

# emerge -a dev-vcs/git

Configuration

la configuration de Git peut se faire de façon globale (avec l’option --global) ou par dépôt.

On peut afficher la configuration actuelle

$ git config --list

core.editor=emacs
user.name=Rod
user.email=rod@rod-again.com
color.diff=auto
color.status=auto
color.branch=auto

Il faut configurer un utilisateur pour signer ses modifications

$ git config --global user.name "Rod"
$ git config --global user.email "rod@rod-again.com"

On peut activer les couleurs dans l'affichage

$ git config --global color.diff auto
$ git config --global color.status auto
$ git config --global color.branch auto

Choisir son éditeur de texte par défaut

$ git config --global core.editor emacs
$ git config --global merge.tool vimdiff

Éventuellement, créer des alias

$ git config --global alias.co checkout
$ git config --global alias.br branch
$ git config --global alias.ci commit
$ git config --global alias.st status

Si la sortie de git s’ouvre dans un pager (comme ‘more’ ou ‘less’) et que vous souhaitez modifier ce comportement:

$ git config --global core.pager ""

Vous pouvez modifier votre prompt Bash pour afficher des informations, comme la branche courante par exemple

$ source /usr/share/git/git-prompt.sh
$ export PS1='\[\033[01;32m\]\u@\h\[\033[01;34m\] \w\[\033[01;33m\]$(__git_ps1)\[\033[01;34m\] \$\[\033[00m\] '
$ export GIT_PS1_SHOWDIRTYSTATE=1

Plus d'info ici: https://github.com/magicmonty/bash-git-prompt

Trouver de l'aide

De l'aide est disponible directement en ligne de commande:

$ git help
$ git help _command_
$ git help --all
$ man git
$ man git-commit

Ou sur le net:
https://mirrors.edge.kernel.org/pub/software/scm/git/docs/user-manual.html
https://git-scm.com/
https://wiki.gentoo.org/wiki/Git/
https://openclassrooms.com/fr/courses/7162856-gerez-du-code-avec-git-et-github

Création d'un dépôt local

On créér un nouveau répertoire avec la commande mkdir, on s'y déplace avec la commade cd et on initialise le dépôt

$ git init

On remarque la création du dossier caché .git

Quelques commandes Bash utiles:

$ pwd # indique le répertoire courant dans l’arborescence
$ ls # liste les fichiers présents dans le répertoire (option ‘-a’ pour afficher les fichiers cachés)
$ mkdir # créé un nouveau répertoire
$ cd # permet de se déplacer dans l’arborescence
$ touch # créé un fichier vide (ou change la date de dernière modification d’un fichier existant)
$ echo # affiche une chaîne de caractères à l’écran (ou écrit la chaîne de caractères dans un fichier avec une redirection ‘>’ ou ‘>>’)
$ cat # affiche le contenu d’un fichier
$ rm # supprime un fichier
$ mv # déplace ou renomme un fichier

Commandes de base

Les fichiers peuvent être dans 3 états différents: indexé (tracked), ignoré (ignored) ou non-indexé (untracked).
La commande suivante nous indique l'état des fichiers:

$ git status

On indexe les fichiers avec la commande suivante:

$ git add nom_du_fichier1 nom_du_fichier2

On valide nos modification en créant un commit. Nous disposons dorénavant d'une entrée dans le journal que l'on pourra rappeler en cas de besoin.
L'option -m permet d'ajouter une description des modifications effectuées. Ce message est obligatoire, un éditeur de texte s'ouvre si vous omettez l'option

$ git commit -m "message"

On peut créer un fichier .gitignore contenant les noms de fichier ou les structures de noms de fichiers à ignorer lors de l’indexation, appliqué récursivement sur les sous-répertoires éventuels.
peut-être outrepassé avec ‘!’
exemples:

*.ko
!mon_pilote.ko

$ git add # index un ou des fichiers/répertoires
$ git rm # supprime le fichier de l’arbre de travail et de l’index mais pas du dépôt tant qu’il n’y a pas eu de nouveau commit
$ git rm _fichier_ --cached # désindexe le fichier (--cached peut être remplacé par --staged)
$ git mv _ancien_ _nouveau_ # renomme et indexe le fichier
$ git ls-files # liste les fichiers dans l’index et l’arbre de travail
$ git ls-files --others # liste les fichiers non-indexés
$ git ls-files --excludes-standard # liste les fichiers ignorés
$ git commit # -m pour ajouter un message, -s pour signer le commit, -a, * ou . pour affecter tous les fichiers, le HEAD de la branche courante pointe vers le dernier commit
$ git diff # affiche les différences entre le répertoire de travail et le dernier commit
$ git diff commit_précédent # même chose avec un commit plus ancien
$ git diff --staged # différence entre les fichiers indexés et le dernier commit (précisez le commit si un autre commit que le courant est souhaité)
$ git diff _commit1_ _commit2_ # différences entre 2 commits
autres options:
--ignore-all-space
--stat # ou
--numstat # génère de brèves statistiques
$ git log # affiche la liste globale des commits accessibles depuis le répertoire .git/refs (heads, tags, remotes) en commençant par le plus récent. La sortie sera identique pour tous les utilisateurs partageant un même dépôt distant
$ git reflog # affiche la liste de tous les commits effectués localement (par défaut, les entrées de plus de 90 jours sont supprimées). La sortie est spécifique au répertoire de travail de chaque utilisateur
$ git tag # permet d’étiqueter les commits pour éviter d’utiliser les identifiants hexadécimaux
$ git tag v_10 8fe144d
$ git checkout v_10 # bascule sur le commit taggé 'v_10'
$ git revert _commit_ # bascule sur un commit précédent
HEAD commit le plus récent
HEAD~ commit parent de HEAD
HEAD~~ ou HEAD~2 commit grand-parent de HEAD
Identifiant hexadécimal du commit (complet ou partiel)
Tag
-> entraine la création d'un nouveau commit
$ git reset --[soft, mixed, hord, merge, keep] HEAD~3 à réserver aux branches privées qui n’ont pas été partagées.
$ git gc # collecteur de déchets, optimise la taille de votre dépôt
$ git fsck # recherche des erreurs, qu’on peut supprimer avec git prune
$ git prune -n
$ git prune
$ git blame _file_ # permet de suivre les changements en fonction des contributeurs
$ git bisect # recherche interactive de bug entre le dernier commit (bad) et le dernier bon commit connu (good)
$ git bisect start
$ git bisect bad
$ git bisect good v_10
Git vous place sur un commit à mi-chemin entre le mauvais et le bon commit, à vous de voir si le bug est présent ou non
s'il est présent:
$ git bisect bad
sinon:
$ git bisect good
lorsque vous avez identifié le commit ayant introduit le bug:
$ git bisect reset

Les branches

La branche main (ou master) est créée automatiquement lors du premier commit

$ git branch affiche les branches existantes ‘*’ indique la branche active
$ git show-branch
$ git branch _nouvelle-branche_ Créé une nouvelle branche
$ git branch -a liste toutes les branches du dépôt distant
$ git checkout _branche_ bascule sur la branche spécifiée
$ git checkout -b _branche_ créé et bascule sur la nouvelle branche
$ git push -u origin _branche_ créé la nouvelle branche et ajoute les modifications au dépôt distant. ‘git push’ suffit si la branche distance existe déjà
$ git show _tag_:_path/to/file affiche le contenu du fichier correspondant à la version du tag
$ git checkout _tag_ path/to/file (sans ‘:’) restaure l’ancienne version du fichier

Fusionner les branches

$ git checkout main il faut se déplacer dans la branche vers laquelle on veut fusionner les modif’
$ git merge _branche_ les fichiers de la branche sont intégrés à la branche principale
$ git branch -d _branche_ supprime la branche

Résolution de conflits

Il peut arriver que plusieurs personnes travaillent en même temps sur le même fichier ce qui peut entrainer des conflits lors de la fusion des branches.
Vous ne pouvez pas faire de push si votre dépôt local n’est pas à jour

$ git pull récupère les derniers commits et exécute un ‘merge’

Un conflit peut apparaître (uniquement chez la personne qui déclenche le merge, c’est à la dernière personne qui push de résoudre les conflits)

$ git ls-files affiche plusieurs fois les fichiers problématiques
$ cat _fichier_problématique_ affiche les lignes qui diffèrent
1ere approche:
$ git reset annule le merge et désindexe les fichiers, vous devez modifier l’une des versions
2eme approche:
éditez le fichier qui contient les différences entre les fichiers conflictuels
$ git checkout --ours file conserve nos fichiers
$ git checkout --theirs file mets à jour les fichiers locaux
$ emacs file
git add / git commit / git push

Rebase

$ git rebase main réinitialise l’historique en plaçant votre branche à la tête de la branche main

ON NE RÉALISE JAMAIS UN REBASE SUR UNE BRANCHE PUBLIQUE (UPSTREAM)

On règle les conflits comme pour un merge

$ git add
$ git rebase --continue
$ git rebase --abort

Mise à jour du dépôt local

$ git pull origin main
Si vous n'avez pas les droits sur la branche main, créez la votre:
$ git branch _ma-branche_
$ git checkout _ma-branche_
$ git add / git commit
$ git push origin _ma-branche_