Gestion de versions – Introduction à git

git:

git est un logiciel de gestion de versions qui, contrairement à svn ou csv,  est décentralisé. C’est un logiciel libre créé par Linus Torvalds, auteur du noyau Linux, et distribué selon les termes de la licence publique générale GNU version 2. En 2016, il s’agit du logiciel de gestion de versions le plus populaire qui est utilisé par plus de douze millions de personnes. (réf: https://fr.wikipedia.org/wiki/Git).
En gros, c’est une application qui permet de garder plusieurs versions d’un fichier ou d’un projet et au besoin, de revenir à une version précédente.
Git permet aussi de travailler sur des fonctionnalités additionnelles en parallèle au projet principal (branch) et de les réintégrer (merge) une fois qu’elles sont au point.
L’application ‘git’ est installée par défaut sur MacOS et disponible à partir d’une fenêtre ‘terminal’.
Sur Windows il faut l’installer: https://git-scm.com/download/win
Voici un exemple d’utilisation de git sous MacOS:

Voici un sommaire des commandes disponibles à partir de ‘terminal’:
[pdf-embedder url= »/xcode/wp-content/uploads/2017/03/github-git-cheat-sheet.pdf »]
Note: Heureusement pour nous, les fonctionnalités de base sont intégrées à même Xcode.  Dans la plupart des cas, il ne sera pas nécessaire de recourir à l’application ‘terminal’.


1 – Premiers pas avec ‘git’

Action.1.1 – Créer un nouveau projet iOS ‘single View’ nommé  ‘git-premiers-pas’ et cocher l’option ‘create git repository on my Mac‘ à la fenêtre de création du projet:

Action.1.2 – Afficher le navigateur de contrôle de sources:

Action.1.3 – Vérifier l’état ‘git’ du projet via le terminal.

Action.1.4 – Modifier le fichier AppDelegate.swift

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        print("application:didFinishLaunchingWithOptions")
        return true
    }

Note:  Remarquez le ‘M’ qui est apparu à droite du nom du fichier:

Il nous indique que le fichier a été modifié depuis le dernier ‘commit’.
L’éditeur de version permet permet d’observer les modifications entre les ‘commits’:

Action.1.5 – Renseigner un nouveau commit:

Action.1.6 – Ajouter une ligne de code dans viewDidLoad et faire un commit:

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        print("ViewController:viewDidLoad")
    }


2 – Les branches

Les branches permettent de tester de nouvelles fonctionnalités à l’extérieur de la branche principale (master) et de les réintégrer lorsqu’elles sont au point.
Nous allons créer une nouvelle branche pour réaliser le design de l’application.
Action.2.1 – Créer une nouvelle branche ‘design’

Action – Compléter la création de la branche en cliquant sur le bouton ‘Create’
Note: Observer l’ajout de la nouvelle branche dans la fenêtre suivante.  De plus, cette branche est devenue la branche courante.  Si nous apportons des modifications au projet, ils n’affecteront pas la branche de départ (master).

Action.2.2 – Réaliser le design de départ:


Action.2.3 – Réaliser le commit:

Action: Tester l’application!
Action.2.4 – Retourner sur la branche ‘master’, l’option ‘checkout’


Action: Tester l’application!
Action.2.5 – Ajouter la méthode ‘afficher’ à la class ViewController, appeler dans viewDidLoad et réaliser un commit

    func afficher(_ msg:String, fois:Int = 1) {
        for i in 0...fois {
            print(i, msg)
        } // for
    } // afficher
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        print("ViewController:viewDidLoad")
        afficher("Test", fois: 3)
    }

Note: Message du ‘commit’: Ajout de la méthode afficher()
Action – Tester l’application.


3. La fusion de deux branches

Nous allons maintenant fusionner la version ‘design’ dans la version ‘master’.
Comme résultat, la version ‘master’ va hériter de toutes les modifications apportées au UI.
Action.3.1 Cliquer droit sur la branche « design » et sélectionner l’option ‘Merge « design » into « master »‘

Action – Observer les changements proposés

Action – Observer l’état du projet de la branche ‘master’.  Le travail de design a été incorporé à la branche ‘master’.

Note: Il ne doit pas y avoir de ‘commits’ en suspends pour pouvoir réaliser la fusion.


