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
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...
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.

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...