Les Carnets de Byfeel domotique , Objets connectés , DIY , Programmation, Nouvelles Technologies ….

Utilisation de Git et Github

Le but de cette presentation , n’est pas un ultime tuto de plus sur Git ou Github , il en existe plein sur Internet. Le but est de réaliser une documentation simple à lire , afin de retrouver rapidement la bonne commande et les bonnes infos pour utiliser l’outil Git.

Avant de commencer , il faut rappeler que Git est un logiciel de versionning qui s’installe en local sur votre Ordinateur de travail , et Github un espace de stockage en ligne optimisé pour le logiciel Git. Il est tout a fait possible de n’utiliser que Git.

C’est un outil que j’utilise depuis peu , et chaque jour , j’y trouve un grand intérêt , pour tous ceux , qui sont amenés à écrire du code , ou des documentations , sur lesquels le versionning ou le travail collaboratif est important.

Commençons par Git

Comment l’installer ?

Il faut aller télécharger l’application selon votre systéme , Mac , windows ou linux à l’adresse suivante :

https://git-scm.com/downloads

L’outil Git est un outil en ligne de commande , bien qu’il existe des outils graphiques permettant d’utiliser les commandes Git , il vaut mieux dans un premier temps bien maitriser les différentes options de Git.

Comment le configurer ?

Lors de la premiere installation , il faut configurer votre identité , qui sera utilisé pour aller sur github plus tard.
git config –global user.name « Monsieur X »
git config –global user.email MrX@example.fr

vous pouvez verifier à tous moments la config de git en tapant la commande :
git config –list

Vous pouvez laisser les autres valeurs par défaut , pour l’instant.

Comment l’utiliser ?

Je commence par créer un répertoire de travail . Vous pouvez utiliser la méthode que vous voulez. Une fois ce dossier créé , j’ouvre mon invite de commande ( ou mon terminal ) et je me déplace dans mon dossier de travail.
cd testlocal

Ce répertoire est pour l’instant vide , je vais indiquer à Git , que ce dossier utilisera le technologie git avec la commande :
git init

créer un premier fichier , par exemple fichierpagetest.txt , et une premiere ligne de texte. Vous pouvez contrôler à tous moments les fichiers qui ont été modifié , avec la commande :

git status

On branch master

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)

	fichierpagetest.txt

nothing added to commit but untracked files present (use "git add" to track)

cette commande indique qu’elle à détecté un nouveau fichier , et que celui ci n’est pas surveillé par git , pour le rajouter il faut utiliser la commande : git add fichierpagtest.txt ,une fois ajouté , vous pouvez relancer un git status et vous obtiendrez l’info suivante :

On branch master

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

	new file:   fichierpagetest.txt

Cette fois ci cela signifie , que le fichier est bien pris en compte , il y a un nouveau fichier à inscrire . Pour cela git , vous demande de réaliser un commit , le commit permet à git de mettre en place un point de contrôle ( un instantané ) , qui nous permettra de revenir à cet état en cas d’erreur ou pour tout autre raison. J’enregistre donc mon premier commit avec la commande :

git commit -m « mon premier commit – point de sauvegarde « 

Si on refait un git status , git nous informe que tout est ok , avec la commande git log , on retrouve l’historique de nos commit.

git log
commit e1de2969fe8217d455ac8bfd1db1b21745817c0d (HEAD -> master)
Author: byfeel <contact@byfeel.info>
Date:   Sun Jan 13 05:37:23 2019 +0100

    mon premier commit - point de sauvegarde

Je décide de modifier mon fichier , en lui ajoutant une deuxième ligne , et je sauvegarde . Je verifie l’etat du dossier par un git status , qui m’indique que mon fichier à été modifié .

On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

	modified:   fichierpagetest.txt

no changes added to commit (use "git add" and/or "git commit -a")

Si je désire , à nouveau sauvegarder ce point , il me faut de nouveau ajouter ce fichier avec la commande git add fichierpagetest.txt puis le commande git commit -m « ma deuxieme ligne » , ou pour eviter de taper les deux commandes , il est possible d’ajouter l’option -a à la commande commit afin d’ajouter automatiquement les fichiers qui ont été déjà indexer une fois.
git commit -a -m « ma deuxieme ligne »

Si j’effectue à nouveau un git log , j’obtiens les infos suivante :

[master 3b0bead] ma deuxieme ligne
 1 file changed, 0 insertions(+), 0 deletions(-)
git log
commit 3b0beada68241027aa6941b6a5929db955aa29d8 (HEAD -> master)
Author: byfeel <contact@byfeel.info>
Date:   Sun Jan 13 06:08:35 2019 +0100

    ma deuxieme ligne

commit e1de2969fe8217d455ac8bfd1db1b21745817c0d
Author: byfeel <contact@byfeel.info>
Date:   Sun Jan 13 05:37:23 2019 +0100

    mon premier commit - point de sauvegarde

