Navigation

Versions

02/03/2016 : config system wide
24/11/2014 : note sur git diff
20/11/2012 : git stage
19/06/2012 : pretty log
16/11/2011 : ajout des tags
2011 : création

Contactez-nous

Kitpages
17 rue de la Frise
38000 Grenoble
tel : 04 58 00 33 81

Par Philippe Le Van (twitter accountplv) Dernière mise à jour : 20 November 2012

Aide mémoire GIT

Vue d'ensemble

GIT est un outil de suivi de versions. C'est l'outil à la mode en ce moment. Il se présente comme un successeur probable de Subversion.

Le principe de fonctionnement est différent de subversion pour plusieurs raisons :

  • Le répository est distribué : on n'a pas juste une copie locale sur son poste, on a tout le répository
  • On ne devrait plus vraiment parler de suivi de version, mais plutôt de suivi de "changements". C'est à mon avis le grand point fort de GIT, c'est de pouvoir agréger des changement de nombreux contributeurs, sans forcément prendre leur version complète.

Je n'entre pas plus loin dans le débat d'idées autour de GIT, cherchez dans Google il y en a des tonnes.

Ma conclusion générale concernant l'outil GIT est que :

  • C'est un très bon outil qui permet de gérer plus sereinement des choses qu'on aurait eu du mal à gérer avec SVN
  • C'est très complexe à appréhender au départ.

 

Objet de l'article

L'objet de l'article est de donner une liste de commandes utilisées très souvent.

Ca n'est donc pas une introduction à GIT. Pour cela je vous conseille la doc officielle, le livre "Pro GIT" ou bien Google.

Configuration générale

Configurer son client GIT

git config --global user.name "Vos Nom Prénom"
git config --global user.email "toto@hotmail.com"
git config --global core.editor vim
git config --global merge.tool vimdiff
git config --global core.autocrlf false
git config --global core.filemode false
 
# pour voir ce qui est configuré dans un repo
git config --list

# pour voir ce qui est configuré "system wide"
git config --list --global

git ignore global

Pour ignorer de façon globale des fichiers dans git, on peut utiliser la méthode suivante :

# définir ~/.gitignore_global comme fichier d'exclusion
git config --global core.excludesfile ~/.gitignore_global

# dans le fichier .gitignore_global, on a des lignes comme dans un gitignore normal.
.idea/

Liste de fichiers modifiés entre 2 commits

# Liste de fichiers modifiés entre 2 commits
git diff --name-only 9960f0a18dfaa3c60a03fb5830b84a20e0deff68 HEAD

Jouer avec les remotes

Les remotes sont les "répository" d'autres machines, c'est à dire pas votre répository.

On prend ici le cas où vous avez les droits sur le remote principal (origin).

# récupérer un repository distant chez soi
git clone git@github.com:philippe-levan/jquery.kitAutocomplete.git
 
# note, on est alors sur le remote "origin" et la branche "master"
 
# mettre à jour son repository local en fonction du remote "origin"
git pull
 
# pour envoyer ses données sur un remote
# git add, git commit, git push, allez voir Google...

Créer une branche et l'envoyer sur le remote

On suppose qu'on part de l'état suivant :

  • Vous venez de cloner un repository remote
    • origin pointe sur ce remote
    • master est la branche par défaut que vous avez récupéré

 

# créer une branche locale "dev"
git branch dev  # crée la branche
git checkout dev # bascule sur cette branche
 
# raccourcis en une commande
git checkout -b dev
 
# voir la liste des branches
git branch -a
 
# une branche peut avoir un nom plus complexe
git checkout -b kit-maps/dev
git branch -a
 
# envoyer la branche locale vers le remote origin
git push origin kit-maps/dev

Défaire des choses, récupérer des choses, git checkout

On a un peu l'impression que "git checkout" est une fonction fourre tout qui sert à des choses différentes :

  • Changer de branche
  • Faire un revert
  • Récupérer d'anciennes versions

En fait c'est lié au fonctionnement général de GIT :

