Git Xcode

25/01/2019

Git + Xcode : une belle histoire ?
Utilisation de l'interface graphique intégrée

Si tu es développeur iOS, watchOS, tvOS ou macOS, tu utilises probablement Xcode au quotidien. Et si tu as la bonne pratique de versionner ton code, tu utilise très probablement Git.- Si pour toi, déplacer les mains de ton clavier n’est pas envisageable, cette solution n’est pas faite pour toi !Petit recap’ pour les têtes en l’air ou ceux qui ne font pas de développement sur les plateformes Apple :

  • Xcode : IDE mis à disposition par Apple permettant de développer des applications pour tous les produits Apple, mais aussi et surtout de soumettre son code pour une publication sur l’App Store. Xcode intègre tout le nécessaire pour produire une App.
  • Git : Outil de versionning de code. Si tu ne connais pas / n’utilises pas Git, je t’encourage GRANDEMENT à t’y pencher ! Le but de cet article n’est pas d’apprendre Git, mais plutôt de parler de son intégration à Xcode.
Git et Xcode ?

Depuis la version 9 de Xcode, un module permet de ne plus utiliser le terminal pour interagir avec les commandes courantes de Git. En effet, Apple a intégré les principales commandes de Git dans son logiciel de développement. Au cours de cet article, nous verrons les principales fonctions intégrées depuis la version 9, ainsi que le lien avec GitHub.

 
✋🏼‼️ Pro tips : depuis la version 10, il est possible de lier sont compte GitLab et bitbuckets.
 
Création d’un nouveau projet

Lors de la création d’un noveau projet, nous avons la possililité de mettre notre projet sous contrôle de Git. Je ne le fais pas ici pour partir de zéro, mais sachez que cela évite d’ajouter manuellement le contrôle de Git par la suite.

Ajouter son compte GitHub / GitLab / Bitbucket

Lorsque le projet est crée, il est nécessaire d’ajouter son compte GitHub (ou GitLab / Bitbucket) pour pouvoir pusher sur GitHub. Cela se fait dans préférences/accounts. Une fois associé, vous pourrez bénéficier pleinement de l’intégration du contrôle de source dans Xcode.

Mettre son projet sous contrôle

Maintenant, il est temps de mettre son projet sous le contrôle de Git. Si, à la création du projet, vous avez coché la case “Create Git repository on my Mac”, cette étape n’est pas à faire.

Équivalent en ligne de commande :

cd ~/monProjet
git init

Dans la barre des menus, il y a un onglet source contrôle. Pour le moment celui-ci ne nous permet pas de faire grand chose, hormis de créer un repo git ou de cloner un projet (depuis GitHub par exemple). Nous allons donc créer un repo git. Une fois sélectionné, un pop-up nous permet de choisir quel projet nous voulons ajouter à Git.

Création d’un repo distant depuis Xcode

Quand le projet est sous contrôle de Git, on voit qu’il y a un dossier avec le nom de notre projet dans l’onglet 2 du navigateur (navigateur du contrôle des sources). Si on ouvre son arborescence, on observe 3 dossiers :

  • Branches : contient nos branches Git (locale),
  • Tags : contient nos tags (nous n’en parlerons pas ici),
  • Remotes : contient nos repos distants (pour le moment il n’y a rien dedans).

Nous allons donc ajouter un repo GitHub depuis Xcode (oui c’est possible et c’est même super cool !). Pour cela, il suffit de faire un clic droit sur le dossier “Remotes” et sélectionner “Create ‘NomDuProjet’ Reomte..”.

Nous avons aussi la possibilité d’ajouter repo existant, mais nous ne le ferons pas ici.

Une fois sélectionné, un pop-up apparaît nous demandant de choisir les paramètres de notre repo externe, sa description sa visibilité et son nom.

Lorsque les paramètres sont remplis, on peut cliquer sur “Create” qui va nous créer le lien avec le repo GitHub et effectuer un premier push de notre repo Git local.

– Plutôt cool, non ? Nous n’avons pas eu besoin d’aller sur GitHub, de créer le repo, de l’ajouter à notre projet et de faire un push ! Tout cela en quelques clics sans quitter Xcode 💪🏻💪🏻💪🏻

Créer une nouvelle branche Git

Il est aussi possible de créer une nouvelle branche Git et GitHub depuis cette interface, mais aussi de les supprimer en local ET en distant !

Pour cela, un clic droit sur la branche de départ et on sélectionne “branch from maBrancheDeDepart”, on nomme la nouvelle branche et le tour est joué. Le checkout se fait automatiquement. On peut ensuite travailler dessus et lors du prochain commit, la nouvelle branche sera crée sur GitHub.

‼️ C’est le moment pour évoquer les bonnes pratiques de travail : on ne travaille JAMAIS sur la branche Master ! On crée une branche de développement et des branches pour les features depuis la branche de développement. On test puis on merge dans la branche de développement, etc. La branche Master est pour le code fonctionnel, testé et propre.

Équivalent en ligne de commande :

git checkout -b newBranche

// some awesome code

git commit -m "something new in my newBranch"

git push origin newBranche

git status
Utilisation de Xcode et de Git

– C’est bien sympa, mais pour le moment ça ne sert pas à grand chose… On va donc remédier à cela !

Pour cela, je vais créer un méthode qui va faire des choses incroyables (ou pas, le sujet n’est pas là). Quand il est codé je veux commit mon travail et le push sur GitHub, pour cela je peux utiliser le terminal et écrire :

git add -A

git commit -m "mon message de commit"

git push nomDeMonRepoDistant NomDeMaBranch

git status