J’ai bien mes deux versions de sauvegardé.

Il est possible de voir un aperçu des modifications , avec l’ancienne version en executant la commande :

git diff

Comprendre l’historique ?

Pour visualiser toutes les versions enregistrés , il faut executer la commande : git log , si je reprend mon exemple précédent j’obtiens :

[master 3b0bead] ma deuxieme ligne
 1 file changed, 0 insertions(+), 0 deletions(-)
git log
commit 3b0beada68241027aa6941b6a5929db955aa29d8 (HEAD -> master)
Author: byfeel <contact@byfeel.info>
Date:   Sun Jan 13 06:08:35 2019 +0100

    ma deuxieme ligne

commit e1de2969fe8217d455ac8bfd1db1b21745817c0d
Author: byfeel <contact@byfeel.info>
Date:   Sun Jan 13 05:37:23 2019 +0100

    mon premier commit - point de sauvegarde

Afin d’avoir plus de détail sur la version , j’utilise la commande : git show suivi du code de hashage ( rassurez vous , il n’y a pas besoin de tous taper les premiers caractère suffisent ).

git show 3b0be

Pour basculer à l’ancienne version , il suffit d’utiliser la commande checkout

git checkout e1de

la dernière version n’est pas supprimé et il est possible de revenir via : git checkout master , qui est la branche initial.

… et les branches ?

git permet de créer autant de branche que l’on souhaite , ces derniéres sont des copies à un instant T . Par exemple , j’ai ma branche Stable (master ) , et je souhaite créer une branche sur laquelle je teste mes nouvelles fonctionnalité .J’identifie cette nouvelle branche par le nom beta ou develop , par exemple. Pour créer cette derniére , il suffit de taper la commande suivante : git branch « nom de la branche »

git branch develop

la commande aura pour effet de créer une branche develop ( qui sera la copie de la branche master à l’instant t ) . Pour se deplacer sur cette branche , afin d’apporter les modifications , sans toucher au code de la branche master , il suffit d’utiliser la commande checkout , vu précédemment.

git checkout develop

A partir de ce momment , toutes les modifications effectués se feront sur la branche develop . La branche master , elle restera inchangé .
Une commande checkout avec l’option b, permet de créer une nouvelle branche et se déplacer directement dedans .

git checkout -b develop

Une fois mes modifications effectués , il sera possible de refusionner la branche develop avec la branche master , afin d’apporter les derniéres nouveautés stables. Pour cela j’utilise la commande merge .

git checkout master
git merge develop

Updating db00a80..a71990a
Fast-forward
 test.txt | 2 ++
 1 file changed, 2 insertions(+)

je viens de fusionner le contenu de ma branch develop dans ma branch master . A ce nomment les deux branches sont positionnés sur HEAD. ( git log ).

Les Tags ou étiquettes

les tags , donne la possibilité d’étiqueter un certain état dans l’historique comme important.Par exemple le numéro d’une version , afin de la retrouver facilement.

Pour lister les tags existants : git tag
Pour lister tous les tags correspondant à la version 2 :

git tag -l 'v2*'

Pour créer une etiquette ( ou tag )

git tag -a v1.2.3 -m 'ma version 1.2.3'

et Github ?

Github est un service gratuit en ligne , qui vous permet d’heberger vos fichiers . Pour créer un compte , il suffit de s’enregistrer sur le site .

Github , permet de s’inscrire gratuitement ( utiliser la même adresse que git , afin de facilier les echanges entre votre git et github ). La première étape est de créer un repository ( dossier ) .

Une fois créé , il sera possible soit de cloner ce dossier pour une nouvelle installation , soit de pousser notre dossier dans ce remote ( dossier distant sur github par exemple ).

Pour ajouter un remote , il faut utiliser la comande remote : git remote add origin « url du remote »

git remote add origin https://github.com/byfeel/test.git
// puis pour synchro des deux dossiers
git push -u origin master

ou pour cloner le dossier remote ( sur Github ) dans un de nos dossier local . Se déplacer dans le dossier souhaité , puis taper la commande git clone .

git clone https://github.com/byfeel/test.git

Pour pousser les etiquettes sur github :

git push origin --tags

Pour plus d’info sur git , la documentation en ligne sur le site de git est en français et aussi très bien expliqué.

Git Book en français

Reset ou checkout ?

Pour bien comprendre , la difference entre ses deux fonctionnalité , il faut bien comprendre comment fonctionne git. Il faut imaginer Git , travaillant sur 3 endroits différents .

  • le Head : Qui est le dernier instantanée pris
  • l’Index : dans lequel sont stocké les fichiers en attentes d’enregistrement dans l’index
  • le Repertoire de travail : qui sont les fichiers sur lesquels on travaille

Dans l’ordre , quand on créé un nouveau fichier , il est d’abord déposer dans le repertoire de travail . on va pouvoir le modifier , puis l’enregistrer . Pour le preparer à l’enregistrement on va l’indexer par la commande git add « nomdufichier » . Et enfin créé un instantanée avec la commande commit.

