git

Qu’est ce que Git

Il est absurde de développer sans utiliser un système de contrôle de révision; ce genre de système vous donne la liberté de faire ce que vous voulez avec votre code sans souci puisqu’il vous permet toujours de restaurer une version précédente.
Git s’inscrit dans ce cadre. C’est gestionnaire de versionning de code et un outil de developpement collaboratif Open source, il a été crée par Linus Torvalds lorsqu’il développait le noyau de Linux.
L’un des points importants que rajoute Git par rapport a d’autres système de gestion de versions ( comme SVN, CVS etc.) est qu’il vous permet d’avoir un environnement de « staging », c’est un . Je ferais une comparaison avec SVN pour éclaircir un peu le concept : Sous SVN, une fois vous effectuez vos changements et que vous voulez les soumettre, vous commitez. Ce code sera poussé dans le repository.
Avec Git, vous pouvez commiter votre code en local, retourner a des versions antérieures etc, toujours en local. Par la suite, vous pourrez commiter votre code sur le serveur. Vous pouvez voir cela comme un environnement de versionning local, mais qui est relie aussi a un environnement Maître.
Le lien : http://whygitisbetterthanx.com Explique via des graphiques Les différences de Git avec les autres systèmes de versionning.

Installation

Pour installer Git sous Ubuntu, tapez simplement :

sudo apt-get install git-core

Configuration

Avant de commencer d’utiliser Git, vous pouvez personnaliser votre identité en spécifiant votre nom et votre mail comme suit :

git config --global user.name "Votr nom"
git config --global user.email "votre@email.com"

Vous pouvez ajouter également des couleurs pour une meilleure lecture sur le terminal :

git config --global color.diff auto
git config --global color.status auto
git config --global color.branch auto

git init

$ mkdir gitTest
$ cd gitTest
$ git init
Initialized empty Git repository in /home/user/gitTest/.git/

La commande git init va initialiser votre répertoire. git init crée une branche Maître (branche principale). Vous pouvez par la suite créer différentes branches si le besoin se présente.

Pour ajouter des fichiers vous utiliserez la commande git add

git add . // ajouter le repertoire courant
git add *.php // ajouter tous les fichiers php dans le repertoire courant
git add index.php // ajouter le fichier index.php

tapez par la commande git commit.

~/gitTest$ git commit -m "Initial commit"

Le paramètre -m sert a définir votre message de commit. en omettant ce paramètre, un éditeur est ouvert afin de vous permettre de saisir votre message. A la sauvegarde de vos changements, le/les fichiers seront commites et vous aurez un message similaire :

Created initial commit b2c73d2: First commit
 1 files changed, 2 insertions(+), 0 deletions(-)
 create mode 100644 index.php

Par défaut, l’éditeur utilise est nano. Pour changer votre éditeur a vi par exemple, vous pouvez taper :

export SVN_EDITOR=vi

Le commit qu’on vient de faire commite nos fichiers en local. Pour voir l’état de notre projet, tapez git status

~/gitTest$ git status
# On branch master
# Changed but not updated:
#   (use "git add ..." to update what will be committed)
#
#	modified:   index.php
#
no changes added to commit (use "git add" and/or "git commit -a")

Comme vous le lisez sur le code ci-dessous, git vous suggère d’utiliser l’option -a de git commit pour pousser les changements dans la repository.

~/gitTest$ git commit -a
Created commit bc061fc: First revision
 1 files changed, 1 insertions(+), 1 deletions(-)
~/gitTest$ git status
# On branch master
nothing to commit (working directory clean)

git status

Comme on a vu, la commande git status permet d’afficher l’etat des fichiers dans votre repertoire de travail.
Nous allons créer un autre fichier index2.php, écrire une ligne ou deux et le sauvegarder. Nous allons aussi faire un changement dans le fichier index.php déjà ajoute et commite. Par la suite on tape un git status.

~/gitTest$ git status
# On branch master
# Changed but not updated:
#   (use "git add ..." to update what will be committed)
#
#	modified:   index.php
#
# Untracked files:
#   (use "git add ..." to include in what will be committed)
#
#	index2.php
no changes added to commit (use "git add" and/or "git commit -a")

La section Untracked files affiche les fichiers qui ne sont pas encore ajoutes a git. Si un fichier a été modifié, git le détecte aussi et vous le signale.
la commande git add permettra a la fois de mettre a jour le fichier auparavant versionne, et d’ajouter le nouveau fichier.
pour commiter directement les changements tapez

~/gitTest$ git commit -am 'version 3'
~/gitTest$ git status
# On branch master
nothing to commit (working directory clean)

git branch

