[Tuto] Découverte de GIT

logo-gitAujourd’hui je vais vous présenter GIT, un logiciel de gestion de version décentraliser que tout développeur devrez connaître. GIT à était créé en 2005 par Linus Torvald, il se veut simple, très efficace et c’est un logiciel indispensable pour travailler à plusieurs sur le code source d’un projet dans de bonne condition.

Pour rappel, un logiciel de gestion de version permet de suivre l’évolution du code source (qui a fait quoi, où) et de pouvoir travailler à plusieurs (plusieurs personnes peuvent travailler sur le même fichier au même moment).

Installation de GIT

Sur Linux

Utiliser le gestionnaire de paquets pour installer Git et kdiff3 un outil de comparaison :

> sudo apt-get install git kdiff3

Sur Windows

Git est un outil Linux, il n’y a pas de version pour Windows. Pour utiliser Git sur Windows il faut un émulateur de console Linux, comme msysgit. Je vous propose d’installer Git Extension qui est un ensemble d’outil pour travailler avec Git (émulateur de console Linux, interface graphique, outils de comparaison).

Une fois télécharger, lancer l’exécutable. Cochez les casses “Install MsysGit” et “Install KDiff” pour l’installation de l’émulateur et de l’outil de comparaison.

git-installation_gitExtensions1

Au moment de sélection le client SSH cochez « PuTTY », il va nous servir pour nous connecter aux dépôts distant en SSH. Pour finir cliqué sur « install ».

git-installation_gitExtensions2

Configuration GIT

Une fois installée il faut configurer Git, ouvrez une console (ou GIT Bash sous Windows) pour commencer à utiliser Git.

La première chose à faire est d’entrer votre nom et votre e-mail, ces informations serviront pour toutes les validations dans Git.

> git config --global user.name "Prénom Nom"
> git config --global user.email foo@example.com

Astuce : pour obtenir de l’aide sur une commande :

> git help

Pour commencer à travailler avec Git vous avez deux solutions :

  • Vous avez un projet que vous voulez suivre avec Git ou vous commencez un nouveau projet. Vous devez créer un nouveau dépôt.
  • Vous voulez récupérer un projet existant qui utilise Git, dans ce cas vous clonez le dépôt.

Créer un dépôt

Si vous voulez inclure un projet dans Git, positionnez vous le répertoire du projet et saisissez:

> git init

Cela va créer un sous répertoire .git qui va contenir tous les fichiers nécessaires à Git. Votre projet est maintenant suivi par Git.

Cloné un dépôt

Si vous voulez obtenir une copie d’un dépôt Git, utilisez la commande git clone . Le code source sera télécharger ainsi que tout sont historiques.

Prenons exemple avec le projet Node.js, si nous voulons une copie du projet, il nous suffit d’aller sur la page GitHub du projet Node.js et de récupérer l’adresse du dépôt:

> git clone https://github.com/joyent/node.git

Cela créé un répertoire node avec le code source du projet et tout son historique.

Vous pouvez également spécifier le nom que prendra le répertoire de cette façon:

> git clone https://github.com/joyent/node.git maCopieNodeJs

Visualiser vos modifications et validation

Vous avez maintenant un dépôt en local, vous allez-y apporter vos modifications et enregistrer avec Git quand votre travail est concluant.

Les fichiers suivis par Git peuvent avoir quatre statuts : non suivi, inchangée, modifier, indexer.

git-schématCicleDeVieFichier

Si vous ajoutez un nouveau fichier il aura pour statut non suivi. Lorsque vous faites une modification sur un fichier, Git va le considérer comme modifier. Vous devez indexer les fichiers que vous avez modifiés si vous voulez qu’ils soient pris en compte lorsque vous ferez un enregistrement avec Git (on parle aussi d’instantané Git).

De même quand vous ajoutez un nouveau fichier vous devez l’ajouter dans Git pour qu’il soit pris en compte au prochain instantané Git.

Vérifier l’état des fichiers

