diff --git a/images/git_centralized_workflow.svg b/images/git_centralized_workflow.svg new file mode 100644 index 0000000..976cbcc --- /dev/null +++ b/images/git_centralized_workflow.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/images/git_centralized_workflow_conflit.svg b/images/git_centralized_workflow_conflit.svg new file mode 100644 index 0000000..cc19270 --- /dev/null +++ b/images/git_centralized_workflow_conflit.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/images/git_flow.svg b/images/git_flow.svg new file mode 100644 index 0000000..7774eed --- /dev/null +++ b/images/git_flow.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/images/git_flow_features.svg b/images/git_flow_features.svg new file mode 100644 index 0000000..c9c66b8 --- /dev/null +++ b/images/git_flow_features.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/images/git_flow_master_dev.svg b/images/git_flow_master_dev.svg new file mode 100644 index 0000000..c347b4d --- /dev/null +++ b/images/git_flow_master_dev.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/images/git_flow_release.svg b/images/git_flow_release.svg new file mode 100644 index 0000000..640f80a --- /dev/null +++ b/images/git_flow_release.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/images/git_forking_workflow.png b/images/git_forking_workflow.png new file mode 100644 index 0000000..a882182 Binary files /dev/null and b/images/git_forking_workflow.png differ diff --git a/images/lave_mains.jpeg b/images/lave_mains.jpeg new file mode 100644 index 0000000..cbe9573 Binary files /dev/null and b/images/lave_mains.jpeg differ diff --git a/index.html b/index.html index c6f67d3..23ef319 100644 --- a/index.html +++ b/index.html @@ -63,7 +63,8 @@ pre code { font-size: 14px !important; } - *[hidden]{ + + *[hidden] { opacity: 0 !important; } @@ -124,7 +125,7 @@ * Les concepts de Git * Les fonctions de bases * Travailler concrètement avec Git - * Pour aller plus loin + * Les workflows @@ -134,14 +135,17 @@

Kesako?

- Git a été créé par Linus Torvald (créateur de Linux) en avril 2005 pour proposer une alternative gratuite à BitKeeper. + Git a été créé par Linus Torvald (créateur de Linux) en avril 2005 pour proposer une + alternative gratuite à BitKeeper.

- C’est un gestionnaire de version décentralisé. Cette gestion décentralisée lui a valu son succès, notamment auprès de la communauté + C’est un gestionnaire de version décentralisé. Cette gestion décentralisée lui a valu + son succès, notamment auprès de la communauté du logiciel libre.

- Git a été pensé comme un système de fichier à part entière qui gère lui-même le versionnement de son arborescence (d’après + Git a été pensé comme un système de fichier à part entière qui gère lui-même le + versionnement de son arborescence (d’après Linus Torvald).

@@ -154,39 +158,49 @@

Décentralisé

- Git est un gestionnaire de version décentralisé. Chaque à contributeur possède donc localement un dépôt à part entière! + Git est un gestionnaire de version décentralisé. Chaque à contributeur possède donc + localement un dépôt à part entière!

- Chaque dépôt est totalement indépendant des autres. Les synchronisations entre dépôts sont à décider suivant vos méthodes + Chaque dépôt est totalement indépendant des autres. Les synchronisations entre dépôts sont + à décider suivant vos méthodes de travail.

-

Décentralisé

-

De manière générale, on travaille avec un dépôt central qui sert de maitre de la donnée. Ce dépôt est traditionellement appelé origin. Chacun des poste client récupére et synchronise ses sources avec origin.

-
+

Décentralisé

+

De manière générale, on travaille avec un dépôt central qui sert de + maitre de la donnée. Ce dépôt est traditionellement appelé origin. Chacun des poste + client récupére et synchronise ses sources avec origin.

+

La gestion de fichiers

-

Git indexe les fichiers d'après leur somme de contrôle calculée avec la fonction de hachage SHA-1. Quand - un fichier n'est pas modifié, la somme de contrôle ne change pas et le fichier n'est stocké qu'une - seule fois. En revanche, si le fichier est modifié, les deux versions sont stockées sur le disque.

+

Git indexe les fichiers d'après leur somme de contrôle calculée + avec la fonction de hachage SHA-1. Quand + un fichier n'est pas modifié, la somme de contrôle ne change pas et le fichier n'est stocké + qu'une + seule fois. En revanche, si le fichier est modifié, les deux versions sont stockées sur le + disque.

    -
  • Untracked: Le fichier n’est pas indexé, et n’est pas considéré pour le calcul des différences +
  • Untracked: Le fichier n’est pas indexé, et n’est pas considéré pour le calcul des + différences entre deux révisions
  • Stagged: Le fichier fait parti d’un lot prêt à être commité
  • -
  • Unmodified: Le fichier est indexé, mais ne possède aucune différence avec sa version de la révision +
  • Unmodified: Le fichier est indexé, mais ne possède aucune différence avec sa version de + la révision précédente
  • -
  • Modified: Le fichier est indexé, et possède des différences avec sa version dans la révision +
  • Modified: Le fichier est indexé, et possède des différences avec sa version dans la + révision précédente
@@ -194,7 +208,9 @@

La gestion de fichiers

Ignorer des fichiers

-

Il est possible de faire en sorte que des fichiers présents dans votre répertoire soit ignorés par Git. Il suffit de placer les repertoires/fichiers à ignorer dans le .gitignore

+

Il est possible de faire en sorte que des fichiers présents dans votre + répertoire soit ignorés par Git. Il suffit de placer les repertoires/fichiers à ignorer + dans le .gitignore


 lib/
 plugin/
@@ -204,16 +220,18 @@ 

Ignorer des fichiers

-
+

L'historique

-

L'historique de git est créé comme une chaîne de pointeurs entre les différentes révisions (commits) du projet

+

L'historique de git est créé comme une chaîne de pointeurs entre les différentes révisions (commits) du projet

Le Commit

- Un commit est une révision du projet. Le snapshot du projet à l’instant T où le commit a été créé. Il est identifié par son + Un commit est une révision du projet. Le snapshot du projet + à l’instant T où le commit a été créé. Il est identifié par son SHA-1 et contient les informations suivante:

    @@ -228,25 +246,26 @@

    Le Commit

    Exemple

-
+

Créer un dépôt Git

@@ -256,24 +275,28 @@

Git Init

git init __directory__ Transforme le dossier __directory__ en dépôt git.
git init [--bare]

Un repository - bare est un repository dans lequel on ne peut rien commiter directement. On ne peut que synchroniser + bare est un repository dans lequel on ne peut rien commiter directement. On ne + peut que synchroniser avec d'autre dépôt.

- Note: Si vous faites un git init dans un repertoire en étant déjà un depôt git, rien ne se passe. - Vous n'écraserez pas votre configuration. + Note: Si vous faites un git init dans un repertoire en étant déjà un depôt git, rien ne se + passe. + Vous n'écraserez pas votre configuration.

Git clone

-

Cette commande vous permez de cloner un dépôt existant (distant ou non). Un dossier portant le nom du - projet est créé dans le répertoire courant, et le dépôt est copié dans ce dossier.

+

Cette commande vous permez de cloner un dépôt existant + (distant ou non). Un dossier portant le nom du + projet est créé dans le répertoire courant, et le dépôt est copié dans ce dossier.

git clone __url__
git clone https://github.com/get-focus/formation-git-basic.gitPar exemple si vous voulez contribuer à l'amélioration de cette formation, vous pouvez copier le dépôt et commencer à coder =)

Git config

-

Permet de régler les configurations du compte git. Il est possible de gérer une hiérarchie des configuration:

+

Permet de régler les configurations du compte git. Il est possible de gérer une hiérarchie des + configuration:

  • system
  • global
  • @@ -285,7 +308,8 @@

    Git config

Les alias

-

Il est possible de se créer des alias pour simplifier l'utilisation de certaines commandes complexes

+

Il est possible de se créer des alias pour simplifier l'utilisation de certaines commandes + complexes

git config --global alias.ci commit
git config --global alias.amend git ci --amend
Ainsi la commandegit amend
@@ -335,32 +359,40 @@

Modifier des éléments

Git add

-

Cette fonction sert à passer des nouveaux fichiers, ou des fichiers modifiés à l'état +

Cette fonction sert à passer des nouveaux fichiers, ou des fichiers + modifiés à l'état staged afin qu'ils puissent par la suite être commités.

git add __file__
git add __directory__
git add ./src/*.js
-

La phase de stagging est une particularité propre à Git. Ce buffer entre la phase de travail, et - la phase d'historisation permet de morceler notre historique afin de rendre les commits les plus +

La phase de stagging est une particularité propre à Git. Ce buffer entre la phase de + travail, et + la phase d'historisation permet de morceler notre historique afin de rendre les commits les + plus atomiques possible.

Git commit

-

Cette commande sauvegarde l'ensemble des modifications dans l'état +

Cette commande sauvegarde l'ensemble des modifications dans + l'état staged et l'ajoute à l'historique du projet.

git commit -m "__message_de_commit__"
-

Une fois nos modifications commitées, Git ne les oubliera jamais. Il est bien sur possible de modifier +

Une fois nos modifications commitées, Git ne les oubliera jamais. + Il est bien sur possible de modifier l'historique, mais là encore il existe des possibilités pour retrouver nos modifications.

-

Attention! Ceci n'a rien à voir avec la fonction commit de SVN. Ici l'historisation n'est faite que +

Attention! Ceci n'a rien à voir avec la fonction commit de SVN. Ici l'historisation n'est + faite que sur votre depôt local. La synchronisation avec un serveur central se fait séparément.

-
+ +

Revenir en arrière

@@ -372,254 +404,440 @@

Git commit --amend

git commit --amend -m "Update README.txt"Applique les modification à l'ancien commit, et change le message de commit en "Update README.txt".
-
Attention: on modifie l'historique en faisant cela. Le --amend n'est utilisé que lorsque les modifications ne sont pas synchronisées avec le serveur.
+
Attention: on modifie l'historique en faisant cela. Le --amend n'est utilisé que + lorsque les modifications ne sont pas synchronisées avec le serveur.

Git reset

-

Vous permez de revenir à l'état de n'importe quel commit. Efface les liens des commits concernés.

+

Vous permez de revenir à l'état de n'importe quel commit. Efface + les liens des commits concernés.

git reset HEAD^Revient au commit précédent. En gardant l'ensemble des modifications dans l'état modified
git reset HEAD~3 --hardRevient trois commits en arrière en effaçant l'ensemble des modifications.
git reset origin/master --hardRevient à l'état dans lequel est la branche sur le dépôt origin.
-

Le HEAD

-

Il s'agit de votre emplacement actuel dans l'arbre d'historique

-
- -
-

C'est un tag particulier qui pointe vers le commit. On retrouvera cette notion pour les branches

- -
+

Le HEAD

+

Il s'agit de votre emplacement actuel dans l'arbre + d'historique

+
+ +
+
+

C'est un tag particulier qui pointe vers le commit. On retrouvera cette notion pour les + branches

+
+ + -
+ +

Les Branches

-

Il s'agit de la grande puissance de Git! Rendre les branches plus facile d'utilisation pour s'adapter à n'importe quelle méthode de travail.

+

Il s'agit de la grande puissance de Git! + Rendre les branches plus facile d'utilisation pour s'adapter à n'importe quelle méthode de + travail.

Git branch

-

Pour Git, une branche n'est qu'une chaîne de commit pointant chacun sur son parent!

+

Pour Git, une branche n'est qu'une chaîne de commit pointant chacun sur son parent!

git branch ma-nouvelle-featureCrée une nouvelle branche appelée ma-nouvelle-feature
-

Une branche est représentée dans Git par un tag pointant vers le dernier commit de la branch.

+

Une branche est représentée dans Git par un + tag pointant vers le dernier commit de la branch.

- +

Git checkout

-

Cette commande sert à naviguer (déplacer le HEAD) dans l'arbre d'historique. De cette manière, vous remplacez votre arborescence de fichier par celle en l'état au moment du commit choisi.

+

Cette commande sert à naviguer + (déplacer le HEAD) dans l'arbre d'historique. De cette manière, vous remplacez + votre arborescence de fichier par celle en l'état au moment du commit choisi.

git checkout 6b2488
git checkout master
-

Vous pouvez identifier un commit juste avec le début de son SHA-1. S'il n'y a pas d'ambiguïté, Git comprendra naturellement de quel commit il s'agit.

+
+

Vous pouvez identifier un commit juste avec le début de son SHA-1. S'il n'y a pas + d'ambiguïté, Git comprendra naturellement de quel commit il s'agit.

+

Git stash

-

Le stash est utile pour stocker temporairement des modifications.

+

Le stash est utile pour stocker + temporairement des modifications.

git stashPrend l'ensemble de vos modifications en attente, et les place dans le stash.
git stash popVide le stash, et applique les modifications qu'il contenait.
git stash dropVide le stash sans appliquer les modifications.
-

Si vous avez des modifications en cours que vous ne voulez pas commiter, mais que vous voulez tout de même mettre à jour votre branche avec le serveur, le stash est la solution ;)

+
+

Si vous avez des modifications en cours que vous ne voulez pas commiter, mais que vous + voulez tout de même mettre à jour votre branche avec le serveur, le stash est la solution + ;)

+
-
+ +

Synchronisation

Git pull

-

Cette commande sert à récupérer les commit sur origin pour mettre à jour notre dépôt local

+

Cette commande sert à récupérer les commit sur origin + pour mettre à jour notre dépôt local

git pullRécupère et merge les commits de la branche serveur correspondant à notre branche locale.
git pull origin masterRécupère et fusionne les commit de la branche master sur origin à notre branche locale.
-

La commande git pull est une contraction des deux commande git fetch et git merge. Dans la plupart des cas (et aussi pour éviter des commit de merge inutiles) on préfèrera utiliser la commande suivante:

+
+

La commande git pull est une contraction + des deux commande git fetch et git merge. + Dans la plupart des cas (et aussi pour éviter des commit de merge inutiles) on préfèrera + utiliser la commande suivante:

git pull --rebase
git config --global pull.rebase trueTous vos pull seront des pull --rebase ;)

Git push

-

Cette commande sert à pousser nos modifications locales sur une branche serveur

+

Cette commande sert à pousser nos modifications + locales sur une branche serveur

git pushPousse les commits locaux sur la branche serveur configurée pour notre branche locale
git push origin masterPousse les commits locaux sur la branche master sur le dépôt origin
-

Si vous avez des modifications en attente, ou si vous n'êtes pas à jour avec le serveur, Git refusera de pusher!

+
+

Si vous avez des modifications en attente, ou si vous n'êtes pas à + jour avec le serveur, Git refusera de pusher!

+

Git merge

-

Fusionne les modifications d'une branche sur une autre

+

Fusionne les modifications d'une branche sur + une autre

git merge ma-nouvelle-featureMerge la branche ma-nouvelle-feature sur la branche courante
- +

Git rebase

-

Ré-applique les commits sur le commit sélectionné

+

Ré-applique les commits sur le commit + sélectionné

git rebase masterRebase la branche courante sur master
- - -

Attention, on réécrit l'historique. Donc les SHA-1 des commits changent

-
- + gitGraphRebased.branch("ma-nouvelle-feature").commit().commit({ message: "pret à rebase!", tag: "ma-nouvelle-feature" }); + } + }); + master.commit({ tag: "master", sha1: "029bdd", dotColor: "green", messageColor: "green" }); + })(); +
-
+
+

L'intérêt du rebase

+ + +
+
+

Git au quotidien

Les logiciels de dépôt

-

Ils permettent de gérer efficacement un dépôt. Sécuriser certaine branches, mettre en place des builds automatiques, des workflows particuliers...

+

Ils permettent de gérer efficacement un dépôt. Sécuriser certaine + branches, mettre en place des builds automatiques, des workflows particuliers...

- +

Les clients graphiques

-

Indispensable à une utilisation efficaces de Git. On evite les erreurs, on comprend et donc maîtrise ce que l'on fait.

+

Indispensable à une utilisation efficaces de Git. On evite les + erreurs, on comprend et donc maîtrise ce que l'on fait.

Site web
+
+

GIT STATUS

+

git status est la commande ultime : +

  • donne l'état
  • +
  • explique ce qui s'est passé
  • +
  • recommande la prochaine commande à exécuter
  • +

    +

    À utiliser systématiquement : +

  • avant un commit pour vérifier quoi et
  • +
  • quand un merge ou un rebase se passe mal
  • +
  • quand on a un doute
  • +
  • avant de m'appeler (parce que c'est la première chose que je vais faire en arrivant)
  • +

    +
    +
    +

    0 conflit != 0 effet de bord

    +

    Ce n'est pas parce que les lignes de code se sont bien mergés que le + travail + d'un développeur n'a pas cassé le travail d'un autre.

    +

    Les tests fonctionnels sont à toujours à faire.

    +
    +
    +

    Règles d'or

    +

    Je commit souvent

    +

    Chaque commit n'est lié qu'à un seul sujet

    +

    Je push tous les jours

    +

    Je mets à jour mon repo local tous les jours

    +

    Je mets mes expérimentations dans des branches à part et je les push

    +

    Si j'ai un doute, je fais une branche ou un tag puis j'essaye

    +

    Rien n'est jamais vraiment perdu (ou presque)

    +

    Il y a la solution à mon problème sur Stackoverflow

    +
    -
    + +
    +
    +

    Exercices

    +

    Prise + en main

    +

    Branching

    +
    +
    + +

    Workflows

    Pour une organisation du travail efficace et qualitative!

    +

    Git est un outil génial à bien utiliser : les workflows sont les processus + de gestion de code qui permettent une d'en tirer le maximum

    +
      +
    1. Workflow centralisé tout sur master
    2. +
    3. Feature Branch workflow une branche par fonctionnalité
    4. +
    5. Gitflow workflow calé sur les cycles de livraisons
    6. +
    7. Forking workflow décentralisation totale (pas pour Klee)
    8. +
    +
    + +

    Workflow centralisé

    -

    Flow mono-branche. Seule la master est présente, chaque personne doit pusher des versions stables de l'application.

    -

    Flow le plus utilisé à l'heure actuelle chez Klee. Simple, léger, efficace. Pas de garde fou ni de modularité.

    +

    Flow mono-branche. Seule la master est présente, chaque personne + doit pusher des versions stables de l'application.

    +

    Flow le plus utilisé à l'heure actuelle chez Klee. Simple, léger, + efficace. Pas de garde fou ni de modularité.

    Les étapes de flow centralisé

    1. Je code sur mon dépôt local
    2. -
    3. Je me synchronise avec origin (pull --rebase)
    4. +
    5. Je me synchronise avec origin (fetch)
    6. +
    7. Je mets à jour ma branche locale avec origin (rebase + or merge)
    8. Je push
    +

    + +

    -

    Feature branching

    -

    Flow multi-branches. Une branche principale servant à l'integration des fonctionnalités (souvent appelée develop). Puis une branche par fonctionnalité basée sur develop.

    -

    L'idée de ce flow est de séparer les concepts métiers en story utilisateurs. Il permet une plus grande modularité et une meilleure maîtrise dans la façon de travailler.

    -

    Souvent couplé avec la méthodologie Kanban. Possibilité de forcer la relecture de code avant intégration via pull request

    +

    La gestion des conflits

    +

    Conflits locaux. Au moment du rebase localement, le + développeur rencontre un conflit.

    +

    Cela se produit quand plusieurs développeurs touchent à la même partie + du + code.

    +

    Résolution locale qui peut demander développeurs concernés de + se pencher ensemble sur le problème.

    +

    + +

    +

    En pratique, le développeur qui fait face au conflit a tendance à le + résoudre plus simplement possible et à pusher. + +

    +
    +
    +

    Avantages

    +
      +
    1. Très très simple
    2. +
    3. Transition depuis SVN facile
    4. +
    +
    +
    +

    Défauts

    +
      +
    1. Pas de contrôle du code : revue de code difficile
    2. +
    3. Mélange des commits : impossible de livrer une fonctionnalité mais + pas les autres tant que l'ensemble des développements n'est pas fini.
    4. +
    5. Conséquence : anti-agile & réactivité coûteuse
    6. +
    7. Pas de branches dédiées à des rôles spécifiques : pas d'intégration + continue automatisée, pas de brach sécurisée, etc.
    8. +
    9. Détricotage compliqué et long
    10. +
    +
    +
    +

    Quand l'utiliser ?

    +
  • Petite équipe : 3 développeurs maximum
  • +
  • Projet facile avec métier simple et + évolutions peu fréquentes.
  • +
  • Projet en TMA, pas en cours de construction
  • +
    +
    + +
    +
    +

    Feature Branching Workflow

    +

    Flow multi-branches. Une branche principale servant à + l'integration des fonctionnalités (souvent appelée master). Puis une branche par + fonctionnalité basée sur master.

    +

    L'idée de ce flow est de séparer les concepts métiers en story + utilisateurs. Il permet une plus grande modularité et une meilleure maîtrise dans la façon + de + travailler.

    +

    Souvent couplé avec la méthodologie Kanban. Possibilité de + forcer + la relecture de code avant intégration via pull request

    Travail supplémentaire à l'intégration d'une feature.

    - - +

    Les étapes du feature-branching

      -
    1. Je crée une branche à partir de devs liés à une issue/WI
    2. -
    3. Je code sur ma branche (commit et push régulier)
    4. -
    5. Je résous les conflits avec dev (merge ou rebase)
    6. -
    7. Je crée la pull request
    8. -
    9. Un relecteur valide ma pull request ou me renvoie à l'étape 2
    10. +
    11. Je crée une branche Mantis_845 à partir de master + liés à une issue/WI
    12. +
    13. Je code sur ma branche (commit et push réguliers)
    14. +
    15. Je résous les conflits avec master (merge ou rebase)
    16. +
    17. Je crée la pull request
    18. +
    19. Un relecteur valide ma pull request ou me renvoie à + l'étape 2
    -

    L'intérêt du rebase

    - - +
    +

    Avantages

    +
      +
    1. Tous les avantages du Feature Branch Workflow
    2. +
    3. Fluidité pour la livraison régulière
    4. +
    5. Naturellement adapté à l'agile
    6. +
    7. Supporte des gros projets et beaucoup de développeurs + en compartimentant les responsabilités
    8. +
    9. Historiques du code et du projet très liés et cadrés
    10. +
    +
    +
    +

    Défauts

    +
      +
    1. Compliqué à respecter : nécessite un responsable
    2. +
    3. Demande de la rigueur
    4. +
    5. À mon avis, exige d'avoir une forge logicielle (TFS, + GitLab, GitHub, Bitbucket...) opérationnelle
    6. +
    +
    +
    +

    Quand l'utiliser ?

    +
  • Moyenne ou + grosse équipe
  • +
  • Projet à livraisons régulières ou fréquentes : cycle agile, TMA + dynamique.
  • +
  • Grosse base de code en construction
  • +
  • Au moins un développeur prêt à monter en compétence sur Git et prendre + la responsabilité.
  • -
    + + + +
    -

    Exercices

    -

    Prise en main

    -

    Branching

    +

    Forking Workflow

    +

    Complètement différent de ce qu'on a vu jusqu'à présent

    +

    Projets open-source et collaboratifs.

    + +

    Chaque développeur a son repo local et un repo public.

    +

    La Pull Request est l'outil clef.

    +
    +
    +

    + +

    +
    +
    +

    Avantages

    +
      +
    1. Ouvert aux suggestions de contribution de tout le monde
    2. +
    3. Bases de code publiques accessibles à tous en lecture
    4. +
    5. Tout le monde peut faire sa version et la partager
    6. +
    7. Supporte des énormes projets et beaucoup de + développeurs
    8. +
    9. Le maintainer officiel peut sous-traiter l'aggrégation et la + vérification des Pull Request
    10. +
    11. Pas de source unique de vérité
    12. +
    +
    +
    +

    Défauts

    +
      +
    1. Compliqué
    2. +
    3. Lourd pour chaque développeur (mais les Githubs&Cie machent + le travail)
    4. +
    5. Pas de source unique de vérité
    6. +
    +
    +
    +

    Quand l'utiliser ?

    +
  • Grosse équipe sur plusieurs sites, fuseaux horaires, entreprises, etc.
  • +
  • Projet à multiples parties prenantes
  • + @@ -701,4 +1092,4 @@

    Exercices

    - + \ No newline at end of file