
| Item | Bitbucket | GitHub | GitLab |
| VCS supportés nativement | ![]() ![]() |
![]() |
![]() ![]() |
| Repository privés | Repos privés gratuits | Pas de repos privés gratuits | Repos privés gratuits |
| Repository publics | Repos publics gratuits | Repos publics gratuits | Repos publics gratuits |
| Merge Request | Non | Oui | Oui |
| Plateforme d'intégration continue | Oui | Non. Une application tierce peut être utilisée | Oui |
| Open-Source | Partiellement. Seulement quelques fonctionalités sont open-source | Pas open-source | Open-source platform |
| Large size file storage | Oui | Oui | Oui |
| Integration d'outils tierces | Oui | Oui | Oui |
| Points forts | CI/CD - Produit Open source - Auto hébergement gratuit | Communauté Open Source importante - Nombreux outils tierces | Intégration native avec Jira / Trello outil de suivi de bugs, de gestion des incidents / outil de gestion de projet |
| Points faibles | Fonctionnalités pas aussi nombreuses que Gitlab et Github notamment sur l'interaction avec le code | Repo privés payants | Lenteurs possibles sur l'interface |


gitVersion Control: Chaque étape de développement du projet est mémorisé, comme pris en photo.
Distribué: Chaque dépôt, sur chaque machine est autonome. Pas besoin d’être connecté pour travailler.
Collaboratif: Lorsque plusieurs personnes souhaitent collaborer sur un même projet, l’utilisation d’un dépôt de référence permet de gérer les contributions de chacun : Github / Gitlab par exemple
Flexible: De tout petits à de très larges projets, mono ou multi contributeurs
Répertoire de travail : Les fichiers que l’on manipule et qui correspondent à une extraction unique d’une version du projet
Index, staging area : désigne tous les fichiers modifiés que vous souhaitez voir apparaître dans votre prochain commit.
Repository local : référentiel qui stocke les commits et les autres informations qui sont utiles à la gestion de versions du projet
Repository distant : référentiel distant (remote) qui sert à partager l'historique de commits ou à le synchroniser avec d’éventuels membres d’une équipe
origin : nom abrégé du référentiel distant à partir duquel un projet a été cloné à l'origine
référence qui permet de retrouver l’état du projet à un moment donné dans le temps
inclut chaque fichier et dossier, avec l’ensemble des modifications qui ont été enregistrées dans l’historique du projet.
identifiable par un hash (SHA-1). Exemple : ecd91c9baab1e7cab9dce65fa9dbefdaf13cd34d généralement résumé aux 7 premiers caractères : ecd91c9.
Le chemin qui relie plusieurs commits
La branche par défaut se nomme master et est destinée, par convention, à être la branche principale du projet
Permet le développement de différentes versions en parallèle
1 pointeur vers un commit (le plus récent)
Une étiquette/un alias identifiant un commit
Permet la persistance d'un commit
Principalement utilisé pour identifier les versions officielles d'un logiciel
Evènement particulier du cycle utilisable comme déclencheur dans la CI/CD
$ git tag v1.3 -m "Première version livrée à l'AIT"
Fusionner 2 branches / Réconcilier 2 historiques
Rapatrier les modifications d'une branche dans une autre
$ git <command> <arguments>
$ git help
$ git help <command>
$git config --global user.name "Votre nom"
$git config --global user.email "votre @mail"
$ git init mon_projet
$git clone git@gitlab.in2p3.fr:ri3/ecole-info/2021/anf-qualite-logicielle.git
$git clone https://gitlab.in2p3.fr/ri3/ecole-info/2021/anf-qualite-logicielle.git
.gitignore*.txt
dossier/
dossier2/*.jpg
motdepasse.csv
/ressources/*
!/ressources/presentations
| Ligne | Effet |
|---|---|
*.txt |
Cette ligne permettra d'ignorer tous les fichiers textes où qu'ils soient |
dossier/ |
Cette ligne ignorera l'ensemble du contenu de dossier et par extension, le dossier lui-même (Git ne conserve pas les dossiers vides) |
dossier2/*.jpg |
Cette ligne ignorera les *.jpg dans le dossier2. Par contre, si dossier2 a des enfants (dossier2/sousdossier1) et des jpg à l'intérieur, il seront versionnés |
motdepasse.csv |
Cet ligne permet d'ignorer le fichier motdepasse.csv dans le dossier principal |
/ressources/*/!/ressources/presentations |
Ces ligne permettent d'ignorer le contenu du répertoire ressources sauf ce qui se trouve dans presentations |
$ git status
>> Sur la branche cyril_branch_demo rien à valider, la copie de travail est propre
$ echo "Ajout d'une ligne dans mon fichier" > monFichier.txt
$ git status
>> Sur la branche cyril_branch_demo
>> Fichiers non suivis :
(utilisez "git add <fichier>..." pour inclure dans ce qui sera validé)
monFichier.txt
$ git add monFichier.txt
$ git status
>> Sur la branche cyril_branch_demo
>> Modifications qui seront validées :
(utilisez "git restore --staged <fichier>..." pour désindexer)
nouveau fichier: monFichier.txt
$ git commit -m “message pour expliquer ce que j’ai fait”
$ git status
>> Sur la branche cyril_branch_demo, rien à valider, la copie de travail est propre
Faire des commits fréquents
Ecrire des messages de commits clairs
Un formalisme peut être adopté pour cette partie
git push <remote> <branche>
git push <remote> --all # Permet d'envoyer toutes les branches
git push <remote> --force
git fetch <remote> <branche>
git fetch <remote> # Récupère toutes les branches et tous les commits
git pull <remote> <branche>
git pull <remote>
Interagir sur un dépot distant : la base pour un outil collaboratif
Par contre interagir sur la même branche peut poser problème
Il est donc nécessaire de créer des branches et de bien les organiser
Par convention, au départ d'un projet il existe une seule branche : master (ou main)
Mais idéalement on ne fait jamais de git push sur cette branche master
Il est nécessaire de créer des branches qui correspondent à des unités de développement
git branch git branch # Permet de lister les branches
git branch <branche> # Permet de créer une nouvelle branche <branche>
git branch -m <branche> # Renomme la branche courante en <branche>
git branch -d <branche> # Permet de supprimer une branche
git checkout git switch git checkout <branche>
git switch <branche> # Se placer sur la branche <branche>
git checkout -b <branche>
git switch -c <branche> # Créer la branche <branche> et se positionner dessus
git merge <branche> # Fusionne la branche <branche> avec la branche courante
$ git checkout -b ma_feature
Switched to branch 'ma_feature'
[ .... Travail sur la branche, successions de commits .... ]
$ git checkout develop
Switched to branch 'develop'
$ git merge ma_feature
Updating ea1b82a..05e9557
(Summary of changes)
$ git branch -d ma_feature
Deleted branch ma_feature (was 05e9557).
$ git push origin develop
Savoir où vous en êtes avec l'état de vos fichiers git status
Identifier les différences entre vos fichiers, branches git diff
Identifier les contenus des commits git show, git log
$ touch monAutreFichier.txt
$ git diff
$ git add monAutreFichier.txt
$ echo "une nouvelle ligne" > monAutreFichier.txt
$ git diff
diff --git a/monAutreFichier.txt b/monAutreFichier.txt
index 0fe633e..10a5e3d 100644
--- a/monAutreFichier.txt
+++ b/monAutreFichier.txt
@@ -1 +1 @@
-ll
+une nouvelle ligne
$ git commit
$ git diff
git diff <commit1> <commit1>
git diff <branche1> <branch2>
git diff develop origin/develop
git log$ git log
commit 27329d3afac51fbf2762428e12f2635d1137c549 (origin/master, origin/HEAD, master)
Author: Administrator <admin@example.com>
Date: Mon Feb 15 15:52:52 2021 +0000
Update README.md
commit b362ea7aa65515dc35ff3a93423478b2143e771d
Author: Administrator <admin@example.com>
Date: Mon Feb 15 15:52:03 2021 +0000
Initial commit
$ git log --oneline
27329d3 (origin/master, origin/HEAD, master) Update README.md
b362ea7 Initial commit
$ git log --all --decorate --oneline --graph
$ git show 27329d3
commit 27329d3afac51fbf2762428e12f2635d1137c549 (origin/master, origin/HEAD, master)
Author: Administrator <admin@example.com>
Date: Mon Feb 15 15:52:52 2021 +0000
Update README.md
diff --git a/README.md b/README.md
index 9ff40b5..047477f 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,8 @@
# Sample GitLab Project
+This sample project shows how a project in GitLab looks for demonstration purposes.
It contains issues, merge requests and Markdown files in many branches,
+named and filled with lorem ipsum.
+You can look around to get an idea how to structure your project and, when done, you can safely delete this project.
git stashSauvegarder les modifications du working directory dans une zone tampon pour rendre le working directory propre.
Possibilité de rejouer les modifications stashées sur la branche en cours OU sur une autre branche
Peut être vu comme une zone de brouillons
Cette commande peut être utile en cas de développement avec des changements de contextes réguliers
#on bloque les modifs dans la zone tampon
$ git stash
# on récupère les modifs stashées
$ git stash apply # garde le stash pour une utilisation future
$ git stash pop # jette le stash
# pour plusieurs stashs
$ git stash list
$ git stash apply stash@{id}
# Pour effacer un stash
$ git stash drop stash@{id}
# pour effacer toute la liste
$ git stash clear
git mergegit merge, git va opter pour un merge avec fast-forward
--no-ff est utilisée, un commit de fusion est crée en plus des commits de la feature
git rebaseDans le cas où la branche principale a évolué, on ne peut appliquer un git merge en mode fast-forward
On peut en revanche faire un git rebase
les commits de la branche feature vont être appliqués un par un sur et dans l'ordre sur la branche principale
On garde un historique linéaire et lisible
# Sur la branche feature
$ git rebase develop
$ git checkout develop
$ git merge feature
git merge VS git rebaseMettre à jour une branche complètement indépendante, une branche de travail local: git rebase ou git merge en mode fast forward
Évite l’introduction de bruit.
Conserve un historique linéaire
Mettre à jour une branche partagée ou une branche qui risque d'être "conflictuelle": git merge --no-ff sans fast-forward.
Tous les merges sont représentés par un commit de fusion.
Isolation simple des régressions
Tuto git de Grafikart : manipuler l'historique, le remisage, comment revenir en arrière
Les workflows autour de git : Git Flow, le Github Flow, le GitLab Flow
Planification, ordonnancement, gestion de tâches, d’équipe ….
Hébergement, sauvegarde et mise à disposition du code
Suivi de problèmes, tests et intégration continue
Partage de l’information, espace d’échange (wiki …), notifications
Hébergement, génération de pages web
Url : https://gitlab.in2p3.fr
Nécessité de s'identifier sinon vous n'avez accès qu'aux projets publics
Connexion via Edugain
Documentation : https://doc.cc.in2p3.fr/fr/Collaborative-tools/tools/gitlab.html
Gestion des groupes et projets (listing à gauche et ajout au centre)
Issues, tasks, merge requests
Info à propos de Gitlab dont l'aide
Accès à votre compte / préférences
Lorsque vous créez un nouveau projet
| Visibilité | Scope |
|---|---|
| Privé | Vous serez le seul à pouvoir accéder au projet et à donner des permissions à l'unité |
| Interne | Seuls les utilisateurs authentifiés peuvent voir le projet |
| Public | N'importe qui, même non authentifié peut voir le projet |
Vous pouvez gérer les membres et visualiser l'activité générale dans la partie projets
Visualisez les fichiers, les commits , les branches ... toutes les infos liées au repository
Comparez les branches / commits
Les IssuesAssigner, estimer des tâches
Organiser votre travail avec les labels, et les milestones
Gérer des roadmaps
Commenter et discuter
Recevoir des notifications
Merge RequestUne Merge Request désigne la demande faite au responsable d’un dépôt Git de prendre en compte les modifications que vous avez effectuées et que vous souhaitez partager
En gros, il s'agit d'un git merge avec validation dans les interfaces gitlab
Une Merge Request peut être commentée ligne par ligne par un ou plusieurs relecteur
Elle offre un aperçu de toutes les différences entre la branche à merger et la branche cible.
La fonctionnalité équivalente dans GitHub s'appelle une Pull Request
Gitlab permet de faire facilement de l’intégration continue. Il suffit d’ajouter, au dépôt Git, un fichier .gitlab-ci.yml décrivant les “jobs” du “pipeline” à exécuter lors des modifications de code
La CI CD permet de mettre en place des étapes automatisées de test, d'analyse de code, de déploiement de l'application ou mêmes des pages statiques : les Gitlab pages
Plus de détails dans la présentation
"Outils de construction du code final, d'intégration et de déploiement continus"
Modification de la visibilité / des droits du projet
L'archivage, le renommage, le transfert du projet
la gestion des tokens d'accès au repository, à la registry et l'API
la gestion des tokens et clé de déploiements
la gestion de la protection des branches
sur la partie CI/CD : la gestion des runners, des artefacts de build, des variables