Git

& Tools

à Médiamétrie



Choix d'un outil

pour Médiamétrie

Historique Médiamétrie

  •  DSI Levallois : Svn (+ CVS ?)
  • DSI Sophia : Hg + CVS
  • DDSM : CVS + SVN

Pourquoi GIT ?

1. sondage de compétences auprès des développeurs

2. étude comparative des outils auprès des tech leads
( sur base de facteurs pondérés)

3. Git est devenu le nouveau standard : choix sûr et up-to-date

Pourquoi Gitlab ?

Outil OpenSource proche de GitHub
s'est détaché de ses concurrents en terme :
  • de fonctionnalités
      • code review
      • charts / branch tree
      • wall, feed RSS
  • d'interface graphique
  • d'outils administration
  • de communauté

Bon challenger des outils SaaS du marché...
... mais gratuit, OpenSource et en constante évolution !



Git dans

l'Histoire

Outils de gestion de version

Git, c'est quoi ?

Outil OpenSource de gestion
de versions de sources

Crée par Linus Torvalds en 2005
pour gérer le versionning du Kernel Linux

Distribué sous license GNU GPL V2

Git est un DVCS : 'D' pour "Décentralisé"



Philosophie git


  • Rapidité
  • Complètement distribué
  • Minimaliste
  • Support des développements
    non linéaires (basé sur des branches)

  • Repense la manière de stocker les informations
  • Basé sur des sommes de contrôle SHA-1

Migrer sous git ?

depuis Mercurial : concepts similaires
depuis CVS / SVN : nouveau concept de repository local

  • quelques nouveaux concepts
  • nouvelle manière de travailler
  • un peu de vocabulaire à apprivoiser
  • 1 repository = 1 projet




Passage aux dvcs

VCS          vs          DVCS

{DISTRIBUTED} VERSION CONTROL SYSTEM

VCS 

copie locale des fichiers du dépôt distant

DVCS

copie locale (complète) du dépôt distant

On ne récupère plus "fichier par fichier" !

Distribué


chaque développeur a une copie complète du repository de source, c'est à dire toutes les révisions, branches, tags etc... 
Possibilité de récupérer un repo de développeur en cas de crash ou corruption du serveur central.

Travail offline


Tout l'historique sur le poste local :

  • possibilité de travailler en déconnecté
      • pratique si coupure réseau par exemple...
  • parcours de l'historique immédiat
  • switch de branche immédiat également


Rapide car tout est en local...
et encore plus rapide grâce au stockage des fichiers.... 

Modèles de stockage des fichiers

VCS - Deltas
DVCS - fichiers complets

Petit & rapide

init benchmarks init benchmarks init benchmarks init benchmarks init benchmarks init benchmarks
init benchmarks init benchmarks  init benchmarks  init benchmarks init benchmarks  init benchmarks

Structure des commits



Avantages & inconvénients

VCS

+ Facilité d’administration
- Point unique de panne (SPOF)
- Perte de travail en cas de corruption
- Suppression/écrasement de fichiers par inadvertance

DVCS

+ Possibilité de travailler sans connexion
+ Restauration facilitée
+ Possibilité de collaborer sans passer par le dépôt central
...quelques désavantages malgré tout...



Les concepts

de base

Vocabulaire & concepts

SVN

checkout
commit
update
working copy
SVN server




GIT

clone / checkout
add / commit / push
fetch / merge / rebase
local repository/branch
remote repository/branch

staging area


  • Git possède une Staging Area ou Index. C'est un état intermédiaire dans lequel les commits peuvent être formattés, retravaillés, revus avant de les finaliser.
    Vocabulaire : Add to Index / Staged files

  • Le commit effectue bien un commit, mais sur le repository local.

  • Le Push poussera les commits du repository local vers le distant. Sans envoyer les éventuelles modifications du working directory ou de la staging area.

Etats d'un fichier dans git


Validated


Indexed
(Staged)


Untracked
Modified
Unmodified

Reset

Git reset depuis un commit nommé

  • mixed est possible sur un fichier donné
  • sinon utiliser Checkout pour un reset --hard par fichier

PUSH / PULL

PULL

Rapatrie les modifications de la branche destination sur la branche courante. Peut donner lieu à une fusion avec la branche courante (merge ou rebase selon stratégie choisie)

PUSH

Envoie les modifications (de la branche courante) sur la branche de distante.

Fetch

Se met au courant de l'état de la branche distante




Démo




git init
git status
git add/stage file
git rm file
git commit [-a -m --amend]
git blame file
git reset
git checkout
git push
git pull




Branches &

concepts avancés

Branches locales

Git permet et encourage à avoir de multiples branches locales, chacune indépendante les unes des autres.


Switching de contexte sans effort - créez une branche pour tester des nouvelles idées, faites quelques commits, puis reprenez votre travail depuis l'endroit ou vous aviez branché.

Experimentation jetables - créez une branche pour expérimenter quelques travaux... et si vous réalisez que ça ne fonctionnera pas, et supprimez simplement cette branche !

Workflow par Features - créez  une branche pour chaque nouvelle feature sur laquelle vous travaillez, vous pourrez ensuite passer facilement des unes aux autres, puis les supprimer après les avoir mergées sur le tronc commun .

Branches distantes

Git permet de pousser les branches locales
sur le serveur central distant.



