le système de gestion de version gitschwoon/enseignement/.../tutoriel_git.pdf · git carte...

27
Le système de gestion de version Git Projet programmation 2 – 1A – ENS Cachan GROSSHANS Nathan [email protected] 3 février 2017

Upload: others

Post on 10-Aug-2020

4 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Le système de gestion de version Gitschwoon/enseignement/.../Tutoriel_Git.pdf · Git Carte d’identité Système de gestion de version distribué (DVCS). Bref historique (Wikipedia)

Le système de gestion de version GitProjet programmation 2 – 1A – ENS Cachan

GROSSHANS [email protected]

3 février 2017

Page 2: Le système de gestion de version Gitschwoon/enseignement/.../Tutoriel_Git.pdf · Git Carte d’identité Système de gestion de version distribué (DVCS). Bref historique (Wikipedia)

Introduction

Système de gestion de versionSystème logiciel permettant de maintenir et gérer toutes lesversions d’un ensemble de fichiers.

Pourquoi un système de gestion de version ?I Revenir aisément à une version précédente.I Suivre l’évolution du projet au cours du temps.I Permettre le travail en parallèle sur des parties disjointes du

projet et gérer les modifications concurrentes.I Faciliter la détection et la correction d’erreurs.I ...

Ouvrage de référencehttp://git-scm.com/book

Page 3: Le système de gestion de version Gitschwoon/enseignement/.../Tutoriel_Git.pdf · Git Carte d’identité Système de gestion de version distribué (DVCS). Bref historique (Wikipedia)

Différents types de systèmes de gestion de versionSystème de gestion de version local

AvantagesI Gestion et utilisation très

simples.

InconvénientsI Est très sensible aux pannes.I Ne permet pas la collaboration.

Page 4: Le système de gestion de version Gitschwoon/enseignement/.../Tutoriel_Git.pdf · Git Carte d’identité Système de gestion de version distribué (DVCS). Bref historique (Wikipedia)

Différents types de systèmes de gestion de versionSystème de gestion de version centralisé

AvantagesI Structurellement simple.I Gestion et utilisation simples.

InconvénientsI Est très sensible aux pannes.I Inadapté aux très grands projets

et/ou avec une forte structurehiérarchique.

Page 5: Le système de gestion de version Gitschwoon/enseignement/.../Tutoriel_Git.pdf · Git Carte d’identité Système de gestion de version distribué (DVCS). Bref historique (Wikipedia)

Différents types de systèmes de gestion de versionSystème de gestion de version distribué

AvantagesI Moins sensible aux pannes.I Adapté aux très grands projets

et/ou avec une forte structurehiérarchique.

InconvénientsI Gestion et utilisation plus

compliquées.I Peut devenir très complexe

structurellement.

Page 6: Le système de gestion de version Gitschwoon/enseignement/.../Tutoriel_Git.pdf · Git Carte d’identité Système de gestion de version distribué (DVCS). Bref historique (Wikipedia)

GitCarte d’identité

Système de gestion de version distribué (DVCS).

Bref historique (Wikipedia)

I De 1991 à 2002, le noyau Linux était développé sans utiliserde système de gestion de version.

I A partir de 2002, la communauté a commencé à utiliserBitKeeper, un DVCS propriétaire.

I En 2005, suite à un contentieux, BitKeeper retire la possibilitéd’utiliser gratuitement son produit. Linus Torvalds lance ledéveloppement de Git et après seulement quelques mois dedéveloppement, Git héberge le développement du noyau Linux.

Page 7: Le système de gestion de version Gitschwoon/enseignement/.../Tutoriel_Git.pdf · Git Carte d’identité Système de gestion de version distribué (DVCS). Bref historique (Wikipedia)

GitLes principes de base

Un dépôt Git est une sorte de système de fichiers (base dedonnées), enregistrant les versions de fichiers d’un projet à desmoments précis au cours du temps sous forme d’instantanés.

Comment fonctionne le processus de versionnement ?