4 – Fusion avec conflits

Action.4.1 version ‘master‘ ajouter la ligne suivante, suivi du commit « Ajout de ‘je suis la ligne 15‘ »

Action.4.2 – Passer à la branche ‘design‘ et ajouter la ligne suivante , suivi du commit « Ajout de ‘je suis aussi la ligne 15‘ »

Action.4.3 – Fusionner ‘design’ dans master.

Résultat, fusion automatique impossible, il faut intervenir:

Choix 1:
 Choix 2:
 Choix 3:
 Choix 4:


5 – GitHub

GitHub propose un service ‘git’ en nuage.  Cela permet à plusieurs personnes, de lieux différents, de collaborer à un même projet.
Voici des exemples de projets disponibles sur GitHub:
swift
linux
atom
brackets
react
bootstrap
Alamofire
laravel


Nous allons maintenant envoyer notre projet sur gitHub.
Action 5.1 – Renseigner les paramètres de votre compte gitHub dans les préférences de Xcode:

Action.5.2 – Transférer le projet vers gitHub

Action – Vérifier l’état du compte sur gitHub:

Note:  Il n’y a que la branche courante qui a été envoyée sur GitHub.  Il faudra pousser (Push) les autres branches vers GitHub.

Action.5.3 – Changer de branche (checkout) et transférer la nouvelle branche courante (push)

Note:  Remarquez qu’Xcode propose de créer la nouvelle branche sur le site distant.

Action – Vérifier l’état du projet sut GitHub.  Entre autres, la liste des branches.

Action.5.4 – Modification d’un fichier du projet via gitHub
Nous allons ajouter un commentaire dans le fichier ViewController.swift en utilisant GitHub.
Action – Naviguer vers le fichier ‘ViewController.swift’

Action – Cliquer sur l’icône du crayon pour éditer le fichier

Action – Ajouter le commentaire de la ligne 7

Action – Descendre au bas de la page web d’édition et compléter le ‘commit’

Note: Le changement a été effectué dans la branche ‘design’


Nous allons maintenant inclure ce changement à notre copie locale.

Note: Assurez-vous d’être sur la branche design.
Action.5.5 – Synchroniser une branche avec la version sur gitHub (pull)

Action – Observer les changements au fichier ViewController.swift

Extra: Introduction de 10 minutes à gitHub


6 – Restaurer le projet à un point dans le passé.

Il est possible de déplacer la tête du projet à n’importe quel ‘commit’ du projet.  Par contre, c’est une délicate opération qu’il n’est pas possible de réaliser à partir de Xcode.
Note: Pour prévenir une situation de déplacement de la tête – HEAD – vers l’arrière, il est une bonne pratique de développer des nouvelles fonctionnalités à l’application sur une branche secondaire et de fusionner lorsque les tests de contrôle qualité auront été réalisés.
Retournons voir l’historique des ‘commits’ de la branches ‘master’:
Action.6.1 – A) Au besoin, réaliser un ‘checkout‘ sur la branche ‘master‘.

$ git checkout master

B) Entrer les 2 commandes suivantes:

$ git log > gitlog.txt
$ ls -l


Action.6.2 – Observer le contenu du fichier gitlog.txt

commit 5c6532f1d445d3e06ecd2dfc1c1896923d5a0b1e
Author: Alain <alain@MacBook-Pro-de-Alain.local>
Date:   Sat Oct 14 14:52:55 2017 -0400
    Ajout d'une autre ligne 15 suite au merge
commit 5d32c805d06f190fc226e08b4dfb9618c9789f22
Merge: 7b68b44 c9d86f6
Author: Alain <alain@MacBook-Pro-de-Alain.local>
Date:   Sat Oct 14 14:37:04 2017 -0400
    Merge branch 'design'
commit c9d86f67587daa01bb0371d158b08097abb46a42
Author: Alain <alain@MacBook-Pro-de-Alain.local>
Date:   Sat Oct 14 14:32:54 2017 -0400
    Ajout de 'Je suis aussi la ligne 15'
commit 7b68b44be4fa2f21778c5e8fec02410f81574d9f
Author: Alain <alain@MacBook-Pro-de-Alain.local>
Date:   Sat Oct 14 14:31:23 2017 -0400
    Ajout de 'je suis la ligne 15'