git checkout <un_commit> <un_fichier>

  • <un_commit> est soit un nom SHA1 de commit (ex : 5f6848f7943057d9414991eead4770c96bb85e6c) soit un pointeur vers un commit (master, head, nom de branche,...)
  • <un_fichier> : tout le repository s'il n'est pas rempli sinon un fichier en particulier. On se retrouve après le checkout avec le fichier dans l'état du commit donné en 1er paramètre

Quelques exemples d'utilisation :

# passer sur une branche "dev"
git checkout dev
# pas de 2 paramètre => tout le repository
# "dev" pointe sur le dernier commit de la branche dev,
# c'est pour ça que notre repository change de branche.
 
 
# faire un "revert" (comme dans svn)
git checkout /www/index.php
# le nom du commit n'est pas mentionné => il prend HEAD par défaut
# le fichier bascule dans l'état où il était dans le
# repository dans le HEAD, ça fait donc
# l'équivalent d'un svn revert.
 
 
# revenir à une ancienne version d'un fichier
git log # affiche les dernier commits avec leur SHA1
git checkout ff02a4fd8f09 /www/index.php
# le fichier bascule dans l'état du commit
# donné en 1e paramètre (le code SHA1)

Récupérer en local une branche créée sur le remote

# récupérer les codes remotes
git fetch origin
 
# si une branche remote "maBranche" vient d être créée
# pour la rapatrier chez soi :
git branch --track maBranche remotes/origin/maBranche 
 
# voir où on en est :
git branch -a

Petites commandes pratiques

# un fichier a été ajouté par erreur dans GIT ?
# pour le sortir de GIT sans l effacer :
git rm --cached <file>

# pour n'ajouter que certaines modifications d'un fichier dans un commit
git stage --patch
# ensuite pour chaque modif du fichier, git vous demande si vous voulez
# ajouter la modif

GitHub, jouer avec plusieurs remotes

GitHub est un repository distant administrable par une interface web.

Beaucoup de projets opensource utilisent maintenant GitHub. Le mécanisme général est le suivant :

  • Je crée un compte github sur le site
  • Je clone un projet existant avec l'interface web de github
    • Un clone du projet arrive donc dans mon compte github
  • Je récupère sur mon ordinateur, le clone de mon compte github
  • je définis un 2e remote pour le projet initial (celui que j'ai cloné)
  • je maintiens mon projet à jour sur mon repository local puis sur mon repository distant github.

Voyons concrètement ce que ça donne avec l'exemple du zf2.

# je crée un compte github (sur le site github)
 
# je forke https://github.com/zendframework/zf2
# toujours sur le site github
 
# je récupère crée un repository local :
git clone git@github.com:<my_account>/zf2.git
 
# note : le remote "origin" pointe sur mon compte github
 
# ajouter le remote du "vrai projet" avant fork
git remote add zf2 git://github.com/zendframework/zf2.git
 
# maintenir à jour son repository local
git checkout master
git pull zf2 master
 
# remonter les modifs sur son compte github
git push origin

Créer des tags

# lister les tags d'un repo
git tag

# create a tag
git tag -a v1.0.0 -m "first stable version"

# push tag to the repo
git push origin v1.0.0

Un meilleur git log

résultat du

Un alias permettant d'avoir un git log plus sexy que celui de base.

C'est tiré directement de l'article "A better git log" de codewall

# la commande elle même
git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --

# créer un alias :
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --"

# lancer l'alias, version condensée
git lg

Contributions

Merci à :
- Benjamin Dulau (@Delendial) pour le filemode

Conclusion

Cette page est un aide mémoire GIT pour des opérations assez courantes. Le but est de la consulter pour ne pas avoir à chercher des heures dans la doc officielle.

N'hésitez pas à me faire des remarques dans les commentaires ci-dessous.

Commentaires

Ajouter un commentaire
Aide-mémoire interactif
En complément de cet article, vous pouvez vous initier à à Git avec l’<a href="http://blogs.media-tips.com/bernard.opic/2013/12/01/initiez-vous-a-git-avec-laide-memoire-interactif-dandrew-peterson/">aide-mémoire interactif d’Andrew Peterson</a>.