Workflow par Features - poussez votre branche locale sur le repository distant pour contribuer à plusieurs sur une même feature.

Projets collaboratif - créez votre branche, faites vos développement, puis poussez la branche sur le repository distant. Puis soumettez l'a branche à validation par la personne responsable du projet collaboratif : idéal dans le monde OpenSource, mais aussi pour les librairies communes!

Hot-Fix simplifié repartez du tag de la version en prod pour en faire une branche, fixez le bug (éventuellement récupérer le fix déjà développé et poussé sur le tronc commun à l'aide du Cherry Picking), puis poussez/buildez/releasez cette nouvelle branche.

Jenkins de la nouvelle UL simplifie le processus de build  & release depuis une branche

Stashing & Cherry Picking

Stash

Mettre de côté toutes les modifications de la copie de travail
et de l’index, pour pouvoir les réappliquer plus tard
Utile par exemple pour mettre en pause le dev d'une feature
 et le déplacer sur une branche dédiée

Cherry Picking

Permet de sélectionner un commit quelconque
et de l’appliquer sur la branche actuelle
Utile par exemple pour réaliser un HotFix et l'appliquer sur une branche de Production (par exemple dans le cadre du workflow Git-Flow)

Merge

Merge automatique quand pas de conflits
(Il est même possible de merger depuis l'interface GitLab)

Plusieurs stratégies et outils pour résoudre les conflits
Merge VS Rebase

En mode build par branches, Jenkins de la nouvelle UL peut même automatiquement merger 

Stratégie merge

Stratégie par défaut.
Merge de la branche distante dans la branche locale (master). 

Si conflits au merge :
1. tous les fichiers sans conflits sont ajoutés à l'index
2. résolution des fichiers en conflits puis ajout à l'index
3. crée un commit de merge


Stratégie Rebase

Merge de la branche distante dans la branche locale (master). 
Si n'est pas la stratégie de Pull par défaut, nécessite un Fetch.

Les commit du master sont supprimés et réappliqués à la suite des commits de la branche distante.

L'historique est linéaire, similaire à l'utilisation d'un VCS.




Démo



Travailler

avec Git

Intégration Jenkins


  • les Webhooks
    par exemple pour builder avec le meilleur timing
    possible 
    (lancement du build au commit)

  •  Gestion des notifications
    Jenkins ne notifie que la personne en cause lors
    d'un pb de compilation par exemple.
    Le spam c'est fini!

Et bien d'autres intégrations avec Jenkins
et d'autres outils...

Workflows

Git permet la mise en place de Workflow
de développement spécifiques pour
améliorer l'organisation du travail en équipe

Pour l'instant nous utilisons le Centralized Workflow, qui se rapproche de l'utilisation en mode VCS.

Le plus connu des workflow est Git-Flow, qui peut être un objectif pour les équipes qui veulent tenter l'expérience.

D'autres Workflows : Integration-Manager, Dictator and Lieutenants, Feature Branch, Forking, Unbreakable Build...

bémols

Oui Git c'est compliqué !

...mais c'est bien outillé, rapide, puissant...
une fois qu'on maîtrise les bases !
(et a-t'on besoin de ces fonctionnalités ? ...)

Feature Branches ou Workflows avancés

Travailler en feature branches est concrètement complexe à mettre en place avec un build continu et du multi-projets (Jenkins, artefacts SNAPSHOT branchés, etc...)
Idem pour tentative de mise en place du Build Incassable...




OUTILS

outillage

  • Git Bash (ligne de commande)

    simple et efficace, maîtrise parfaite des options
    utile en cas de "coup dur" 

  • Plugin EGit pour Eclipse

    fournit la grande majorité des fonctionnalités,
    se substitue volontiers au Git Bash

  • autre outils :

    Github, TortoiseGit, GitEye, SourceTree, git-cola...
    (cf: http://git-scm.com/downloads/guis)

GITLAB

sur la Nouvelle UL : http://scm.ul.mediametrie.fr/

GITLAB

Exploration de fichiers, création, modification, suppression...
...et commit.

GITLAB

Graphique de branches, de commits, "blame", statistiques, etc...

Guides M&O




Récupérer le Kepler configuré Médiamétrie
https://mediametrie.atlassian.net/wiki/x/Q4IrAg

Comment configurer Eclipse et déposer sa clé SSH ?
https://mediametrie.atlassian.net/wiki/x/C4P-AQ




Démo GitLab

Bibliographie

Git Book "ProGit"
http://git-scm.com/book/fr
Blog Octo
http://blog.octo.com/git-dans-la-pratique-12/
Réécrire l'histoire avec Git, pratique avancée :
http://justinhileman.info/article/git-pretty/
Merge ou Rebase ?
http://www.git-attitude.fr/2014/05/04/bien-utiliser-git-merge-et-rebase/
Pratiques avancées de Git Bash
https://ochronus.com/git-tips-from-the-trenches/
Workflows
https://www.atlassian.com/fr/git/workflows 
et http://nicoespeon.com/fr/2013/08/quel-git-workflow-pour-mon-projet/

Atelier git

Inscriptions à la sortie de cette session
Levallois : 12 places par session
jeudi 10 juillet 16h-18h
vendredi 11 juillet 13h30-15h30

Inscription sur le tableau blanc
à la fin de la session...




Q&R ?

Made with Slides.com