Pour visualiser les statuts des fichiers dans Git, utilisez la commande git status.

Exemple, si vous venez de créer un dépôt vide ou de cloner un dépôt vous devrez voir ceci :

> git status
# On branch master
nothing to commit (working directory clean)

Ce message vous informe qu’aucun fichier a été modifié (nothing to commit).

Maintenant supposant que l’on ajoute un fichier README à notre nouveau projet, la commande git status nous donne :

> git status
# On branch master
# Untracked files:
#   (use "git add ..." to include in what will be committed)
#
#   README 
nothing added to commit but untracked files present (use "git add" to track)

Git a détecté un nouveau fichier non suivi (untracked file). Vous remarquez que Git est très verbeux.

Ajouter un fichier au suivi de version

La commande pour ajouter un fichier au suivi de version Git est git add. Pour ajouter le fichier README au suivi de version faite comme ceci :

> git add README

Si vous faites un nouveau git status vous verrez que le fichier est maintenant suivi et indexé :

> git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD ..." to unstage)
#
#   new file:   README
#

La section Changes to be committed nous indique les fichiers indexés prêts pour une instantané Git.

Indexer un fichier modifié

Supposant que nous modifions un fichier app.js qui est sous contrôle de version. Si nous fessant un git status nous obtenons :

> git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD ..." to unstage)
#
#   new file:   README
#
# Changes not staged for commit:
#   (use "git add ..." to update what will be committed)
#
#   modified:   app.js
#

Le fichier app.js apparaît sous la section nommée Changes not staged for commit ce qui nous indique que le fichier sous suivi de version a été modifié et qu’il n’est pas indexé.

Pour indexer le fichier il faut utiliser la commande git add :

> git add app.js
> git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD ..." to unstage)
#
#   new file:   README
#   modified:   app.js
#

Nous avons maintenant deux fichiers indexer prêts pour une validation (commit).

Valider vos modifications

Pour valider vos modifications il faut que les fichiers soient indexé (Changes to be committed). Une fois indexé il suffit de saisir la commande git commit:

> git commit

Cela va ouvrir l’éditeur par défaut (qui est paramétrable via git config –global core.editor). Entrer votre message de commit, ce message doit décrire les modifications apporter de façon claire et concis. Une fois enregistrée, git va créer un commit avec le message que vous venez de rentrer. Le commit a enregistré une instantané de toutes les modifications indexé.

Astuce : vous pouvez également faire un git commit -m suivi de votre message de commit.

Effacer des fichiers

Si vous supprimez un fichier, vous devez le sortir du suivi de version. Prenons l’exemple avec la suppression d’un fichier foo.js. Si on fait un git status, nous obtenons :

> rm foo.js
> git status
# On branch master
#
# Changes not staged for commit:
#   (use "git add/rm ..." to update what will be committed)
#
#       deleted:    foo.js
#

Pour indexé la suppression du fichier pour le prochain commit il faut utiliser la commande git rm:

> git rm foo.js
rm foo.js
> git status
# On branch master
#
# Changes to be committed:
#   (use "git reset HEAD ..." to unstage)
#
#       deleted:    foo.js
#

Le fichier foo.js sera maintenant supprimé du suivi de version au prochain commit.

Annuler une action

Modifier le dernier commit

Vous avez oublié d’inclure un fichier dans votre commit, ou vous êtes trompé dans le message de commit. Vous avez la possibilité de rectifier cela avec la commande git commit –amend. Exemple:

> git commit -m 'validation initiale'
> git add fichier_oublie
> git commit --amend

Annuler le dernier commit

Pour annuler un commit vous avez la commande git reset. Exemple si vous voulez annuler le dernier commit :

> git reset HEAD^

HEAD indique le dernier commit, HEAD^ l’avant dernier.

Annuler le dernier commit (hard)

Si vous voulez annuler le dernier commit ainsi que tous les changements effectuer sur les fichiers, vous devez faire un git reset hard :

