What is Git
Git est un système de controle de versionning. Cela permet aux développeurs de garder une trace de ce qui a été fait et de revenir à une phase précédente s’ils décident de revenir sur certains des changements qu’ils ont apportés.
Git est un projet open source, il a été développé en 2005 par Linus Torvalds, auteur du noyau Linux.
GitHub facilite la collaboration en utilisant git. C’est une plateforme qui peut contenir des dépôts de code dans un stockage dans le cloud afin que plusieurs développeurs puissent travailler sur un même projet et voir les modifications des autres en temps réel. Il comprend également des fonctions d’organisation et de gestion de projets. Vous pouvez attribuer des tâches à des individus ou à des groupes, définir les autorisations et les rôles des collaborateurs et utiliser la modération des commentaires pour que chacun reste concentré sur sa tâche.
En outre, les dépôts GitHub sont accessibles au public. Les développeurs du monde entier peuvent interagir et contribuer au code des autres afin de le modifier ou de l’améliorer, ce que l’on appelle le « codage social ». D’une certaine manière, cela fait de GitHub un site de mise en réseau pour les professionnels du web.
Pour résumer la différence entre Git et GitHub :
Git est un logiciel qui permet aux développeurs de sauvegarder leur projet de manière local, il est plus adapté à un usage individuel. GitHub est une plateforme web qui intègre les fonctionnalités de contrôle de version de git afin de pouvoir les utiliser en collaboration. Il comprend également des fonctions de gestion de projets et d’équipes, ainsi que des possibilités de mise en réseau et de codage social.
git config
Command pour configurer les préférences de l'utilisateur.
exemple:
git config --global user.email student42@gmail.com
git add
La commande git add peut être utilisée pour ajouter des fichiers à l’index
exemple : git add exemple.txt
ajoute le fichier nommé exemple.txt dans le répertoire local de l’index:
git rm --cached
git rm --cached <fichier>
Enlever un fichier de l'index du répertoir
git commit
La commande git commit permet de valider les modifications apportées.
git status
La commande git statut va vous permettre d'avoir un aperçu de l'état de votre dépôt.
Notamment la liste des fichiers modifiés ainsi que les fichiers qui doivent encore être ajoutés ou validés.
Voici une option pratique -u (--untracked-files[=<mode>]):
git status -u
git push
Un simple push envoie les modifications locales apportées à la branche principale
git pull
Pour fusionner toutes les modifications présentes sur le dépôt distant dans le répertoire de travail local
git branch
La commande git branch peut être utilisée pour répertorier, créer ou supprimer des branches. Pour répertorier toutes les branches présentes dans le dépôt
Exemple:
git branch dev
Créer une branche dev.
git checkout
La commande git checkout peut être utilisée pour créer des branches ou pour basculer entre elles.
Exemple:
git checkout dev
Ce déplace sur la branche dev
git push --set-upstream origin name
Push une branche sur le depot en ligne
git fetch
Git fetch permet à un utilisateur d’extraire tous les fichiers du dépôt distant qui ne sont pas actuellement dans le répertoire de travail local.
git merge
La commande git merge est utilisée pour fusionner une branche dans la branche active.
git diff (--base name)
La commande git diff permet de lister les conflits. Pour visualiser les conflits d’un fichier
git log
L’exécution de la commande git log génère le log d’une branche.
git reset
Pour réinitialiser l’index et le répertoire de travail à l’état du dernier commit, la commande git reset est utilisée :
git reset --soft HEAD~1
git reset --hard HEAD
Les branches permettent une meilleur gestion des versions, travailler plus facilement à plusieurs. Travailler en équipe, c’est bien mais chacun a besoin de son propre espace. Lorsqu’on développe une nouvelle fonctionnalité, c’est essentiel de s’isoler des modifications non-liées à la fonctionnalité sur laquelle on travaille. Pourquoi ? Parce que lorsqu’on développe, notre code peut engendrer des régressions. Et si l’on travaille tous sur la même branche, on aura du mal à trouver l’origine de la régression. Est-ce suite à notre développement, ou à celui d’un collègue ? Ceci peut nous faire perdre beaucoup de temps.
Si votre équipe ne suis pas une méthodologie de travail pré-déterminée, on se retrouve rapidement avec des conflits à chaque commit/merge ou presque, des pertes de données et un historique fouillis.
Lorsque l'on commence un nouveau projet on se retrouve sur un branch master
ou main
. Cette branche servira à la version production de notre projet. On va donc souvent commencer par créer une nouvelle branche servant au développement.
La branche master
est la branche production. Il est donc logique que l'on ne puisse y push
nos modifications directement. Sur cette branche ce trouve un coode stable, testé et validé.
La branche develop
centralise toutes les nouvelles fonctionnalités qui seront livrées dans la prochaine version. Ici il va falloir se forcer à ne pas y faire de modifications directement. Code de la prochaine version de l’application. Une fois que le développement d’une fonctionnalité (feature) est fini, le code est fusionné sur cette branche.
Les branches features
chaque branche travaillera sur un aspect du projet (parsing, système, interface, algorimth ....), code en cours de développement qui implémente une fonctionnalité à embarquer dans la prochaine version de l’application.
Qu’est-ce que le merge d’une branche feature veut dire ? Lorsqu’on merge une branche feature
sur la branche develop
, on indique que la fonctionnalité est terminée et prête pour rejoindre la prochaine version de l'application. Qu’est-ce que « prête » veut dire ? Cela dépend de la définition de terminé accordé sur chaque projet.
Voici un exemple réaliser par mes soins, d'une bonne utilisations des branches (selon mon point de vue) :
$ git branch # Voir la liste des branches
$ git branch [nom_branche] # Créer une branche
$ git branch -v # Voir la liste des branches et leur dernier commit
$ git branch --merged # Voir les branches mergées
$ git branch --no-merged # Voir les branches non mergées
$ git branch -a # Voir toutes les branches
$ git branch -d nom_branche # Supprime une branche mergée
$ git branch -D nom_branche # Supprime une branche
Il arrive souvent lorsque vous travaillez sur un projet que vous deviez utiliser un autre projet comme dépendance. Cela peut être une bibliothèque qui est développée par une autre équipe ou que vous développez séparément pour l’utiliser dans plusieurs projets parents. Ce scénario provoque un problème habituel : vous voulez être capable de gérer deux projets séparés tout en utilisant l’un dans l’autre.
Voici un exemple : Vous voulez utiliser votre libft dans votre projet printf. Vous pouvez copier le code source dans votre arborescence de printf, le problème d’inclure le code de votre libft dans votre projet, imaginons vous mettez à jour votre libft, car vous venez de coder une fonction très utile que vous aimeriez réutiliser dans plusieurs de vos projets en C. Il faudra donc copier cette nouvelle fonction dans tout vos projets qui utilise la libft.
Git gère ce problème avec les sous-modules. Les sous-modules vous permettent de gérer un dépôt Git comme un sous-répertoire d’un autre dépôt Git. Cela vous laisse la possibilité de cloner un dépôt dans votre projet et de garder isolés les commits de ce dépôt.
Commençons par ajouter le dépôt d’un projet Git existant comme sous-module d’un dépôt sur lequel nous travaillons. Pour ajouter un nouveau sous-module, nous utilisons la commande git submodule add
avec l’URL du projet que nous souhaitons suivre. Dans cette exemple, nous ajoutons notre libft.
git submodule add https://github.com/42students/libft
Clonage dans 'libft'...
remote: Counting objects: 11, done.
remote: Compressing objects: 100% (10/10), done.
remote: Total 11 (delta 0), reused 11 (delta 0)
Dépaquetage des objets: 100% (11/11), fait.
Vérification de la connectivité... fait.
Si vous lancez git status
à ce moment, vous trouverez un nouveau fichier :
$ git status
Sur la branche master
Votre branche est à jour avec 'origin/master'.
Modifications qui seront validées :
(utilisez "git reset <fichier>..." pour désindexer)
nouveau fichier : .gitmodules
nouveau fichier : libft
.gitmodules
vient d’apparaître. C’est le fichier de configuration qui stocke la liaison entre l’URL du projet et le sous-répertoire local dans lequel vous l’avez pull
.
Comment cloner un projet contenant des sous-modules. Quand vous récupérez un tel projet, vous obtenez les différents répertoires qui contiennent les sous-modules, mais encore aucun des fichiers :
$ git clone https://github.com/42students/printf
Clonage dans 'printf'...
remote: Counting objects: 14, done.
remote: Compressing objects: 100% (13/13), done.
remote: Total 14 (delta 1), reused 13 (delta 0)
Dépaquetage des objets: 100% (14/14), fait.
Vérification de la connectivité... fait.
$ cd printf
$ ls -la
total 16
drwxr-xr-x 9 42student staff 306 Sep 17 15:21 .
drwxr-xr-x 7 42student staff 238 Sep 17 15:21 ..
drwxr-xr-x 13 42student staff 442 Sep 17 15:21 .git
-rw-r--r-- 1 42student staff 92 Sep 17 15:21 .gitmodules
drwxr-xr-x 2 42student staff 68 Sep 17 15:21 libft
-rw-r--r-- 1 42student staff 756 Sep 17 15:21 Makefile
drwxr-xr-x 3 42student staff 102 Sep 17 15:21 includes
drwxr-xr-x 4 42student staff 136 Sep 17 15:21 src
$ cd libft/
$ ls
$
Le répertoire libft
est présent mais vide. Vous devez exécuter deux commandes : git submodule init
pour initialiser votre fichier local de configuration, et git submodule update
pour pull
toutes les données de ce projet et récupérer le commit approprié tel que listé dans votre super-projet :
$ git submodule init
Sous-module 'libft' (https://github.com/42students/libft) enregistré pour le chemin 'libft'
$ git submodule update
Clonage dans 'libft'...
remote: Counting objects: 11, done.
remote: Compressing objects: 100% (10/10), done.
remote: Total 11 (delta 0), reused 11 (delta 0)
Unpacking objects: 100% (11/11), done.
Checking connectivity... done.
Submodule path 'libft': checked out 'c3f01dc8862123d317dd46284b05b6892c7b29bc'
Votre répertoire libft
est maintenant dans l’état exact dans lequel il était la dernière fois que vous avez validé.
Il existe une autre manière plus simple d’arriver au même résultat. Si vous passez l’option --recurse-submodules
à la commande git clone
, celle-ci initialisera et mettra à jour automatiquement chaque sous-module du dépôt.
$ git clone --recurse-submodules https://github.com/42students/printf
Vous voulez en savoir plus :
[En cours de construction]
Dans n’importe quel projet, il est recommandé d’avoir une plateforme d’intégration continue. Ceci permet d’intégrer automatiquement les modifications réalisées sur le code et de notifier les développeurs lorsqu’un test ne passe plus.
[En cours de construction]
Les badges permettent de garder le projet à jour et indiquent une certaine qualité. Les badges peuvent être utilisés pour tout un tas de choses.
Githunt est une extension pour Chrome qui affiche les dépôts Github qui font le buzz en ce moment. Vous pouvez aussi retrouver une version web (https://kamranahmed.info/githunt/)
42Slack : jereligi
42Intra : jereligi
Pull requests are welcome. For major changes, please open an issue first to discuss what you would like to change. Please make sure to update tests as appropriate.
Thanks for reading this read me, advice or corrections are welcome