Page 8: Le système de gestion de version Gitschwoon/enseignement/.../Tutoriel_Git.pdf · Git Carte d’identité Système de gestion de version distribué (DVCS). Bref historique (Wikipedia)

GitLes principes de base

3 sections d’un projet Git :I Le répertoire Git/dépôt :

contient les méta-données et labase de données des objets duprojet.

I Le répertoire de travail :extraction unique d’une versiondu projet depuis la base dedonnées du dépôt.

I La zone de transit/d’index :simple fichier contenant desinformations à propos de ce quisera pris en compte lors de laprochaine soumission.

Page 9: Le système de gestion de version Gitschwoon/enseignement/.../Tutoriel_Git.pdf · Git Carte d’identité Système de gestion de version distribué (DVCS). Bref historique (Wikipedia)

GitLes principes de base

4 états d’un fichier dans Git :I non versionné : fichier n’étant

pas ou plus géré par Git ;I non modifié : fichier sauvegardé

de manière sûre dans sa versioncourante dans la base dedonnées du dépôt ;

I modifié : fichier ayant subi desmodifications depuis la dernièrefois qu’il a été soumis ;

I indexé (staged) : idem, sauf qu’ilen sera pris un instantané danssa version courante lors de laprochaine soumission (commit).

Page 10: Le système de gestion de version Gitschwoon/enseignement/.../Tutoriel_Git.pdf · Git Carte d’identité Système de gestion de version distribué (DVCS). Bref historique (Wikipedia)

GitLes principes de base

Chaque soumission (commit) donne lieu à la création d’un objet“commit” contenant un pointeur vers un instantané du contenudont les modifications étaient indexées au moment de lasoumission (ensemble d’objets permettant de stocker un instantanédes fichiers concernés d’une part et de reproduire la structure durépertoire projet et de ses sous-répertoires d’autre part), quelquesméta-données (auteur, message) et un pointeur vers l’objet“commit” précédent.

Page 11: Le système de gestion de version Gitschwoon/enseignement/.../Tutoriel_Git.pdf · Git Carte d’identité Système de gestion de version distribué (DVCS). Bref historique (Wikipedia)

GitLes commandes de base

Initialiser un dépôt$ git init

Afficher l’état des fichiers du répertoire courant$ git statusI Untracked files : fichiers non versionnés.I Changes to be committed : modifications (ajout, suppression,

changements) chargées en zone de transit (staging area), ouindexées.

I Changes not staged for commit : modifications n’ayant pasété chargées en zone de transit (ou indexées).

Page 12: Le système de gestion de version Gitschwoon/enseignement/.../Tutoriel_Git.pdf · Git Carte d’identité Système de gestion de version distribué (DVCS). Bref historique (Wikipedia)

GitLes commandes de base

Indexer l’ajout ou les changements d’un fichier$ git add <fichier>

Indexer la suppression d’un fichier$ git rm <fichier>

Annuler l’indexation des modifications d’un fichier$ git reset <fichier>

Annuler les modifications non encore indexées d’un fichier$ git checkout [––] <fichier>

Déversionner un fichier$ git rm ––cached <fichier>

Page 13: Le système de gestion de version Gitschwoon/enseignement/.../Tutoriel_Git.pdf · Git Carte d’identité Système de gestion de version distribué (DVCS). Bref historique (Wikipedia)

GitLes commandes de base

Afficher le détail des modifications non indexées$ git diff

Afficher le détail des modifications indexées$ git diff ––staged

Soumettre les modifications indexées en zone de transit$ git commit

Voir l’historique des soumissions$ git log

Page 14: Le système de gestion de version Gitschwoon/enseignement/.../Tutoriel_Git.pdf · Git Carte d’identité Système de gestion de version distribué (DVCS). Bref historique (Wikipedia)

GitBranches

Qu’est-ce qu’une branche dans un projet ?C’est une ligne d’évolutiondivergeant de la ligned’évolution courante, celles-cise poursuivantindépendamment l’une del’autre.