> git reset --hard HEAD^

Attention cela annulera sans confirmation tout votre travail jusqu’au avant dernier commit.

Annuler la modification d’un fichier avant un commit

Vous ne souhaitez pas conserver les modifications d’un fichier. Pour le ramener à son état du dernier commit, utiliser la commande git checkout :

> git checkout -- foo.js

Annuler l’indexation d’un fichier

Vous voulez annuler une indexation (git add) d’un fichier pour qu’il ne soit pas enregistré au prochain commit. Vous pouvez annuler l’indexation d’un fichier avec la commande git reset :

> git reset HEAD nonDuFichier

Travailler avec un dépôt distant

Le mieux pour travailler de façon collaborative sur un projet avec Git, c’est d’utiliser un dépôt distant. Un dépôt distant est héberger sur un serveur avec différent droit (lecture seule, lecture écriture). Il permet de partager son travail en poussant son travail sur le dépôt (push) et de tirer les données du dépôt (pull).

Récupérer les nouveauté d’un dépôt distant (pull)

Pour récupérer les nouveauté d’un dépôt distant et les fusionnés à votre dépôt local, utilisez la commande git pull:

> git pull

Pousser son travail sur un dépôt distant (push)

Pour envoyer votre travail sur le dépôt distant, utiliser la commande git push [nom-distant] [nom-de-branche]. Exemple :

> git push origin master

Info : quand vous clonez un dépôt, git nome par défaut le dépôt origin et la branche master.

Si quelqu’un d’autre a poussé ces modifications avant les vôtres, vous devez d’abord tiré ces modifications pour ensuite pousser, sinon votre tentative de push sera rejetée.

Travailler avec des branches

Les branches font partie de la force de Git, elles sont très simples à mettre en place et se fait de façon instantané. Les branches sont utilisées pour toutes modifications à effectuer sans perturbé de la branche principale. Exemple, la mise en place de nouvelles fonctionnalités, correctif…

Créer une branche

Imaginons que vous voulez travailler sur une nouvelle fonctionnalité sans impacté la branche principale. Pour cela vous devez créer une nouvelle branche :

> git branch maNouvelleFonctionnalité

Cela a pour effet de créer une copie virtuelle de la branche principale nommé maNouvelleFonctionnalité.

Si vous listez vos branches local avec la commande git branch vous devriez avoir ceci :

> git branch 
* master
  maNouvelleFonctionnalité

On peut voir qu’il y a deux branches la master (principale) et notre nouvelle branche. L’étoile (*) indique sur quelle branche on se trouve. Pour changer de branche, utilisez la commande git checkout :

> git checkout maNouvelleFonctionnalité
Switched to branch "maNouvelleFonctionnalité"

Nous nous trouvons maintenant sur notre nouvelle branche, prêt à travailler.

Fusionner une branche

Supposons que vous venez de finir votre travail et que vous voulez apporter vos modifications sur la branche principale. Vous devez vous placer sur la branche master et utiliser la commande git merge :

> git checkout master
> git merge maNouvelleFonctionnalité
Merge made by recursive.
 Foo.js |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)

Git va créer un commit de fusion et gérer les conflits mineurs automatiquement.

Supprimer une branche

Une fois la branche fusionné, vous n’en avez plus besoin et vous voulez la supprimer. Saisissez la commande git branche avec l’option d :

> git branch -d maNouvelleFonctionnalité

Si voulez supprimer une branche qui n’a subi aucune fusion Git va refuser par protection (pour éviter la perte de votre travail). Si vous voulez vraiment supprimer votre branche, utilisez l’option D :

 > git branch -D maNouvelleFonctionnalité

Conflit de fusion

Il se peut que Git ne peut gérer automatiquement un conflit de fusion (merge). Dans ce cas vous obtiendrez quelque chose qui ressemble à ça :

> git merge maNouvelleFonctionnalité
Auto-merging foo.js
CONFLICT (content): Merge conflict in foo.js
Automatic merge failed; fix conflicts and then commit the result.

