# 👽 GIT & Github

Dans 
PubliĂ© 2022-09-05

Cet outil a trois grandes fonctionnalités :

  • Revenir Ă  une version prĂ©cĂ©dente de votre code en cas de problème.
  • Suivre l’évolution de votre code Ă©tape par Ă©tape.
  • Travailler Ă  plusieurs sans risquer de supprimer les modifications des autres collaborateurs.

# Fonctionnement

Git fonctionne de manière similaire à la sauvegarde incrémentielle, un ensemble de dossiers/fichiers va être ajouté au projet.
Par la suite, un historique complet des changements du projet sera disponible, ces changements pourront être ignorés, ajoutés, supprimés ou mergés (fusionnés).

Git propose un système de branche, ce qui permet par exemple, de développer le contenu du projet de la branche principale sans altérer celle-ci. Puisqu'au préalable Git aura fais une sorte de clone secondaire de la branche
(avec la commande git checkout -b mabranche).

Ce schéma illustre les 3 étapes du fonctionnement de Git (source Openclassroooms)
Ce schéma illustre les 3 étapes du fonctionnement de Git (source Openclassroooms)

Le Working directory correspond au dossier du projet sur la machine.

Le Stage ou Index est l'étape intermédiaire qui représente tous les fichiers modifiés qui ont été "indexés".

Comment indexer un dossier/fichier
https://linux.contactit.fr/git_github/#ajouter-des-dossiersfichiers-au-dépot

Le repository est l'ensemble du projet avec les commits réalisés.


# Le dépôt local

Un dépôt est l'ensemble des dossiers/fichiers qui constituent un projet initié avec Git.
Dans la documentation en ligne ou en milieu professionnel, on parle souvent de repository, qui est la traduction anglaise du terme “dépôt”.
Le dépôt local est stocké directement sur la machine.


# Le dépôt distant

Le dĂ©pĂ´t distant est hĂ©bergĂ© sur un serveur distant 🧠


# Installation de Git

sudo apt install git
[sudo] Mot de passe de contact :
Lecture des listes de paquets... Fait
Construction de l'arbre des dépendances... Fait
Lecture des informations d'état... Fait
git est déjà la version la plus récente (1:2.34.1-1ubuntu1.4).
git passé en « installé manuellement ».
0 mis à jour, 0 nouvellement installés, 0 à enlever et 0 non mis à jour.
1 partiellement installés ou enlevés.
Après cette opération, 0 o d'espace disque supplémentaires seront utilisés.
Souhaitez-vous continuer ? [O/n]

Valider l'installation: O ou ajouter l'option -y a la fin de la commande.


# L'identité

L'identité dans Git est simplement votre nom et votre adresse mail.

Ces deux informations sont nécessaires aux validations Git:

git config --global user.name "John Doe"

git config --global user.email contact@contactit.fr

Pour vérifier que vos paramètres ont bien été pris en compte, il suffit de passer la commande:
git config --list


# Initier un dépot

Aller au repertoire désiré, par exemple: cd ~/monprojet

Initier un dépôt local:

git init
astuce: Utilisation de 'master' comme nom de la branche initiale. Le nom de la branche
astuce: par défaut peut changer. Pour configurer le nom de la branche initiale
astuce: pour tous les nouveaux dépôts, et supprimer cet avertissement, lancez :
astuce:
astuce:         git config --global init.defaultBranch <nom>
astuce:
astuce: Les noms les plus utilisés à la place de 'master' sont 'main', 'trunk' et
astuce: 'development'. La branche nouvellement créée peut être rénommée avec :
astuce:
astuce:         git branch -m <nom>
Dépôt Git vide initialisé dans /home/contact/contactit.fr/.git/

Ou initier un dépôt distant:

Clonage dans 'monprojet.git'...
remote: Enumerating objects: 11779, done.
remote: Counting objects: 100% (82/82), done.
remote: Compressing objects: 100% (66/66), done.
remote: Total 11779 (delta 52), reused 33 (delta 16), pack-reused 11697
Réception d'objets: 100% (11779/11779), 23.50 Mio | 11.34 Mio/s, fait.
Résolution des deltas: 100% (7047/7047), fait.

