wiki:GitManual

Mode d'emploi de git

TracNav(WikiMenu)?

Retour au sommaire

Fonctionnement général

 git est un VCS développé par Linus Torvalds en tant que remplaçant de  BitKeeper pour la gestion du code source du noyau linux. Il commence à être trés utilisé dans pas mal de projet et présente plusieurs avantages par rapport a SVN (voir  http://git.or.cz/gitwiki/GitSvnComparsion pour un comparatif).

git contrairement a SVN est distribué ce qui veut dire qu'une fois le repository mis en place vous n'avez plus besoin de connexion au serveur : toutes vos branches, révisions et autres commit se font directement sur votre machine.

Un point intéressant c'est que git est aussi capable de fonctionner avec des serveurs SVN ou CVS. L'idée étant que vous travaillez sur votre repository git local et que vous trackez des branches distantes sur le serveur svn. Vous pouvez ainsi faire plusieurs modifications (commit) locales et n'envoyer sur le serveur svn que le résultat de ces modifications une fois testées.

Ceci est possible grace à git-svn qui permet une communication bidirectionnelle entre le serveur svn et votre repository git. git-svn permet de recupérer les modifications présentent sur le serveur et d'envoyer nos propres modifications.

Pour que git-svn fonctionne les bindings perl de svn doivent être présents. Si vous avez de la chance ils sont deja la, sinon il faut recompiler subversion (rien de tres compliqué). Pour cela vous devrez telecharger le code source de subversion ainsi que swig (version 1.3.29 qui n'est pas la derniere car les bindings ne fonctionnent pas avec les dernieres versions).

Compilez et installer swig:

./configure && make && su -c "make install"

Puis compilez et installez subversion et ses bindings:

./configure && make && su -c "make install"
make swig-pl && su -c "make install-swig-pl"

C'est certainement plus simple dans des distributions modernes avec des gestionnaires de packages formidable mais la je ne sais pas ce qu'il faut installer...

Cloner le repository svn

Pour commencer a travailler avec git sur un serveur svn il faut avant tout faire une copie locale du repository distant. Pour cela on utilise la commande suivante:

git-svn clone http://svn-cerv.ath.cx/svn/mon_projet/ --trunk=trunk --branches=branches --tags=tags local_dir

Cette commande est valable pour les projets qui suivent la convention svn avec les trois repertoires branches,tags et trunk. Si ce n'est pas le cas pour votre projet, pas de probleme il suffit de le dire a git-svn dans les options branches,trunk et tags de la ligne de commande (man git-svn pour plus de détails).

Lorsque vous lancez cette commande, git-svn va importer tout le repository svn sur votre machine (n'ayez pas peur git est beaucoup moins gourmand en espace disque que svn, vraiment beaucoup...). Il va également créer des branches distantes pour chaque branche existante sur le repository svn (même les branches que vou avez effacées qui en fait existent toujours sur svn mais sont simplement invisibles).

Vous pouvez afficher toutes les branche de votre repository avec la commande:

git branch -a

Ou uniquement les branches distantes avec la commande:

git branch -r

La branche courante est précédée du caractère "*", par défaut vous vous trouverez sur la branche "master" (l'équivalent du trunk de SVN)

A partir de la on peut travailler de façon normale avec git sur le repository local.

Il peut néanmoins être utile de s'assurer que la branche "master" du repository local git est bien celle que l'on souhaite (trunk généralement) pour cela:

git reset --hard remotes/trunk

Cette commande est nécessaire car la branche master locale n'est pas forcement associée au trunk suivant l'historique svn. Une autre solution et de créer une branche trunk locale comme cela:

git checkout -b local-trunk remotes/trunk

Vous pouvez également créer une branche locale pour chacune des branches distantes qui vous intéresse en suivant le meme principe (voir la section sur la manipulation de branches pour plus de détails).

Note: lorsqu'il importe le repository svn, git n'effectue pas de suivi sur les deplacement et effacement de branches. Ainsi vous risquez de vous retrouver avec des branches que vous avez deja effacées. Ce n'est pas un problèmes il suffit de faire un peut de nettoyage (voir la section sur l'utilisation des branches).

Travailler avec git

Une fois le repository git local créer à partir du repository svn vous pouvez travailler normalement avec git localement sur votre machine. git étant distribué vous n'avez pas besoin de connexion au serveur svn pour effectuer les commandes qui suivent mais les effets de ces commandes sont bien évidement locaux: elle n'entrainent aucune modification sur le serveur SVN.

Pour avoir une liste complete des commandes installées sur votre machine utilisez:

git help -a

Pour avoir de l'aide sur une commande specifique:

git help command

ou

man git-command

Jouer avec les branches

L'idée de git (comme pour svn) est que vous aller travailler avec des branches. Un avantage ici vient du fait que le repository est local vous pouvez donc créez et effacer des branches comme vous le souhaitez sans avoir de connexion au server ou le modifier.

Pour afficher les branches locales:

git branch

Pour afficher les branches distantes:

git branch -r

Pour afficher toutes les branches:

git branch -a

Vous pouvez utilisez l'option -v pour afficher le dernier message de commit a coté de chaque branche.

L'idée de git est que le dossier dans lequel se trouve votre repository ne vous montre que la branche courante. Pour passer sur une autre branche vous pouvez utilisez la commande checkout:

git checkout mon_autre_branche

Cela modifiera le contenu du repertoire de votre repository pour refleter l'etat de la branche souhaitée.

Pour créer une branche:

git branch nom_de_la_nouvelle_branche [nom_du_point_de_depart]

Un raccourci pour créer un branche et se placer dedans directement:

git branch -b nom_de_la_branche [point_de_depart]

Cette commande est équivalente a:

git branch nom_de_la_branche
git checkout nom_de_la_branche

Pour effacer une branche utiliser simplement l'option -d:

git branch -d la_branche_a_virer

S'il s'agit d'une branche distante ajoutez simplement l'option -r:

git branch -d -r la_branche_distant_a_virer

Ajouter, enlever et modifier des fichiers

Ici ca marche comme svn. Pour dire a git qu'il doit s'occuper de suivre un fichier utilisez:

git add le_fichier

Pour faire un commit utilisez:

git commit -a

Cela fera un commit de toutes les modifications. Vous pouvez consulter ces modification en utilisant la commande:

git status

Pour faire un commit sur un fichier specifique:

git commit le_fichier

Pour revenir en arriere vous pouvez utiliser la commande git-reset:

git reset --soft revision

permet de retirer le commit sans retirer les modifications sur les fichiers locaux et

git reset --hard revision

permet de revenir en arriere en enlevant les modifications locales.

Attention !!!! cette derniere commande remet tout dans l'état de la revision demandée !! Ce qui veut dire que meme des fichiers que vous auriez ajouté peuvent être effacés !!

Si jamais vous avez oublié quelque chose lors du dernier commit vous pouvez le modifier avec l'option --amend qui equivaut à la succession de commandes:

git reset --soft HEAD^
# vos modifications
git commit -c ORIG_HEAD

Quand vous effectuez des modifications locales, git les stocke dans ce qu'il appelle l'index. C'est ensuite les modifications de cet index que vous validez en utilisant la commande commit.

Interaction avec le serveur svn

Tout ca c'est bien pratique mais les autres gens eux travaillent sur svn !!! Il font donc pouvoir refleter nos modifications locales sur le serveur et continuer a recupérer les modifications distantes.

Pour recevoir les modifications distantes (svn update):

git-svn rebase

Pour envoyer vos modifications:

git-svn dcommit

Pour mettre a jour les branches svn distantes sans faire de merge avec votre branche courante:

git-svn fetch

Il peut arriver que vous ayez des modifications locales de votre index que vous ne souhaitez pas forcement commit avant de mettre à jour le serveur svn (rebase ou dcommit). Pour cela vous pouvez il existe une commande qui permet d'effectuer un commit temporaire pour ensuite réappliquer les changements une fois la mise à jour effectuée:

# commit temporaire
git stash
# mise à jour
git-svn rebase ou git-svn dcommit
# on réapplique les changements locaux
git stash apply

En cas de conflits

La gestion de conflits avec git est assez similaire à svn. En cas de conflit git vous avertira qu'il n'a pas pu faire de merge correctement. Dans ce cas allez corriger les fichiers concernés puis pour chaque fichier corrigé utiliser la commande:

git add fichier_corrigé

Pour dire à git que le conflit est résolu. Vous pouvez ensuite faire un commit normalement:

git commit -a

Notes

Rappelez vous qu'en utilsant git avec svn vous travaillez avant tout sur un repository local et qu'il faut envoyer et recevoir les modifications de façon explicite sur le serveur svn !!!

Configuration

git peut vous demander quelques configurations comme votre nom d'utilisateur et votre email. Une façon de gérer ca simplement pour tout les projet git sur votre machine est de créer un fichier .gitconfig dans votre $HOME.

Le détail des options peut être trouver dans la page de man de git-config:

man git-config

Mais sinon un exemple simple de fichier et le suivant:

[user]
     email=nom@enib.fr
     name=Prénom Nom
[color]
     branch = auto
     diff = no
     status = auto

Ce fichier configure votre nom et adresse email ainsi que des options de couleurs que git utilisera pour l'affichage des commandes status et branch si votre terminal le permet.

Autre petit truc interessant, le fichier .gitignore a placer a la racine du projet. Il permet de specifier les fichiers que git ne doit pas prendre en compte. En effet, meme s'il est nécessaire de faire un git add pour tracker un fichier avec git, lorsque vous faites un git status par exemple, vous verrez apparaitre tout les fichiers qui ne sont pas suivis par git. Ceci peut etre ennuyeux pour tout les fichiers de compilation etc. Pour dire a git de ne pas les afficher créez le .gitignore a la racine du projet et specifiez les fichiers a ne pas prendre en compte au moyen de regexp. Par exemple:

*.o
*.log
*test*

Ressources complémentaires pour git

Ceci n'est qu'un aperçu pour une utilisation classique et il existe bien d'autres commandes. Vous pourrez trouver plus d'informations sur les sites suivants:

Il y a pleins de tutorials sur le net donc comme on dit  JFGI et  RTFM !