Git
| Fiche express | |
|---|---|
| Domaine | Gestion de versions distribuée |
| Commande | git
|
| Installation | apt install git · yum install git
|
| Config | ~/.gitconfig (global), .git/config (dépôt)
|
| Ignorer | .gitignore
|
| Voir aussi | VCS, GitHub, GitLab, SVN |
Git est un VCS distribué : chaque clone contient l'intégralité de l'historique du projet. Il garantit l'intégrité des données grâce à des empreintes SHA-1 et raisonne en instantanés (snapshots) de l'arborescence à chaque commit, ce qui rend les opérations locales très rapides.
Un fichier suivi par Git passe par trois états :
- modifié — le fichier a changé dans le répertoire de travail mais n'est pas encore indexé ;
- indexé (staged) — le fichier est marqué pour faire partie du prochain commit ;
- commité — les données sont stockées en sécurité dans la base locale.
Le cycle standard est donc : modifier des fichiers → indexer (git add) → valider
(git commit).
Installation
apt install git # Debian/Ubuntu
yum install git # RHEL/CentOS
Configuration
La configuration globale (--global) s'applique à tous les dépôts de l'utilisateur.
# Identité (apparaît dans les commits)
git config --global user.name "Prénom Nom"
git config --global user.email "prenom.nom@example.com"
# Alias pratique : co pour checkout
git config --global alias.co checkout
# Éditeur et outil de comparaison/fusion
git config --global core.editor vi
git config --global merge.tool vimdiff # kdiff3, meld, opendiff... aussi supportés
# Vérifier la configuration
git config --list
git config user.name
Aide sur une commande :
git help config
git <verbe> --help
man git-<verbe>
Créer un dépôt
cd mon-projet
git init # crée le dépôt dans le répertoire courant
git add . # indexe tous les fichiers (ou : git add *.c, git add README)
git commit -m "Initial commit"
Ignorer des fichiers
Le fichier .gitignore exclut du suivi les fichiers temporaires ou générés :
*.[oa] # produits de compilation (.o, .a)
*~ # fichiers temporaires d'éditeur
!lib.a # exception : suivre lib.a malgré la règle précédente
/TODO # uniquement le TODO à la racine
build/ # tout le répertoire build
*.log # tous les logs
Modifier et valider
git status # état du répertoire de travail et de l'index
git add fichier # indexe un fichier
git diff # modifications non encore indexées
git diff --cached # modifications indexées (prochain commit)
git commit -m "Story 182: correction des benchmarks"
git commit -a -m "MAJ" # indexe + valide en une fois (fichiers déjà suivis)
Autres opérations courantes :
git rm fichier # supprime et déréférence
git rm --cached fichier # cesse de suivre sans supprimer du disque
git mv ancien nouveau # renomme (raccourci pour rm + add)
git commit --amend # complète/corrige le dernier commit
git reset HEAD fichier # désindexe un fichier
git reset HEAD~2 # annule les 2 derniers commits (garde les modifs)
git checkout -- fichier # restaure un fichier depuis le dernier commit (rollback)
Historique
git log # historique complet
git log -p -2 # patch des 2 derniers commits
git log --stat # statistiques par fichier
git log --pretty=oneline # une ligne par commit
git log --pretty=format:"%h — %an, %ar : %s" --graph
git log --since=2.weeks # limité dans le temps (--after/--before, --author...)
Quelques codes de format (--pretty=format:) : %H empreinte complète,
%h abrégée, %an/%ae auteur/e-mail,
%ad date, %s sujet. L'outil graphique gitk permet de
visualiser le même historique.
Branches
Tout VCS gère la notion de branche ; sous Git elle est particulièrement légère.
git checkout -b modif-README # crée et bascule sur une nouvelle branche
# ... modifications ...
git commit -a -m "Amélioration du README"
git checkout master
git merge modif-README # fusionne dans master
git branch -d modif-README # supprime la branche fusionnée (-D pour forcer)
Dépôts distants
git clone https://github.com/utilisateur/monprojet.git
cd monprojet
git remote -v # dépôts distants connus
git remote add pb https://github.com/autre/monprojet.git # ajoute un remote nommé "pb"
git fetch pb # récupère sans fusionner
git push origin master # pousse ses commits
git remote show origin # détails d'un remote
git remote rename pb paul # renomme / git remote rm paul pour retirer
Derrière un proxy, on peut le déclarer dans la configuration :
git config --global http.proxy http://utilisateur:motdepasse@proxy.example.com:3128
Balises (tags)
Une balise pointe sur un commit précis, typiquement pour marquer une version.
git tag # liste
git tag -a v1.4 -m "version 1.4" # balise annotée
git tag v1.4-lw # balise légère
git tag -s v1.5 -m "tag signé" # signée GPG
git show v1.4
git tag -a v1.2 9fceb02 # baliser un commit passé (par son empreinte)
git push origin v1.5 # pousser une balise (--tags pour toutes)
Maintenance de l'espace
git gc # réorganise/compacte l'espace utilisé
git repack # recrée les packs
# Purger un répertoire de tout l'historique :
git filter-branch --index-filter 'git rm -r --ignore-unmatch --cached DIR' --prune-empty -- --all
Publier vers GitHub
git config --global user.email "prenom.nom@example.com"
git config --global user.name "Prénom Nom"
# Nouveau dépôt
git init
git add README.md
git commit -m "first commit"
git remote add origin git@github.com:utilisateur/monprojet.git
git push -u origin master