Formation
# Introduction ![](img/jetpacktocat.png =400x)
## Quelles solutions pour collaborer ? Se refiler une clé USB S'envoyer des mails Faire un dossier Dropbox/Google Drive partagé Collaborer en temps réel sur Office Online/Google Docs ...
## Quel est le problème ? ![](img/probleme_collab1.png) WTF ? Comment je m'y retrouve ? Lequel est le bon ?
## Et là, c'est mieux ? ![](img/probleme_collab2.png) Et pour revenir à une ancienne version ? Ou montrer ce que j'ai fait ? T_T Note: - parler du problème avec deux personnes qui envoient en meme temps
## Git, qu'est-ce que c'est ? Un système de **gestion de version décentralisé** Créé en **2005** par **Linus Torvalds** Logiciel **libre** et (donc) gratuit
## Intérêts - Sauvegarde (si synchronisation avec un serveur distant, par ex. Github) - Conservation de l’historique des fichiers - Possibilité de retour en arrière - Fusion des modifications lors du travail collaboratif - Visualiser les changements au cours du temps
# Un peu de théorie ![](img/professortocat.png =400x)
## Le principe ![](img/working_directory.png)
## Le principe ![](img/working_directory_2.png)
## Qu'est-ce qu'un commit ? L’historique d’un dépôt est une **séquence de snapshots**, qui décrivent l'évolution de chacun des fichiers, tout au long de la vie du projet Ces snapshots s’appellent des **commits**, et possèdent : - une date - un auteur - une description - un lien vers le(s) commit(s) parent(s) - un **identifiant unique** ! (hash du commit) Exemple : 6ba5aedaabc00dfd4f8773c9df208b478a5ddc68 ou **6ba5aed** pour les intimes !
## Le principe ![](img/basic-branching-1.png)
## Un dernier problème à considérer ![](img/stage_1.png)
## Une zone intermédiaire bien pratique ![](img/stage_2.png)
## Une zone intermédiaire bien pratique ![](img/stage_3.png)
## Une zone intermédiaire bien pratique ![](img/basic-branching-1.png)
## La collaboration en pratique ![](img/centralized_bis.png)
## Une recette inratable
## git < COMMAND > [options]
# Commencer à utiliser Git ![](img/familycat.png =400x)
## Installer et configurer Git (voir démo)
## Le dépôt n'existe pas On va créer un nouveau dépôt ``` bash $ mkdir
$ cd
$ git init ```
## Le dépôt existe déjà On va créer un **clône** du dépôt ``` bash $ git clone
``` ``` bash $ git clone https://github.com/KIClubinfo/formation-git-exemple.git ```
# Visualiser ses changements ![](img/inspectocat.png =400x)
## Un bon dessin suffit ![Status and log](img/status-log.svg)
## Changements non ajoutés ``` bash $ git diff diff --git a/index.html b/index.html index f8e99f6..f618e9f 100644 --- a/index.html +++ b/index.html @@ -29,7 +29,7 @@ ![KI](img/ki.svg =200x) - # Gormation Fit + # Formation Git ![Git](img/logo.svg =200x) ```
## État du _working directory_ et de la _staging area_ ``` bash $ git status On branch master Your branch is ahead of 'origin/master' by 1 commit. (use "git push" to publish your local commits) Changes to be committed: (use "git reset HEAD
..." to unstage) modified: css/theme/source/ki.scss new file: img/lifecycle.png deleted: img/logo.svg Changes not staged for commit: (use "git add
..." to update what will be committed) (use "git checkout --
..." to discard changes in working directory) modified: index.html Untracked files: (use "git add
..." to include in what will be committed) essai.html ```
## L'historique des commits ``` bash $ git log commit 6ba5aedaabc00dfd4f8773c9df208b478a5ddc68 Author: Prénom Nom
Date: Fri Oct 21 17:53:29 2016 +0200 Formation KI, initial commit commit 3c36ee6cff43d2c4aefe59ef5198df4f327fa094 Author: Prénom Nom
Date: Sat Aug 27 09:13:54 2016 +1000 Add note to README about how to disable scaling ``` ``` bash $ git log --oneline 6ba5aed Formation KI, initial commit 3c36ee6 Add note to README about how to disable scaling bac187f request fullscreen on documentElement instead of body (#1621 #1624) c2997c6 text alignment 6b4bdd2 hdpi slides banner 904f987 slides banner ```
# Sauvegarder ses changements ![](img/repotocat.png =400x)
## Ajouter les fichiers modifiés ![Adding](img/add.svg =400x) ``` bash $ git add
``` Ou, encore mieux, choisir les modifications à ajouter : ``` bash $ git add -p ```
## Ignorer des fichiers Fichier **.gitignore** ``` .gitignore # no .a files *.a # but do track lib.a, even though you're ignoring .a files above !lib.a # ignore all files in the build/ directory build/ # ignore all .pdf in the doc/ directory and its subdirectories doc/**/*.pdf ``` Note: On peut demander à Git de ne pas ajouter certains fichiers dans un dépôt On utilise un fichier **.gitignore** placé à la racine du projet
## Enregistrer les modifications ![Committing](img/commit.svg =400x) ``` bash $ git commit -m "Le message" ``` Note: Il faut **ensuite** enregistrer cette version du code dans l'historique Chaque version **doit** être accompagnée d'un message indiquant les modifications apportées
# Collaborer grâce à Git ![](img/benevocats.png =400x)
## À quoi ressemble mon historique ? ![Pushing and pulling in a collaborative workflow](img/push-pull-1.svg)
## Récupérer les modifications des autres ![Pushing and pulling in a collaborative workflow](img/push-pull-2.svg) ``` bash $ git fetch ``` Note: Avant d'envoyer vos propres modifications, vous devez récupérer celles des autres développeurs sous peine de vous faire rejeter par le dépôt central **Attention** : on connait le nouvel état du dépôt mais on ne l'a pas rejoint !
## Appliquer les modifications des autres ![Pushing and pulling in a collaborative workflow](img/push-pull-3.svg) ``` bash $ git pull ```
## Envoyer ses modifications vers le dépôt central ![](img/shoptocat.png =400x) ``` bash $ git push ``` Note: Après avoir enregistré des modifications, il faut les rendre accessibles aux autres développeurs
# Pizzas ! ![](img/cherryontop-o-cat.png =400x)
# Demo time ! ![](img/filmtocat.png =400x)
## Quelques bases de terminal ``` bash # Je peux créer un dossier $ mkdir
``` ``` bash # Je peux lister les fichiers dans le dossier $ ls [
] # Par exemple $ ls ~/enpc/TDLOG/formation-git formation-git.pdf lifecycle.png notes.md slides status-log.pdf ``` ``` bash # Je peux changer de dossier $ cd
```
# Gérer les conflits ![](img/steroidtocat.png =400x)
## Un fichier a été modifié « simultanément » Lorsque deux développeurs modifient le **même fichier au même endroit en même temps**, les modifications rentrent en conflit et la fusion est interrompue ``` bash $ git pull Auto-merging index.html CONFLICT (content): Merge conflict in index.html Automatic merge failed; fix conflicts and then commit the result. ``` Il faut alors fusionner les fichiers **manuellement**
## L'allure du conflit ``` bash $ git status On branch master You have unmerged paths. (fix conflicts and run "git commit") Unmerged paths: (use "git add
..." to mark resolution) both modified: index.html no changes added to commit (use "git add" and/or "git commit -a") ``` ``` html <<<<<<< HEAD:index.html ======= >>>>>>> iss53:index.html ```
## Résoudre le conflit On modifie les fichiers en conflit pour garder uniquement les modifications qui nous intéressent ``` html ``` ``` bash $ git add <...> $ git commit ```
# Retourner dans le passé ![](img/foundingfather_v2.png =400x)
## Restaurer un fichier ``` bash $ git checkout
# Par exemple $ git checkout HEAD index.html ``` On écrase le fichier par sa version dans le commit choisi
## Annuler des changements déjà publiés ``` bash $ git revert
``` ![](img/revert.svg) On crée un **nouveau commit** qui annule les modifications
## Annuler des changements non publiés ``` bash $ git reset
``` ![](img/reset.svg) On supprime **l'ancien commit** qui effectue les modifications Pire : ``` bash $ git reset --hard
``` On supprime **l'ancien commit** qui effectue les modifications **et les modifications** (on revient **exactement** au commit cible)
# On ne reset **JAMAIS** un commit déjà pushé ## Pourquoi ?
## Avant le reset ![](img/danger-1.svg =x400)
## On effectue le reset ![](img/danger-2.svg =x300)
## Les dépôts ont divergé ! ![](img/danger-3.svg =x250)
# Les branches ![](img/branchtocat.png =400x)
## Pourquoi faire des branches ? Travailler à plusieurs sans conflits Faire cohabiter et évoluer plusieurs versions du même projet Développer de grosses fonctionnalités tout en maintenant le reste du code en parallèle Exemple : **uPont** - la version visible en ligne - la version de développement
![Branching example](img/branching2.svg)
## Lister et supprimer les branches Par défaut, git utilise la branche **master** Pour lister les branches : ``` bash $ git branch ``` Pour supprimer une branche : ``` bash $ git branch -d
```
## Créer une branche Pour créer une nouvelle branche : ``` bash $ git checkout
``` ![](img/head-to-master.png)
## Créer une branche Pour créer une nouvelle branche et aller dessus : ``` bash $ git checkout -b
``` ![Branching example](img/head-to-testing.png)
## Jongler avec les branches ![](img/dodgetocat.png =400x) Pour **passer rapidement d'une branche à une autre** : ``` bash $ git checkout
``` Note: L'intérêt des branches est notamment de permettre de **passer rapidement d'une branche à une autre** Ce changement de branche vous permet de facilement gérer deux versions de code différentes Attention, le working directory et la staging area doivent être "vides" !
## Fusionner des branches ![](img/merge-2.svg =x400) On se place sur la branche **cible** : ``` bash $ git merge
```
# Github ![](img/github.png =250x)
## Qu'est-ce que c'est ? - Hébergement du dépôt « central » **public ou privé** - « Facebook » des développeurs - Énorme communauté Open Source - Utilisés par tous les pros : NASA, Google, Facebook, ... - Compte premium **gratuit** pour les étudiants Alternatives : GitLab, Bitbucket, ...
# Demo time ! ![](img/gracehoppertocat.png =400x)
# Et maintenant ?
# Pratiquez ! - Installer Git - S'inscrire sur Github - Refaire la [démo](https://github.com/KIClubinfo/formation-git-exemple/blob/master/TP.md) - Créer son premier dépôt - Le cloner - Faire son premier commit - Travailler à plusieurs pour les projets (TDLog...) - Être plus efficaces - Gagner des points ! - Rajouter une compétence essentielle sur son CV !
## Quelques références Le meilleur tutoriel (en anglais) : https://www.atlassian.com/git/tutorials GitHub Hello World : https://guides.github.com/activities/hello-world/ Git & Github Video Tutorial : https://www.youtube.com/watch?v=47E-jcuQz5c&list=PLg7s6cbtAD17Gw5u8644bgKhgRLiJXdX4 **Demander un compte Github premium** : https://education.github.com/pack
## Merci pour votre attention ! ![](img/welcometocat.png =400x) Feedback : http://tiny.cc/git018