Ou utiliser l’interface de Xcode avec le raccourci clavier “cmd + alt + c” ce qui a pour effet d’ouvrir une fenêtre ou nous pouvons sélectionner les fichier à commit, voir les modifications de chaque fichier depuis le dernier commit, choisir de ne pas commiter certaines modifications, push sur notre repo distant.

Nous avons ici la possibilité de ne pas commit chaque modification.

Ajouter un nouveau fichier aux sources Git

Lors de la création d’un nouveau fichier, il n’est pas mis automatiquement sous le contrôle de Git, il faut lui spécifier avant de le commiter. Il apparaît à côté du nouveau fichier un “?” identifiant que celui-ci n’est pas ajouté àGit ; un “A” signifie que le fichier est ajouté mais n’a pas encore été commit au moins une fois ; un “m” signifie que le fichier a été modifié et est sous contrôle, mais pas encore commit.

Équivalent en ligne de commande :

git ass newFile.swift

git commit -m "new file message"

git push origin developpe

git status

Avec l’interface graphique Xcode, cela donne :

Comme d’habitude, si on ne coche pas la case “push to remote” la version ne sera pas présente sur notre repo distant.

Merger une branche avec une autre

Une autre fonction intégrée est le merge de branches locales.

Nous avons la possibilité de rassembler le code d’une branche dans une autre et ce, de manière simple. La gestion des conflits est présente également.

Il suffit de faire un clic droit sur la branche cible et de sélectionner la bonne direction du merge et de confirmer. En cas de conflits, un écran permet d’inspecter son code et de détecter la source du problème.

Équivalent en ligne de commande :

git checkout developpe

git merge newBranch

Et voilà, on est sur la branche de destination et on peut à nouveau push son code fraîchement mergé sur son repo distant, via le menu “Source Controle”.

Voir son historique de versions en local et en distant

Lorsque nous nous trouvons dans l’onglet de navigation des sources (cmd + 2), nous avons la possibilité de voir l’ensemble de nos commits. Il est alors possible, en double cliquant sur un commit, de voir le détail de ce qui a été modifié. Depuis la liste des commits, il est aussi possible de faire un checkout sur un ancien commit ou de créer un nouvelle branche depuis ce même commit.

Comparer deux versions

Une des fonctions les plus cools est la visualisation des modifications. Un peu comme lorsqu’on veut commiter sa nouvelle révision. Il doit exister un équivalent en ligne de commande, mais je ne le connais pas.

Depuis Xcode 10, on voit des barres bleues sur le côté qui nous indiquent les modifications dans le fichier depuis le dernier commit et d’éventuellement les annuler. Mais on peut surtout, grâce à l’inspecteur de versions (bouton à droite de l’assistant editor), voir les différences entre la révision actuelle et n’importe quelle version du fichier sélectionné depuis son premier commit. Et ça, c’est franchement chouette !

Annuler les changements depuis le dernier commit

Si, depuis votre dernier commit, vous avez cassé votre code par une suppression hasardeuse, un ajout douteux ou que vous voulez rapidement tout annuler, il existe une méthode simple pour ça : annuler les changements (ligne par ligne, fichier par fichier ou tout les changements depuis le dernier commit).

Ligne par ligne : depuis Xcode 10, une barre bleue à gauche du code permet d’annuler les modifications apportées au fichier “ligne par ligne”. Pour cela, il suffit de cliquer sur cette barre bleue verticale et de sélectionner “Discard change”, cela aura pour effet immédiat de supprimer toute les modifications de ces lignes.

✋🏼‼️ Pro tips : si en faisant cette action vous avez ajouté un breakpoint par mégarde, vous pouvez le supprimer en faisant un clic droit / delete Breakpoint ou plus simplement, avec un cliqué déplacé vers la gauche.

Si vous voulez annuler tous les changements dans un fichier sous contrôle de Git, il est possible de faire un clic droit / Discard changes in “AwesomeStruct.swift” ou aller dans le menu “source control / Discard changes in “AwesomeStruct.swift””. Cela fonctionne même si on sélectionne plusieurs fichiers.

Si toutefois les changements apportés sont trop profonds, il reste la possiblité de tout annuler et de revenir à la version du précèdent commit. Pour ce faire, allez dans le menu “source control / Discard all changes”.

⚠️ Attention, en faisant ainsi, toutes vos modifications seront perdues ! Le bien-aimé cmd + z / cmd + maj + z ne servira à rien…

Supprimer un repo local ou distant

Enfin, il est possible de supprimer une branche locale, mais aussi une branche distante (simplement de notre arbre locale ou de notre repo distant) ! Pour se faire, un simple clic droit / delete suffit. Pour notre repo distant, il faudra aussi cocher la case “also delete branch on the remote repository” si tel est votre volonté.

Conclusion

Pour moi, oui Git + Xcode, c’est une belle histoire.

J’espère que vous aurez appris quelque chose ! Personnellement, je ne me sers quasiment plus du terminal pour mon versionning, sauf pour résoudre des problèmes spécifiques en cas de mauvais usage de l’outil.

Effectivement, comme tout les outils graphiques, il demande d’utiliser un peu la souris, mais à mon sens, le jeu en vaut la chandelle !

Je n’ai pas trouvé / n’existe pas de raccourci clavier pour valider son commit depuis la fenêtre de commit. Et pour le coup, une touchBar est super pratique car ce bouton y est présent et évite donc de déplacer sa souris. 💪🏻😎

Nicolas • Développeur iOS Swift  Nantes

MENTIONS LÉGALES

© 2019 Nicolas Bachur. Tous droits réservés.