La commande reset , à trois niveau d’effacement . ( Soft , mixed et hard ) . Soft , efface dans le HEAD , Mixed efface dans le Head plus l’index et HARD dans les trois ( avec suppression de le répertoire de travail ) .Le paramètre par défaut est mixed. Si j’execute la commande : git reset hashdeinstanntannée , je réalise un effacement du Head et de l’index . Le repertoire de travail n’est pas touché.

l’option –hard , est une commande qui peut être dangereuse , car elle sera en mesure d’effacer réellement vos fichier.Dans quel cas l’utiliser , par exemple pour remettra à plat une copie de travail , qui ne correspondrait plus au divers commit.

git reset --hard origin/master

Attention, cette dernière commande n’est pas réversible et va mettre à plat votre copie de travail pour qu’elle soit l’exacte copie du dernier commit de votre historique.

Supprimer une branche .

Ci dessous quelques commandes utiles pour supprimer une branche , distante ou locale . Je pars dans l »hypothèse suivante : nom du remote : origin , nom de la branc : test

## Effacer une branche distante
$ git push origin --delete test # Git version 1.7.0 minimum
$ git push origin :test # Git versions inferieur 1.7.0

## Effacer branch locale
$ git branch --delete test
$ git branch -d test # version courte
$ git branch -D test # Force la suppression

## Efface une branch local et distante
$ git branch --delete --remotes origin/test
$ git branch -dr origin/test  # version courte
$ git fetch origin --prune # Efface toutes les branches qui ne sont plus suivis 
$ git fetch origin -p # version courte de prune

Récupération ou effacer , Quel commande pour quel cas ?

Dans la pratique : Je souhaites récupérer un fichier dans son état précédent . Deux cas de figure se présente , le fichier est dans l’index ou le fichier est dans le head ? Comment le savoir ? par la commande git status .Qui vous indiquera quel commande utilisé pour restaurer le fichier.

exemple :

 git status
On branch master
Your branch and 'origin/master' have diverged,
and have 1 and 3 different commits each, respectively.
  (use "git pull" to merge the remote branch into yours)

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

	modified:   test.txt

ici il faudra utiliser la commande : git reset HEAD test.txt , pour defaire la commande git add ( qui prépare au commit ) . puis par git status on obtient :

git status
On branch master
Your branch and 'origin/master' have diverged,
and have 1 and 3 different commits each, respectively.
  (use "git pull" to merge the remote branch into yours)

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

	modified:   test.txt

no changes added to commit (use "git add" and/or "git commit -a")

Maintenant « status » , nous indique que pour effacer les changements apportés dans le dossier de travail , il est possible d’utiliser la commande checkout suivi du nom de fichier , ce qui donne :

git checkout test.txt

avec un git status , le fichier n’est plus visible dans l’index. Et si j’ouvre ce fichier , la derniére modification à bien disparu.

Si le fichier , n’est plus visible dans get status , l’instantanée à déjà été créé. Il va falloir revenir à la version précédente avant le commit. en utilisant la commande git log

git log
commit a71990aa29bcae3c9b133e9d6b629b34f7d23c6a (HEAD -> master, develop)
Author: byfeel <infobyfeel@gmail.com>
Date:   Wed Jun 12 14:03:33 2019 +0200

    beta

commit db00a80c1dffa0ff29dc23ac49a58596e65ed9a8
Author: byfeel <infobyfeel@gmail.com>
Date:   Wed Jun 12 10:13:04 2019 +0200

    commit sauf test.txt

commit 05f361c0bc2cac2dc8a2330dedb380eb826460ed
Author: byfeel <infobyfeel@gmail.com>
Date:   Tue Jun 11 15:48:46 2019 +0200

    Premiere sauvegarde

je récupère le hash de la version précédente.

git reset db00
git status

On branch master
Your branch and 'origin/master' have diverged,
and have 1 and 3 different commits each, respectively.
  (use "git pull" to merge the remote branch into yours)

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

	modified:   test.txt

no changes added to commit (use "git add" and/or "git commit -a")

je retrouve la possibilité de récupérer mon fichier avec la commande git checkout test.txt

Astuce
Pour effacer plusieurs commit , indésirable comme ( oups , test , essai , un nouvel essai , etc ….. ) , il est simple d’utiliser la commande suivante : git reset –soft 05f36 (hash de l’instantanée ). Auras pour but d’effacer tous les messages de commit , de repositionner le HEAD , sur l’index 05f36 et de conserver tous les fichiers dans le repertoire de travail.

En conclusion …

toujours effectuer un git status , avant toute commande , afin de savoir ce qu’il est possible de faire.J’ai volontairement , zappé beaucoup d’autres commandes , pour ne pas avoir une page qui soit trop longue.

Je vous invite , a lire la documentation en ligne de git , qui vous apportera , surement la réponse que vous attendez.