Comprendre et utiliser Git avec vos projets

Si vous découvrez le système de gestion de version Git et que vous l'utilisez seul, occasionnellement, etc. il existe peut être encore beaucoup de zone d'ombre dans son utilisation et dans la totalité des possibilités que le système offre.

C'est également mon cas et tout le long de mon amélioration continue à l'utilisation de Git, je vais maintenir cet « aide-mémoire ». Il résumera le fonctionnement de Git au sein d'une branche dans un premier temps, et le fonctionnement de Git à travers diverses branches dans un second temps.

Si vous ne connaissez vraiment pas grand chose à GIT n'ésitez pas à lire : Démarrage rapide de GIT et particulièrement :

Projet Git au sein d'une branche

Avant de commencer, il me semble important de se rappeler que Git copie l'intégralité d'un Repository (Dépôt) en local et que la majorité des actions effectués seront locals. Recherche, changement de version, changement de branche, tout sera très rapide !

Voici un schéma interactif de toutes les interactions dans le système de gestion de version de Git, vous pourrez aisément constater les actions en local bien plus nombreuse que les autres. Cliquez sur un élément pour accéder à son descriptif ci-après.

commit -a
add
commit
push
pull [-r]
fetch
merge or rebase
checkout HEAD
checkout
reset
reset
diff HEAD
diff
Local

Workspace

Index
Internet

Local Repository

Remote Repository

Workspace

Le Workspace ou Working Tree ou Working Directory (Espace de travail) est une extraction unique d'une version du projet à partir de laquelle vous pouvez travailler. Ce dossier est stocké sur votre machine. Les fichiers ici sont soit identique au dernier instantané enregistré dans le Local Repository soit à l'état « Modifié ».

Index

L'Index ou Staging Area correspond à la liste complète des fichiers présents physiquement dans votre Workspace qui on été déclarés comme faisant parti du prochain instantané que vous allez effectuer. Il est donc possible qu'un fichier présent dans le Workspace ne soit pas présent dans l'Index si vous ne l'avez pas ajouté. Les fichiers indexé sont dans un état « Indexé ».

Local Repository

Le Local Repository (Dépôt local) est le dossier .git stocké dans votre Workspace, c'est une copie totale et sur votre machine du Remote Repository dans lequel vous aller stocker vos instantanés du projet. C'est un « clone » du Remote Repository et les fichiers ici sont dans un état « Validé ».

Remote Repository

Le Remote Repository (Dépôt distant) est le dossier dans lequel est stocké le projet sur le serveur et faisant office de référant. Vous ne pouvez pas directement modifier ses fichiers. C'est la référence lorsque vous « cloné » un projet sur votre environnement.

add

Utiliser add permet d'ajouter des fichiers présent dans votre Workspace à l'Index en prévisions d'une monté sur les Repository. Chaque fichier passe donc de l'état « Modifié » à « Indexé ».

reset

Utiliser reset permet de retirer des fichiers de l'Index ou annulé un commit au Local Repository tout en conservant (ou non) les modifications faites. Pour annuler les modifications faites tout en laissant les Index et Local Repository en place il faut utilister revert.

commit

Utiliser commit permet de déposer l'intégralité des fichiers de votre Index dans le Local Repository sous un nouveau instantané. Chaque fichier passe donc d' « Indexé » à « Validé ».

commit -a

Utiliser commit -a pour ajouter automatiquement la totalité des nouveaux fichiers à l'Index puis les pousser dans le Local Repository.

push

Utiliser push pour aligner l'intégralité des fichiers du Local Repository sur le Remote Repository.

fetch

Utiliser fetch pour aligner l'intégralité des fichiers du Remote Repository avec votre Local Repository.

merge ou rebase

Utiliser merge pour ré-aligner les modifications présentent entre vos instantanés de votre Local Repository avec ceux rapatrier du Remote Repository (pour plus d'information sur la différence entre merge et rebase voir ici).

pull [-r]

Utiliser pull ré-aligne les modifications présentent entre le Remote Repository et votre Local Repository. En cas de conflit, l'action fetch aura été effectuée et vous devrez résoudre les conflits et utiliser merge vous même.

checkout

Utiliser checkout permet d'aligner son Workspace avec un des instantané versionné du Local Repository (en déplaçant le HEAD) ou des fichiers de l'Index.

status ou diff

Utiliser status ou diff permet de comparer vos fichiers du Workspace avec celle de l'Index ou du Local Repository. Vous pouvez ainsi voir ce qui a changé dans un comparateur de version.

stash

Utiliser stash pour sauvegarder l'état de votre Workspace et votre Index afin de ne pas perdre votre travail lors d'un checkout, cela vous permet de ne pas commit un travail à moitié fini.

Pour en savoir plus, vous pouvez lire Les Bases de GIT et plus particulièrement :

Projet Git sur plusieurs branches

Comme créer une branche ne revient qu'à créer des aiguillages de commit, cette opération est très rapide. Il ne faut donc pas hésiter à le faire ! Je vous propose ici une structure de travail avec plusieurs branches pour un projet afin de vous organiser en équipe.

Il me semble que la structure proposée par SmartGit est pertinente aussi vais-je la décrire juste après ce schéma.

Model à plusieurs Branches

Le but d'une branche et sa position dans l'avancement du travail sur le projet depuis le développement jusqu'au livrable doit être indiqué dans son nom, c'est pourquoi nous utiliserons les noms suivants :

  • release/{branch name} – chaque livrable est associé à une branche correspondant à une version final de l'application.
  • master – une branche permanente comme référence correspondant à la version définitive des modifications entre chaque version de l'application. Elle correspond donc à chaque instant à la dernière version de l'application.
  • develop – une branche permanente contenant l'avancement de l'application dans son ensemble au file des versions, avec des branches de fonctionnalités créer à partir de cette version et reversé dedans.
  • feature/{branch name} – chaque fonctionnalité correspond au travail sur un sujet particulier (ex: un bugfix, une nouvelle fonctionnalité...).
  • hotfix/{branch name} – des branches pour s'occuper des fixes urgent à apporter qui seront prioritairement reversé dans le master puis reversé dans la develop en attendant de finir dans le prochain livrable.

Pour en savoir plus, vous pouvez lire Les Branches avec GIT. et plus particulièrement :