La commande git clone va directement importer le projet ainsi que les fichiers sources de celui-ci dans un dossier portant son nom.

Il peut être nécessaire de mettre à jour le repository suite à un changement effectué par un autre acteur du projet, utilisez la commande:

git pull origin mabranche

# Vérification

ls -la
total 12
drwxr-xr-x  3 contact contact 4096 sept.  5 15:26 .
drwxr-x--- 14 contact contact 4096 sept.  5 15:23 ..
drwxrwxr-x  7 contact contact 4096 sept.  5 15:26 .git

Le dépot .git est bien pésent dans le répertoire sous la forme d'un dossier caché.


# Indexer des dossiers/fichiers au dépot:

La commande git add permet d'indexer des fichiers Ă  Git.
Une fois les dossiers/fichiers indexés, il est possible de faire un commit après modification d'un élément.

Quelques exemples:

git add README ajoute le fichier README
git add . ajoute l'ensemble des dossiers et fichiers Ă  l'endroit ou le .git se trouve.


# .gitignore

.gitignore est un fichier qui recense les dossiers/fichiers ignorés par GIT.

  • Il rĂ©pond Ă  une syntaxe dĂ©finie.

Quelques exemples:

*.log ignore tous les fichiers ayant l'extension .log
/dossier ignore le dossier de manière récursive.

Plus d'informations sont disponibles ici


# Les commits

Un "commit" est une version des dossiers/fichiers indexés précedemment, qui est différente par rapport à la version ultérieure.

  • la commande git commit permet de valider les changement opĂ©rĂ©s sur les fichiers indexĂ©s ou "stagĂ©s" par GIT.
  • Il est possible de voir les commits prĂ©cĂ©demment enregistrĂ©s avec la commande:
git log
  • Cette commande permet Ă©galement de consulter le contenu d'un ou plusieurs commits:
git log -p1

L'option -p1 affiche le dernier commit réalisé.