Pourquoi des branches ?I Pouvoir se lancer dans des évolutions ambitieuses en ayant

toujours la capacité de revenir à une version stable que l’onpeut continuer à maintenir indépendamment.

I Pouvoir tester différentes implémentations d’une mêmefonctionnalité de manière indépendante.

Page 15: Le système de gestion de version Gitschwoon/enseignement/.../Tutoriel_Git.pdf · Git Carte d’identité Système de gestion de version distribué (DVCS). Bref historique (Wikipedia)

GitBranches

Une branche dans Git est tout simplement un pointeur vers unobjet “commit”. Par défaut, il en existe une seule, nommée“master”.

Créer une nouvelle branche$ git branch <branche>

HEAD est un pointeur spécial vers labranche sur laquelle on travailleactuellement (extraite dans lerépertoire de travail).

Page 16: Le système de gestion de version Gitschwoon/enseignement/.../Tutoriel_Git.pdf · Git Carte d’identité Système de gestion de version distribué (DVCS). Bref historique (Wikipedia)

GitBranches

Voir les branches du dépôt local$ git branch

Supprimer une branche$ git branch –d <branche>

Passer à une branche donnée (mise à jour de l’index et durépertoire de travail, ainsi que du pointeur HEAD)$ git checkout <branche>

Page 17: Le système de gestion de version Gitschwoon/enseignement/.../Tutoriel_Git.pdf · Git Carte d’identité Système de gestion de version distribué (DVCS). Bref historique (Wikipedia)

GitBranches

Deux façons pour incorporer les modifications d’une branche dansla branche courante.

Fusionner (merge) Rebaser (rebase)

Page 18: Le système de gestion de version Gitschwoon/enseignement/.../Tutoriel_Git.pdf · Git Carte d’identité Système de gestion de version distribué (DVCS). Bref historique (Wikipedia)

GitBranches

Fusionner les modifications d’une branche donnée dans labranche courante (HEAD)$ git merge <branche>

I Si l’objet “commit” pointé par <branche> est déjà un ancêtrede l’objet “commit” courant (HEAD), alors rien n’est fait.

I Si l’objet “commit” pointé par <branche> est un descendantde l’objet “commit” courant, seul le pointeur de la branchecourante est déplacé sur l’objet “commit” concerné par lafusion (“fast-forward”).

Page 19: Le système de gestion de version Gitschwoon/enseignement/.../Tutoriel_Git.pdf · Git Carte d’identité Système de gestion de version distribué (DVCS). Bref historique (Wikipedia)

GitBranches

I Autrement, Git se base sur trois instantanés différents, celuide l’objet “commit” courant, celui de l’objet “commit” pointépar <branche> et celui de l’objet “commit” correspondant auplus jeune ancêtre commun des deux premiers objets“commit”, pour créer un nouvel instantané associé à unnouvel objet “commit” par la fusion de deux branches, surlequel la branche courante pointera à présent.

Page 20: Le système de gestion de version Gitschwoon/enseignement/.../Tutoriel_Git.pdf · Git Carte d’identité Système de gestion de version distribué (DVCS). Bref historique (Wikipedia)

GitBranches

En cas de conflit empêchant la fusionI Aucun objet “commit” de fusion n’est créé, mais le processus

est mis en pause.I git status donne les fichiers n’ayant pas pu être fusionnés

(listés en tant que “unmerged”).I Git ajoute des marqueurs de résolution de conflits à tout

fichier sujet à conflits afin que ceux-ci puissent être résolus àla main.

I Pour marquer les conflits dans un fichier <fichier> commerésolus, il faut faire git add <fichier>. On peut, aprèsrésolution de tous les conflits, soumettre les modificationssous forme d’objet “commit” de fusion avec git commit etterminer ainsi le processus de fusion.