commit 19d25f7400670aa8c01d36c8faea7ae611e1d6ac
Merge: 2d87e2b 5572efa
Author: Alain <alain@MacBook-Pro-de-Alain.local>
Date:   Sat Oct 14 14:25:16 2017 -0400
    Merge branch 'design'
commit 2d87e2bc82636875c82da817c251c2a3bf1014b2        <------------------------
Author: Alain <alain@MacBook-Pro-de-Alain.local>
Date:   Sat Oct 14 14:24:08 2017 -0400
    Ajout de la méthode afficher()                     <------------------------
commit 5572efa768c65553dce70d8d646ae1e355e86e28
Author: Alain <alain@MacBook-Pro-de-Alain.local>
Date:   Sat Oct 14 14:03:35 2017 -0400
    Prototype du design
commit c9c14277e279cb74de500ef4740212251a8a4ece
Author: Alain <alain@MacBook-Pro-de-Alain.local>
Date:   Sat Oct 14 13:37:41 2017 -0400
    Ajout d'une trace dans viewDidLoad
commit dfb787b201bfe96532c36d96570a5a17920481b4
Author: Alain <alain@MacBook-Pro-de-Alain.local>
Date:   Sat Oct 14 13:25:11 2017 -0400
    Ajout d'un message dans didFinishLaunching
commit 6d9c4fc1fcfd84d163cf92e5c80f03d24a420d99
Author: Alain <alain@MacBook-Pro-de-Alain.local>
Date:   Sat Oct 14 12:37:17 2017 -0400
    Initial Commit

Note: Votre fichier gitlog.txt sera probablement différent.
Action.6.3 – Identifier le SHA  du commit ‘Ajout de la méthode afficher()
Note: Dans mon cas le SHA est « 2d87e2bc82636875c82da817c251c2a3bf1014b2 »
Attention:  Il faut fermer le projet Xcode avant d’effectuer la prochaine opération.
Action.6.4 – Déplacer la tête (HEAD) de la branche master en utilisant le SHA identifié à l’étape précédente.

$ git reset --hard 2d87e2bc8
$ git log




Voila!
Note:  Les commits qui suivaient SHA sont « 2d87e2bc82636875c82da817c251c2a3bf1014b2 » toujours disponibles.  C’est pour cette raison que nous avons créé le fichier gitlog.txt, au cas ou il faudrait revenir vers l’avant.


7 – Ouvrir, à partir de Xcode, un projet stocké sur gitHub

Action.7.1 – Sélectionner l’option ‘Clone‘ du menu ‘Source Control

Action.7.2 – Sélectionner, dans la liste, le projet désiré.

Action.7.3 – Renseigner le dossier d’enregistrement

Action.7.4 – Travailler dans le projet local.

Note:  Le projet cloné est lié au projet stocké sur GitHub.  C-a-d, qu’il est possible de faire des ‘push’/’pull’.
De plus, vous avez seulement cloné la branche active de GitHub.
Il faudra faire un ‘checkout’ pour pouvoir travailler sur d’autres branches du projet.





Informations générales

1 – homebrew (gestionnaire de packages)

ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)"

2 – git (devrait être déjà installé sur Mac OS)
3 – Git bash-completion (avec homebrew)

brew install git bash-completion
if [ -f `brew --prefix`/etc/bash_completion ]; then
  . `brew --prefix`/etc/bash_completion
fi

4 – Afficher le nom de la branche git dans l’invite – dans le fichier .bash_profil, ajouter ceci à la fin:

#Afficher la branche de git dans l'invite
PS1='[\W$(__git_ps1 " (%s)")]\$ '

5 – cocoapods (avec homebrew)

brew install cocoapods

Git cheat sheet

cheatsheet1 –  https://services.github.com/on-demand/downloads/fr/github-git-cheat-sheet.pdf

Editeur markdown en ligne

stackedit – https://stackedit.io


Tutoriel sur Raywenderlich

1- Intro: https://www.raywenderlich.com/51351/how-to-use-git-source-control-with-xcode-in-ios-7
2-Intermédiaire: https://www.raywenderlich.com/74258/git-tutorial-intermediate

Afficher les fichiers cachés sous MacOS:

defaults write com.apple.finder AppleShowAllFiles YES