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 @@
- 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).
- 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.
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.
-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.
+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.
-
@@ -194,7 +208,9 @@- 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
La gestion de 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 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
- 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:
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.
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 =)
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:
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 @@ 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.
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.
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.
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.
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
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
+
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.
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.
+Les deux branches peuvent maintenant évoluer indépendament l'une de l'autre.
+Les deux branches peuvent maintenant évoluer indépendament l'une de l'autre.
+
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.
+
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 + ;)
+
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 --rebasegit config --global pull.rebase trueTous vos pull seront des pull --rebase ;)
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!
+
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
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
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...
+
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.
git status est la commande ultime :
+
À utiliser systématiquement : +
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.
+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
+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
+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é.
+
+
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
+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.
+
+
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.
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.
+
+
+