Dans ce cas Git arrête le processus de fusion pour que vous régliez le problème. Vous pouvez faire un git status pour voir le fichier incriminé :

> git status
foo.js: needs merge
# On branch master
# Changes not staged for commit:
#   (use "git add ..." to update what will be committed)
#   (use "git checkout -- ..." to discard changes in working directory)
#
#   unmerged:   foo.js
#

Tous les conflits non résolu par Git sont préfixe par unmerged.

Pour résoudre un conflit le mieux est d’utiliser un logiciel de comparaison comme KDIFF (que nous avons installé). Pour se faire saisissez la commande git mergetool :

> git mergetool
Merging the files: 
foo.js

Normal merge conflict for 'foo.js':
  {local}: modified
  {remote}: modified
Hit return to start merge resolution tool (kdiff3):

Une fois le conflit résolu, enregistrer et fermer l’outil de comparaison. Le fichier sera indexé pour être validé (commit). Une fois tous les conflits résolus faite un git commit, vous aurez un message de validation par défaut:

Merge branch 'maNouvelleFonctionnalité'

Conflicts:
  foo.js
#
# It looks like you may be committing a MERGE.
# If this is not correct, please remove the file
# .git/MERGE_HEAD
# and try again.
#

Branche distante

De même que la branche master, vous pouvez travailler avec des branches distantes. Pour listé les branches distantes utilisez la commande git branche avec l’option -r :

> git branch -r
  origin/HEAD
  origin/master

Nous pouvons voir que sur notre dépôt (orign par défaut) nous avons deux branches, master (la principal) et HEAD (une branche particulière de Git).

Récupérer une branche distante

Imaginons que le serveur possède une branche feature42 que l’on souhaite récupérer pour pouvoir travailler dessus. Pour se faire utiliser la commander git branch –track brancheLocale origin/brancheServeur :

> git branch --track feature42 origin/feature42

Ajouter une branche distante

Si vous voulez ajouter votre branche local sur le serveur pour pouvoir travail à plusieurs par exemple. Vous devez pousser votre branche sur le dépôt avec git push :

> git push origin maBranche
Counting objects: 42, done.
Compressing objects: 100% (14/14), done.
Writing objects: 100% (15/15), 1.51 KiB, done.
Total 15 (delta 5), reused 0 (delta 0)
To git@github.com:damienp/exemplegit.git
 * [new branch]      maBranche-> maBranche

Supprimer une branche distante

Vous avez fusionné la branche avec la master et vous voulez maintenant la supprimer.
Saisissez :

$ git push origin :maBranch
To git@github.com:damienp/exemplegit.git
 - [deleted]         correctionserveur

Je vous l’accorde la syntaxe n’est pas très claire.

Ignorer des fichiers

Certain fichier n’ont pas à être sous suivie de version, comme les fichiers de cache ou de log. Pour demander à Git d’ignorer ces fichiers, il faut créer un fichier nommé .gitignore à la racine de votre projet qui va contenir tous les noms des fichiers, dossiers et patterns à ignorer. Exemple d’un .gitignore :

> cat .gitignore
*.log
/cache/*

Ici on ignore tous les fichier avec l’extension .log et tout le contenu du dossier cache.

Résumé

Je vous ai montré comment installé Git et son utilisation de base avec les dépôts et les branches. Je vous ai fait utiliser la console pour manipuler Git, car c’est le meilleur moyen d’exploiter toute la puissance et de comprendre le fonctionnement de Git. De plus Git est claire et très verbeux. Sachez n’est en moins qu’il existe des interfaces graphiques pour utiliser Git comme l’interface Git Extension sur Windows ou GitG sur Linux et la plupart des IDEs intègres des fonctionnalités pour utiliser Git.

2 réflexions au sujet de « [Tuto] Découverte de GIT »

  1. Ping : [Tuto] Déployer gratuitement votre application Node.js avec OpenShift | Webiose

Laisser un commentaire