Introduction à Git

par Samuel Bancal EPFL-ENAC-IT, © Creative Commons BY-SA

(version 2020-09-23)

1 En trois mots

«Distributed VCS (Version Control System)»

Git est défini comme un outil permettant le contrôle des versions d’un projet, mono ou multi contributeurs.

Il a été créé en 2005 par Linus Torwald pour gérer, entre autres, le code source du noyau Linux, projet dépassant aujourd’hui les 17’000’000 lignes de code et rassemblant généralement plus de 1’200 contributeurs pour chaque release majeure.

Voici quelques caractéristiques principales de git :

2 Installation

Suivez la notice d’installation !

3 Vocabulaire

3.1 un commit

La référence qui permet de retrouver l’état du projet à un moment donné dans le temps. Il peut être vu comme un snapshot ou une photo instantannée de l’ensemble du projet à un moment dans le temps. Il inclut chaque fichier et dossier, avec l’ensemble des modifications qui ont été enregistrées dans l’historique du projet.

Chaque commit a un identifiant généré avec l’algorithme de hachage SHA-1 passé sur l’entier du contenu du commit (tous les fichiers, la date, le nom et email du commiter, le message du commit et l’identifiant du précédent commit). Cet identifiant ressemble à ceci : ecd91c9baab1e7cab9dce65fa9dbefdaf13cd34d et est généralement résumé aux 7 premiers caractères : ecd91c9.

Dans le schéma ci-dessous, représenté par les ronds turquoises.

3.2 le stage ou cache

L’espace temporaire dans lequel on ajoute les fichiers / dossiers que l’on prévoit d’inclure au prochain commit.

3.3 une branche

Le chemin qui relie plusieurs commits. Elle est signifiée par une référence qui est posée sur le commit le plus récent de celle-ci.Commit

La branche par défaut se nomme master et est destinée, par convention, à être la branche principale du projet.

On sera intéressé à créer de nouvelles branches, lorsqu’on souhaitera introduire de nouvelle choses dans le projet, sans pour autant bloquer le développement global du projet. Ainsi le développement d’une nouvelle fonctionnalité feature1 pourra prendre un peu de temps et n’empêchera pas la branche principale d’évoluer. Pareil pour la correction d’un bug bugfix1, comme le montre le schéma ci-dessous.

3.4 un merge

Le commit que l’on fait lorsque 2 branches sont finalement rassemblées en une seule. Cela signifie que les modifications effectuées dans chaque branche sont fusionnées pour donner un code source qui contient l’assemblage des 2.

3.5 un tag

L’étiquette que l’on peut ajouter sur un commit signifiant généralement une version majeure. Elle sert ensuite de référence pour repérer les commits significatifs.

4 Premières commandes pour commencer à travailler en local

4.1 Configuration initiale

Ce qui est fait avec git config --global est fait une fois pour toutes sur votre machine. Pas besoin de le refaire pour chaque projet.

git config --global user.name "Prénom Nom"
git config --global user.email mon.email@example.com
git config --global alias.st status

Avec cette commmande vous ajoutez un alias (raccourcis clavier) à votre config git. Ainsi vous pourrez faire git st … qui sera un raccourcis vers git status.

git config --list

Détails de git config

4.2 Initialisation d’un nouveau dépôt

Transformer un dossier normal en un dépôt git.

git init

Détails de git init

4.3 Clone d’un dépôt existant

Vous avez trouvé un dépôt qui vous intéresse? Vous pouvez en avoir une copie sur votre machine.

git clone <repo_URL>

Détails de git clone

5 Commandes pour faire un commit

5.1 Ajout de fichier(s) à l’index (stage)

git add <filename_or_foldername>

Détails de git add

Quelques options fréquement utilisées :

Lorsque vous souhaitez ajouter toute une arborescence de fichier, ajoutez simplement le dossier parent.
. fait référence au dossier courant … ça peut être utile!

5.2 Suppression de fichier(s) du dépôt

git rm <filename_or_foldername>

Quelques options fréquement utilisées :

Détails de git rm

5.3 Status des fichiers courants

Connaître quels fichiers ne sont pas commités, lesquels sont prêts à l’être

git status

Détails de git status

5.4 Créer un commit

Créé un commit, photo de l’état courant avec les fichiers ajoutés au stage

git commit

Détails de git commit

Quelques options fréquement utilisées :

5.5 Lister les commits

Donne une vue de l’historique des commits

git log

Voici un alias personnel que je vous recommande. Il permet d’avoir une vue sur les commits beaucoup plus complète et condensée qu’avec la commande git log. Il est d’ailleurs utilisé dans les vidéos de cours.