Page 21: Le système de gestion de version Gitschwoon/enseignement/.../Tutoriel_Git.pdf · Git Carte d’identité Système de gestion de version distribué (DVCS). Bref historique (Wikipedia)

GitBranches

Rebaser les modifications de la branche courante (HEAD) surune branche donnée$ git rebase <branche>

I Aller à l’objet “commit” correspondant au plus jeune ancêtrecommun des deux objets “commit” pointés par la branchecourante et <branche>.

I Obtenir et sauvegarder les changements introduits depuis cepoint par chaque objet “commit” de la branche courante.

I Faire pointer la branche courante sur le même objet “commit”que <branche> et réappliquer tous les changements un parun.

Page 22: Le système de gestion de version Gitschwoon/enseignement/.../Tutoriel_Git.pdf · Git Carte d’identité Système de gestion de version distribué (DVCS). Bref historique (Wikipedia)

GitTravail avec des dépôts distants

Pour collaborer, il est nécessaire de communiquer et d’échangeravec un ou plusieurs dépôts distants hébergeant le même projet(typiquement des dépôts publics associés à une personne, uneéquipe ou tout le projet).

Les données des dépôts distants (objets “commit” et instantanés)sont entièrement copiées dans le dépôt local, et pour chaquebranche <branche> d’un dépôt distant <dépôt> est maintenue unebranche locale <dépôt>/<branche> non modifiable, permettantde suivre la position de <branche> sur <dépôt> localement.

Afficher la liste de tous les dépôts distants du projet$ git remote

Page 23: Le système de gestion de version Gitschwoon/enseignement/.../Tutoriel_Git.pdf · Git Carte d’identité Système de gestion de version distribué (DVCS). Bref historique (Wikipedia)

GitTravail avec des dépôts distants

Cloner un dépôt distant (automatiquement nommé origin)$ git clone <URL> [<répertoire>]

Page 24: Le système de gestion de version Gitschwoon/enseignement/.../Tutoriel_Git.pdf · Git Carte d’identité Système de gestion de version distribué (DVCS). Bref historique (Wikipedia)

GitTravail avec des dépôts distants

Récupérer les modifications d’un dépôt distant$ git fetch <dépôt>

Page 25: Le système de gestion de version Gitschwoon/enseignement/.../Tutoriel_Git.pdf · Git Carte d’identité Système de gestion de version distribué (DVCS). Bref historique (Wikipedia)

GitTravail avec des dépôts distants

Ajouter un dépôt distant$ git remote add <nom> <URL>

Page 26: Le système de gestion de version Gitschwoon/enseignement/.../Tutoriel_Git.pdf · Git Carte d’identité Système de gestion de version distribué (DVCS). Bref historique (Wikipedia)

GitTravail avec des dépôts distants

Mettre à jour un dépôt distant donné pour une certainebranche locale$ git push <dépôt> <branche>Attention : ceci fonctionne uniquement si le dernier objet“commit” de la branche concernée du dépôt distant a été récupéréet intégré dans la branche en question du dépôt local, en d’autrestermes si la mise à jour de la branche du dépôt distant peut êtrefaite par “fast-forward”.

Combiner git fetch et git merge$ git pull <dépôt> <branche>

Combiner git fetch et git rebase$ git pull ––rebase <dépôt> <branche>

Page 27: Le système de gestion de version Gitschwoon/enseignement/.../Tutoriel_Git.pdf · Git Carte d’identité Système de gestion de version distribué (DVCS). Bref historique (Wikipedia)

GitConseils, bonnes pratiques

ConseilsI User et abuser des branches.I Eviter de systématiquement faire un git pull, mais réfléchir

à ce qu’il est le plus pertinent de faire (fusionner ou rebaser).

Bonnes pratiquesI Ne jamais rebaser une branche déjà présente sur un dépôt

public.I Respecter les conventions de formattage du message de

soumission : titre de 50 caractères au plus, suivi d’une lignevide puis d’une description détaillée avec des lignes de 72caractères au plus, le tout au présent de l’impératif(http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html).