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
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
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