git config --global alias.lg "log --pretty=format:'%C(auto)%h %C(normal dim)%ai%C(reset) %C(auto)%D %s' --all --graph"

Ainsi, l’historique peut maintenant être parcouru avec :

git lg

Détails de git log

5.6 Ajout, listing et suppression d’un tag

git tag
git tag <tag_name> [<commit>]

Cela ajoute le tag tag_name sur le commit référencé par <commit> ou le commit courant s’il n’est pas spécifié.

git tag -d <tag_name>

Détails de git tag

6 Commandes pour travailler avec des branches

6.1 Liste, crée, renomme ou supprime des branches

git branch
git branch <branch_name>
git branch -m <branch_name> <new_branch_name>
git branch -d | --delete <branch_name>

Note : Si la suppression d’une branche signifierait la perte de référece sur un ou plusieurs commits alors cela est refusé. Il faudra alors ajouter l’option --force

Détails de git branch

6.2 Déplacement d’une branche à une autre

git checkout <branch_name>

Quelques options fréquement utilisées :

Détails de git checkout

6.3 Joindre deux branches en une

Incorprorer les changements faits sur une autre branche pour les inclure dans la branche courante.

git merge branch_name

Cela donne ce qui est représenté dans la figure ci-dessous :

Détails de git merge

6.4 Rejouer les commits d’une branche sur une autre

Pour éviter d’avoir un historique complexe (avec plusieurs branches visibles), il est possible de rejouer les commits d’une branch sur une autre. Cela permet d’avoir au final tous les changements effectués par les 2 branches et avoir un historique linéaire (qu’une seule branche visible).

git rebase branch_name

Cela donne ce qui est représenté dans la figure ci-dessous :

Détails de git rebase

7 Commandes pour travailler avec un dépôt

Lorsqu’on va travailler avec un dépôt distant, par http ou ssh, notre dépôt restera le même, avec quelques ajouts :

Pour chaque branche locale nous devrons décider si elle est répliquée ou pas sur le dépôt.

7.1 Créer localement un clone d’un dépôt déjà existant

Lorsque vous connaissez l’adresse d’un dépôt qu’il vous intéresse d’avoir une copie du code sur votre machine, utilisez git clone. Cela créera un dossier à l’emplacement courant, qui sera un clone du projet et dont le remote nommé origin pointera sur le projet original.

git clone <repository_address>

Détails de git clone

7.2 Envoi des commit locaux vers le dépôt

git push [--tags]

Quelques options fréquement utilisées :

Note. Au premier push d’une branch, il sera nécessaire d’indiquer que cette branch est répliquée sur le dépôt avec :

git push --set-upstream <remote> <branch>

Détails de git push

7.3 Récupèration des commits du dépôt sans les appliquer localement

git fetch

Cette commande va consulter de dépôt pour connaître les derniers changements, les récupérer localement dans les branches origin/*.

Détails de git fetch

7.4 Récupèration des commits du dépôt en les appliquant localement

git pull

Cette commande fait la même chose que la commande git fetch, puis fait un git merge pour appliquer les changements sur la copie locale et déplacer les branches locales aux derniers commits.

Note. Dans le cas où des changements sur les fichiers n’ont pas encore été commités ou que des commits ont été faits localement, différents de ceux distants, cette commande retournera une erreur et demandera à l’utilisateur de résoudre les conflits liés à ces changements!

Détails de git pull

7.5 Gérer les dépôts distants

git remote add <name> <url>
git remote rename <old> <new>
git remote remove <name>

Détails de git remote

8 Dossiers / Fichiers particuliers

8.1 .git/

Emplacement : à la racine du dossier projet

Utilité : Dossier créé et géré par la commande git dans lequel se trouve tout l’historique du projet, les commits, les tags, les branches, les remotes, …

8.2 .gitignore

Emplacement : à la racine du dossier projet ou dans n’importe quel sous-dossier de celui-ci

Utilité : Fichier spécifiant les fichiers et dossiers que l’on ne veut pas inclure dans les commits. Typiquement :

8.3 .gitconfig

Emplacement : dans le dossier home de l’utilisateur courant

Utilité : Contient toutes les configuration personnelles de l’utilisateur. Typiquement :

9 Les limitations :

Bien que Git soit extrèmement robuste et souple à la fois, il est initialement conçu pour gérer du code source (donc des fichiers qui ne sont pas très lourds). Il sera donc moins efficace lorsqu’il serait utilisé pour gérer des fichiers de plus grande taille (>50MB).


cc-by-sa Samuel Bancal, EPFL, ENAC-IT (2020)