# Push le repository

  • Il faut d'abord ajouter l'origine (l'endroit ou est le repository distant):
git remote add origin https://github.com/username/projet/monprojet.git
  • SĂ©lectionner la branche dans laquelle je veux uploader le repository:
git branch -M mabranche
  • Envoyer le repository:
git push -u origin mabranche

# Les branches

Une branche est une copie du projet à un instant T, toutes les modifications faites sur celle-ci n'affectera que cette dernière.
Cela permet d'avoir plusieurs états du projet simultanément.

La branche principale est la branche main (précédemment appelée master avant octobre 2020). Cette branche est souvent la branche de production donc stable, du projet.

Il peut y avoir d'autres noms de branches comme: dev ou stagging ce sont des branches non stables en développement actif, des tests et vérifications seront faites sur celles-ci une fois le développement terminé.

Si le réultat est concluant alors il est possible que ces branches soient mergées (fusionnées) à la branche main ou master. Les branches sont souvent utilisées pour recréer un environnement de tests / préproduction et production.

Illustration de branches d'un repository Git
Illustration de branches d'un repository Git

Git peut être comparé à un arbre:

Le tronc de l'arbre est la branche principale du projet (la plupart du temps: main ou master)

Les branches sont des éléments qui viennent du tronc mais qui partent dans des diréctions différentes

Les feuilles sont les unes sur les autres, plus ou moins nombreuses et tombent ou reste sur les branches comme les commits.

conclusion: en hiver on a plus de commits 😉


La commande git branch permet de lister les branches du repo:

git branch
  list
* master

Ici il y a deux branches: list et master.
Le * indique que je suis actuellement dans la branche master.

La commande git checkout mabranche permet de changer de branche:

git checkout mabranche
Switched to branch 'mabranche'

Il est possible de créer une branche à partir d'un commit, avec l'une des commandes:

git checkout -b manouvellebranche <commit_sha>

Pour avoir le sha (hash) du commit nous pouvons passer la commande:

git log --oneline --graph
* 5aaf865 Suppression du README
* 6746dbc Ajout d'un texte de test
* 931dc0f Création du README

le sha est constitué de la suite de caractères héxadécimaux après le "*" 931dc0f, par éxemple.

Ici je créer une branche à partir du commit 931dc0f dont la modification porte sur la création du README.


# Fusionner (merge) deux branches

Il faut d'abord se positionner dans la branche de destination du merge:

git checkout master
Switched to branch 'master'

Puis fusionner les commits des branches:

git merge mabranche
Merge made by the 'recursive' strategy

# Git stash

La commande git stash permet de mettre un commit de côté pour que la branche actuelle redevienne propre, donc sans données dans la zone de stage. Cette situation convient dès lors qu'un commit n'a pas été réalisé et que les modifications sont toujours dans le stage.

Dans les faits, la commande git status nous retournent qu'il y a plusieurs changements(dans la zone de stage), qui n'ont pas été commités.

Stash nous permet de les mettres de côté, pour pouvoir les insérer dans une autre branche, ce qui peut être pratique lorsque je me suis trompé de branche en faisant mes modifications !

Après avoir éxécuté la commande git stash si je refais la commande git status cette dernière nous retourne que le working directory est propre (stage vide).

Maintenant je peux aller dans une vouvelle branche ou une existante avant d'y insérer les changements éffectués:

git branch manouvellebranche
git checkout manouvellebranche
git branch
* manouvellebranche
master
git stash apply

Il est possible d'avoir plusieurs stashs. Dans ce cas, la commande git stash list permet de les lister avec leurs noms réspectifs.

Ainsi je peux appliquer un stash avec son nom: git stash apply stash@{0}
(le nom commençant par stash... et finissant juste avant le :)


# Git reset

Git reset permet d'annuler des changements de trois façons différentes: soft, mixed et hard

Illustration des 3 types de réinitialisation de Git reset (source Openclassroooms)
Illustration des 3 types de réinitialisation de Git reset (source Openclassroooms)


# Supprimer le dernier commit

Je commence par regarder les logs et donc le dernier commit réalisé ainsi que son identifiant:

git log commit
ca83a6dff817ec66f443420071545390a954664949 Author: contact 
<contact@contactit.fr> Date: Mon Mar 19 21:52:11 2022 -0700

Je prends note de l'identifiant: ca83a6dff817ec66f443420071545390a954664949 si j'ai besoin de l'affecter à une autre branche après l'avoir supprimé.

Maintenant je peux supprimer le dernier commit avec la commande:

git reset --hard HEAD^

Créer ou se positionner dans la branche:

git branch manouvellebranche
git checkout manouvellebranche
git reset --hard ca83a6dff817ec66f443420071545390a954664949

# L'identification sur Github

Github repose sur l'identification avec SSH, donc une paire de clés.

Pour génrer cette paire de clé, j'utilises la commande suivante:

ssh-keygen -t ed25519
Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/contact/.ssh/id_ed25519):
Created directory '/home/contact/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/contact/.ssh/id_ed25519
Your public key has been saved in /home/contact/.ssh/id_ed25519.pub
The key fingerprint is:
SHA256:monhash contact@mondomain
The key's randomart image is:
+--[ED25519 256]--+
|%@+.             |
|EBCVB.             |
|+=Bo.            |
|+.o* .           |
|oo..o . S S       |
|=+oo   o         |
|B++ o . .        |
|+=.. o .         |
|o.    . .         |
+----[SHA256]-----+

Ensuite, je récupère la clé publique qui servira à prouver mon identité à github:

cat ~/.ssh/id_ed25519.pub
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAKC91uWop9DhfNh23i6u0yUlhEkGv0IOQKzhU5ltKBkAG contact@contactit.fr

Je peux maintenant la renseigner dans: Settings>SSH and GPG keys, dans la séction titre je peux mettre un nom quelconque et dans la section key je colle ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAKC91uWop9DhfNh23i6u0yUlhEkGv0IOQKzhU5ltKBkAG contact@contactit.fr, valider avec Add SSH key.


# Résumé de Git/github

(source Openclassrooms)
(source Openclassrooms)


Dernière modification le 08/09/2022