Guide de survie GIT

Classé dans : Programmation | 0

Liste de commandes utiles pour les principaux traitement à réaliser avec GIT.

Git est un logiciel de versionning très puissant.

Pour la petite histoire c’est Linux Torvald (Papa de Linux! excusez du peu) qui a développé ce logiciel.

Git est aujourd’hui une référence et remplace petit à petit subversion (svn). Vous trouverez également ici quelques urls utiles pour GIT.

Dernière mise à jour : 04/09/2023

Configurer GIT

Définir votre nom : git config –global user.name votreNom
Définir votre e-mail : git config –global user.email votreEmail
Définir l’éditeur par défaut : git config –system core.editor vim
Editer le fichier de config global : git config –global –edit

Config dépôt local => DOSSIER_GIT/.git/config
Config user => ~/.gitconfig
Config globale => /etc/gitconfig
Si problème avec certains nom de fichiers sur Windows : git config --global core.protectNTFS false

Créer des alias

git config –global alias.ci commit => Permet d’écrire git ci (au lieu de git commit)
git config –global alias.ps push => git ps (au lieu de git push)
git config –global alias.pl pull => git pl (au lieu de git pull)

Gérer les remote

Ajout d’un remote : git add remote nomRemote urlRemote
Afficher les remotes : git remote -v
Affichage détaillé des remotes : git remote show
Renommer un remote : git remote rename ancienNom nouveauNom
Supprimer un remote : git remote rm nomRemote
Définit la branche par défaut du remote : git pull --set-upstream nomRemote nomBranche

Créer un dépôt

Cloner un projet dans le dossier courant : git clone URL_REMOTE_GIT .

Cloner un projet en créant un dossier avec le nom du depot : git clone URL_REMOTE_GIT

Créer un dossier et ‘pull’ d’un dépôt existant :
mkdir monProjet && cd monProjet && git init
git add remote urlServeurGit && git pull --set-upstream origin master

Créer un dépot GIT de stockage : mkdir monRepo && cd monRepo && git init --bare

Commandes de base

Commit et ajout de nouveaux fichiers : git commit -a -m 'Message lié au commit'
Envoye des modifications sur origin master : git push [nomRemote nomBranche]
NB: par défaut le remote est origin et la branche master ces valeurs sont optionnelles si identique dans votre projet
Récuperer les modifications depuis un remote : git pull [nomRemote nomBranche]
Exporter un projet : export GIT_WORK_TREE=/var/www/monsupersite && git checkout -f
Tester si votre connexion SSH avec clé fonctionne sur bitbucket.org : ssh -T git@bitbucket.org

Suivi des modifications avec ‘git log’