Tout ce qu’on vient de faire jusque la était commité a la branche principale, ou encore la branche « master ». git nous le disait dans les commentaires de commit (# On branch master). Pour créer une nouvelle branche, on utilisera la commande git branch.

~/gitTest$ git branch

la commande git branch sans options liste les branches. Il nous faudra spécifier le nom de la branche si on veut en créer une:

~/gitTest$ git branch nouvelleBranche

Pour changer l’environnement de travail a la nouvelle branche créée, utiliser la commande git checkout

~/gitTest$ git checkout nouvelleBranche
Switched to branch "nouvelleBranche"

On aurait pu créer la branche et switcher directement dedans en tapant :

~/gitTest$ git checkout -b nouvelleBranche

On peut ajouter un fichier « onNouvelleBranche.php » dans cette branche

~/gitTest$ vi onNouvelleBranche.php // editer, ajouter quelques lignes et sauvegarder
~/gitTest$ git add onNouvelleBranche.php
~/gitTest$ git status
# On branch nouvelleBranche
# Changes to be committed:
#   (use "git reset HEAD ..." to unstage)
#
#	new file:   onNouvelleBranche.php
#
~/gitTest$ git commit onNouvelleBranche.php
Created commit 9136ef3: Added on nouvellebranche.php
 1 files changed, 2 insertions(+), 0 deletions(-)
~/gitTest$ git status
# On branch nouvelleBranche
nothing to commit (working directory clean)

On peut voir qu’on a un le fichier onNouvelleBranche.php qui est seulement dans la branche nouvelleBranche :

~/gitTest$ git checkout master
Switched to branch "master"
~/gitTest$ ls
index2.php  index3.php  index.php
~/gitTest$ git checkout nouvelleBranche
Switched to branch "nouvelleBranche"
~/gitTest$ ls
index2.php  index3.php  index.php  onNouvelleBranche.php

git merge

Maintenant que nous avons deux branches, la branche master et la branche nouvelleBranche. On peut imaginer le scénario la ou notre code est devenu suffisamment stable sur la branche nouvelleBranche, et qu’on voudrait le merger avec la branche principale. Pour ce faire, dans la branche master, on peut utiliser git merge :

~/gitTest$ git checkout master
Switched to branch "master"
~/gitTest$ git merge nouvelleBranche
Updating d7f806b..9136ef3
Fast forward
 onNouvelleBranche.php |    2 ++
 1 files changed, 2 insertions(+), 0 deletions(-)
 create mode 100644 onNouvelleBranche.php
~/gitTest$ ls
index2.php  index3.php  index.php  onNouvelleBranche.php

Comme vous le remarquez, le fichier onNouvelleBranche.php a ete rajoute dans la branche principale.

git log

Pour afficher les actions effectuées sur le repository, vous pouvez utiliser la commande git log :

~/gitTest$ git log
commit 9136ef3e840148e6e867589301dd0a6fc02afadb
Author: Anis
Date:   Sat Oct 31 18:32:41 2009 -0400

    Added on nouvellebranche.php

commit d7f806b98f7528e5247c59eb730405b94ea13c73
Author: Anis
Date:   Sat Oct 31 13:27:41 2009 -0400

    Updated index.php

commit ae8a77c7fe24e64bfc9a04efc45ae2333ad9e2b1
Author: Anis
Date:   Fri Oct 30 23:46:33 2009 -0400

    version 3

commit 76eb6058709baa2703bb900e8a321bd8ce5c79e8
Author: Anis
Date:   Fri Oct 30 23:44:08 2009 -0400

    added index2 and updated index

commit bc061fce5d91dc9e7ea44337b9c99c380d582d72
Author: Anis
Date:   Fri Oct 30 23:06:25 2009 -0400

    First revision

commit b2c73d23cf1ce6c12f3a6ebbe3d37ecd0c7bbf66
Author: Anis
Date:   Fri Oct 30 22:57:16 2009 -0400

    First commit

Pour un meilleur affichage, on peut utiliser l’option –graph, ou encore mieux, on peut utiliser gitk. gitk est un utilitaire graphique qui permet d’afficher l’ensemble des opérations effectuées sur votre repository, les diffs, les logs etc. Vous pouvez installer gitk sous ubuntu avec un simple « sudo apt-get install gitk »

github

GitHub

GitHub est un site hébergeant des repositories Git. Vous pouvez vous y inscrire et creer votre propre compte et vous aurez 300 Mo de stockage et un nombre illimité de repositories et de collaborateurs.
Vous aurez besoin de votre cle publique pour utiliser le service de GitHub.
Pour generer votre cle publique vous tapez :

~/gitTest$ ssh-keygen -t rsa -C "votre.mail@serveur.com"

Suivez les étapes de création, le programme vous indiquera l’emplacement du fichier contenant votre clé publique. C’est généralement sous votre répertoire home : ~/.ssh/id_rsa.pub. Copiez le contenu de ce fichier dans l’espace réservé lors de l’inscription. Ensuite, tapez :

~/gitTest$ ssh git@github.com

Vous serez demandes a taper votre pass-phrase pour valider l’authentification.

git clone

Maintenant que nous avons un compte chez github. essayons de « checkouter » un projet. Je choisis le projet PHP AUTOLOAD MANAGER de Bashar :

~$ git clone git://github.com/alfallouji/PHP-Autoload-Manager.git
Initialized empty Git repository in /home/bachkoutou/PHP-Autoload-Manager/.git/
remote: Counting objects: 37, done.
remote: Compressing objects: 100% (37/37), done.
remote: Total 37 (delta 11), reused 0 (delta 0)
Receiving objects: 100% (37/37), 7.16 KiB, done.
Resolving deltas: 100% (11/11), done.
~$ ls
gitTest PHP-Autoload-Manager

git push et git pull

La commande git push permet de pousser vos fichiers dans une repository distante. Je me suis fait créer une repo test sous GitHub. Je vais y pousser mes fichiers crées au cours de ce tutoriel comme suit :

~/gitTest$ git remote add origin git@github.com:bachkoutou/test.git
~/gitTest$ git push origin master
Counting objects: 19, done.
Compressing objects: 100% (13/13), done.
Writing objects: 100% (19/19), 1.62 KiB, done.
Total 19 (delta 2), reused 0 (delta 0)
To git@github.com:bachkoutou/test.git
 * [new branch]      master -> master

La première commande permet de donner le nom « origin » a notre repository distant. La deuxième va pousser les fichiers qui sont dans la branche master dans ce repository.

Si vous êtes un autre développeur sur le projet test, vous pouvez utiliser la commande git pull qui effectue a la fois un git fetch pour récupérer les changements et un git merge pour les merger avec votre version.

~$ mkdir gitTestCollaborator
~$ cd gitTestCollaborator/
~/gitTestCollaborator$ vi indexCollaborator.php
~/gitTestCollaborator$ git init
Initialized empty Git repository in /home/bachkoutou/gitTestCollaborator/.git/
~/gitTestCollaborator$ git pull git://github.com/bachkoutou/test.git
remote: Counting objects: 19, done.
remote: Compressing objects: 100% (13/13), done.
remote: Total 19 (delta 2), reused 0 (delta 0)
Unpacking objects: 100% (19/19), done.
From git://github.com/bachkoutou/test
 * branch            HEAD       -> FETCH_HEAD
~/gitTestCollaborator$ git status
# On branch master
# Untracked files:
#   (use "git add ..." to include in what will be committed)
#
#	indexCollaborator.php
nothing added to commit but untracked files present (use "git add" to track)
~/gitTestCollaborator$ git add indexCollaborator.php
~/gitTestCollaborator$ git commit -m "Added file from collaborator"
Created commit f71f97b: Added file from collaborator
 1 files changed, 2 insertions(+), 0 deletions(-)
 create mode 100644 indexCollaborator.php
~/gitTestCollaborator$ git status
# On branch master
nothing to commit (working directory clean)
~/gitTestCollaborator$ git remote add origin git@github.com:bachkoutou/test.git
~/gitTestCollaborator$ git push origin master
Counting objects: 4, done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 338 bytes, done.
Total 3 (delta 1), reused 0 (delta 0)
To git@github.com:bachkoutou/test.git
   9136ef3..f71f97b  master -> master
~/gitTestCollaborator$ git status
# On branch master
nothing to commit (working directory clean)

Pour illustrer ce scenario, je viens de

  • créer un répertoire gitTestCollaborator et l’acceder
  • ajouter un fichier indexCollaborator.php dans lequel j’ai ajouté une ligne
  • initialiser le projet avec git init
  • checkouter le projet GitHub/bachkoutou/test avec git pull git://github.com/bachkoutou/test.git
  • executer git status pour vous montrer que le fichier indexCollaborator.php n’est pas encore ajouté au projet
  • ajouter le fichier indexCollaborator.php avec git add
  • commiter mes changements avec git commit
  • pousser mes changements dans GitHub avec git remote et git push
  • executer un autre git status pour s’assurer que tout est bien passe

Je vais revenir maintenant au répertoire gitTest et effectuer un git pull pour récupérer le fichier indexCollaborator.

~/gitTestCollaborator$ cd ../gitTest
~/gitTest$ ls
index2.php  index3.php  index.php  onNouvelleBranche.php
~/gitTest$ git pull git://github.com/bachkoutou/test.git
remote: Counting objects: 4, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 1), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From git://github.com/bachkoutou/test
 * branch            HEAD       -> FETCH_HEAD
Updating 9136ef3..f71f97b
Fast forward
 indexCollaborator.php |    2 ++
 1 files changed, 2 insertions(+), 0 deletions(-)
 create mode 100644 indexCollaborator.php
~/gitTest$ ls
index2.php  index3.php  indexCollaborator.php  index.php  onNouvelleBranche.php

Le screenshot suivant affiche le contenu de mes fichiers sur GitHub

testProject

Conclusion

Au cours de ce tuto, nous venons de decouvrir comment utiliser Git pour un projet collaboratif et pour versionner vos fichier. Si vous avez des remarques ou des questions n’hesitez surtout pas!