Git

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
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

Voir aussi