Affiche la liste des commits : git log
Version condensée (1 ligne par commit : git log -oneline
Affiche les 2 derniers commit uniquement : git log -n 2
Affiche les commit d’un fichier : git log nomFichier
Filtre la liste des commits sur le contenu des messages : git log -grep=monFiltre
Filtre à partir d’une date : git log -since=DATE | -after=DATE | -before=DATE | -until=DATE (mm/jj/aaaa)
Filtre sur l’auteur des commits : git log -author=NOM
Filtrer par date avec : --since-as-filter=mm/jj/aaaa
Tous les fichiers modifiés par commit depuis une date : git log --since-as-filter=07/10/2023 --name-only --oneline
Afficher uniquement les commentaires des commits : --oneline
Annule les modifications d’un commit (crée un commit inverse) : git revert numeroCommit
Afficher la liste des fichiers modifiés sur le dernier commit : git show --name-only --format=oneline
Possibilité de limiter aux modifs entre deux commits avec : commit1..commit2
git show --name-only 1e10e3e0b91..a765c82b24582e

Petit script bash pour afficher la liste des fichiers modifiés depuis un numéro de commit

#!/bin/bash
clear
echo -n "Num du commit ? : "
read C
echo "Liste des fichiers modifiés depuis le commit $C"
echo "------------------------------------------------------------"
git show --name-only --format=oneline ...$C

pull, fetch et checkout

Ces 3 commandes permettent de mettre à jour les fichiers de votre projet de plusieurs manières

git pull... télécharge les modifications depuis le remote, les copie dans le dépot local et dans le dossier de travail (dossier du projet)
git fetch... télécharge les modifications depuis le remote uniquement dans le dépot local, le dossier de travail n’est pas modifié
git checkout nomBranch transfère les fichiers du dépot local vers le dossier de travail, les modifications non commitées seront perdues!!

Les branches

Les branches permettent d’avoir plusieurs versions de votre projet qui vivent indépendamment les autres des autres. Une fois les développements terminés sur une branche elle peut être mergée avec la branche master pour être ensuite envoyée (push) sur un ou plusieurs remote. Les branches locale et remote peuvent être différentes.

Affiche les branches du dépot local : git branch
Affiche les branches des remotes : git branch -a
Crée une branche locale : git branch nomBranche
Nb: la branche est activée par défaut, les commits suivants se feront sur la nouvelle branche
Envoye une branche sur un remote : git push nomRemote nomBranche
Récupére modifications depuis un remote : git fetch nomRemote nomBranche
Active une branche et copie les fichiers dans le dossier de travail : git fetch nomBranch
Envoye les modifications d’une branche : git pull nomRemote nomBranch
Définir la branche par défaut lors de la création d’un dépôt : git config --global init.defaultBranch nomBranche

Merger deux branches

Se placer dans la branche ‘destination’ : git checkout nomBranche
Merger la deuxième branche avec : git merge nomBranche2
si tout est ok la branche2 peut être supprimée : git branch -d nomBranche2
NB: s’il reste des commits non ‘pushés’ il faudra utiliser l’option -D au lieu de -d pour la suppression.
Supprime une branche sur un remote : git push nomRemote --delete nomBranch

Gérer les conflits

Il arrive parfois si on travaille à plusieurs sur un projet que l’on se ‘décale’ par rapport à la branch master sur le dépot. Car on a fait des modifications en local, d’autre utilisateurs aussi et du coup il fa ut merger tout ça.

Si vous tenter un push depuis votre post, git va indiquer que vous êtes décaler et qu’il faut faire un pull d’abord pour récupérer les modifications depuis le depot master. Une fois le pull réaliser en local vous n’êtes plus sur la branch master mais sur un branch sans nom. il faut alors merger pour tout rassembler.

Il peut y avoir des conflits si certains fichiers ont été modifiés des deux cotés.

Pour merger il faut vérifier que vous êtes bien sur une branch autre que master : git branch
Ensuite utiliser : git branch merge master
Vous devriez maintenant être sur master et vos modifications peuvent être maintenant push vers le dépôt.

Les ‘submodule’

GIT permet d’intégrer un autre dépôt d’un un dépôt existant. C’est les submodule GIT. C’est utile par exemple si vous avez un ensemble de fichiers (un framework) que vous souhaitez utiliser dans plusieurs projets. Ce framework est dans un GIT il faut l’intégrer dans chaque projet via un submodule avec :

git submodule add URL_REPO DOSSIER_LOCAL
exemple : git submodule add igt@bitbucket.org:xxxx/monFramework libs/monFramwork

Opérations courantes

Récupérer une ancienne version d’un fichier

Retrouver le commit précédent la modif du fichier
Faire un checkout du fichier depuis ce commit : checkout XXX /path/fichier. (xxx = n° du commit)
Le fichier est copié à sa version précédente dans le dossier courant.
Il suffit ensuite de faire un commit + push pour mettre à jour le fichier dans le dépôt.
Il est possible de voir le fichier à sa précédente version avec : git show XXX:path/fichier (xxx = n° du commit)

Autre méthode : git checkout 'master@{2 days ago}' -- nomDuFichier, permet de récupérer un fichier à sa version d’il y a deux jours dans la branche master.

Déployer un projet GIT avec ‘post-receive’

post-receive est un script, à placer dans un dépôt de type ‘bare’ (git init --bare) dans le dossier hooks. Il permet d’exporter les fichiers d’un projet dans un dossier de production. C’est utilisé pour le déploiement sur les serveurs web entre autres. Voici un exemple de post-receive :

#!/bin/bash

# script de publication du site lors d'un push dans le depot
# doit etre placé dans /hooks/post-receive du projet 

# nom du projet 
PROJET="monProjet"

# path du depot bare git sur le serveur
REPO="/home/git/monProjet"

# dossier de destination, celui utilisé par le virtualhost apache en général
DEST="/home/git/exports/monProjet"

# dossier pour stocker un zip
# avant chaque deploiement un zip de l'ancienne version est créé
BACK="/home/git/_backups"

# date du jour au format aaaammjj-hhmm
TODAY=`date +"%Y%m%d-%H%M"`

# nom du zip 
ARCHIVE="$BACK/$PROJET-$TODAY.tgz"

echo "Backup du site existant dans $ARCHIVE"
tar czf $ARCHIVE $DEST

if [ -d "$DEST" ]; then
  echo "Export des fichiers 'master' pour le deploiement"
  cd $DEST
  git --work-tree=. --git-dir=$REPO checkout -f master
else
   echo "Dossier $DEST introuvable, post-receive stop!"
fi

Quelques sites utiles

https://www.atlassian.com/git/tutorials/git-hooks/conceptual-overview
https://www.atlassian.com/git/tutorials/advanced-overview

http://openclassrooms.com/courses/gerez-vos-codes-source-avec-git
http://git-scm.com/book/en/v2