sequenceDiagram
Workspace ->> Staging index: add
Staging index ->> Local repository: commit
Local repository ->> Remote repository: push
Remote repository ->> Workspace: pull
Vous faites partie d’une équipe de 5 personnes qui doit coder une application de jeux de cartes.
😕 Comment mettre en commun votre code ?
😅 En cas d’erreur, comment revenir en arrière ?
├─── Projet info
│ ├─── old
│ │ ├─── Rapport.qmd
│ │ ├─── Rapport_new.qmd
│ │ ├─── Rapport_v1.0.qmd
│ │ ├─── Rapport_v1.0_new_old.qmd
│ │ └─── Rapport_v1.1.qmd
│ ├─── Rapport_old.qmd
│ ├─── Rapport_2022.05.15.qmd
│ └─── Rapport_2022.05.15_latest.qmd
😕 Quelle est la bonne version du fichier ?
😊 Un seul fichier + l’historique des modifications
├───Projet info
│ └───Livrables
│ └───Rapport.qmd
Date Heure Auteur Message commit
---- ----- ------ --------------
2022.05.29 23h58 bianca "Version finale"
2022.05.29 23h40 archibald "j'avais oublié l'intro"
2022.05.29 21h32 tryphon "ajout partie 2"
2022.05.29 20h25 bianca "v1.1"
2022.05.29 20h12 tryphon "Création du rapport"
Vous souhaitez passer de R-base à ggplot2 pour votre graphique.
analyse.R
library(ggplot2)
data <- data.frame(x = seq(-4, 4, length=100))
data$y <- dnorm(data$x)
# plot(data$x, data$y, type="l", lwd=2, col="blue",
# main="Densité de la loi normale centrée réduite",
# xlab="x", ylab="Densité")
# abline(h=0, col="gray")
ggplot(data, aes(x = x, y = y)) +
geom_line(color = "blue", size = 1) +
ggtitle("Densité de la loi normale centrée réduite") +
xlab("x") +
ylab("Densité") +
theme_minimal()analyse.R - Commit 05016ab - Date 2024.06.02 - Author tryphon
analyse.R - Commit f97f766 - Date 2024.06.04 - Author bianca
Note
😨 Git s’utilise majoritairement en ligne de commande dans un terminal Git Bash.
😅 Pas de panique, quelques commandes suffisent pour travailler avec Git.
Il existe aussi des interfaces graphiques mais elles sont souvent imparfaites et sources d’erreur.
| Commande | Description |
|---|---|
ls (ou ll) |
Liste le contenu d’un répertoire |
pwd |
Affiche le répertoire courant |
cd <directory> |
Change le répertoire de travail courant |
mv <src_file> <dest_file> |
Déplace des fichiers ou des répertoires |
cp <src_file> <dest_file> |
Copie un fichier ou un répertoire |
mkdir <directory> |
Crée un nouveau répertoire |
rm <file_or_dir> |
Supprime des fichiers ou des répertoires |
touch <filename> |
Crée un nouveau fichier vide |
cat <filename> |
Affiche le contenu d’un fichier |
grep <text> <filename> |
Rechercher dans un fichier |
| Commande | Signification |
|---|---|
ls (ou ll) |
list |
pwd |
print working directory |
cd <directory> |
change directory |
mv <src_file> <dest_file> |
move |
cp <src_file> <dest_file> |
copy |
mkdir <directory> |
make directory |
rm <file_or_dir> |
remove |
touch <filename> |
|
cat <filename> |
concatenate |
grep <text> <filename> |
global regular expression print |
Pour chaque commande, de nombreuses options sont disponibles
ls *.py # liste tous les fichiers python du répertoire courant
ls *.py > a.txt # crée un fichier a.txt contenant le résultat de la commande
cd .. # se positionne dans le répertoire parent
cd ../projet/src # remonter dans le dossier parent puis aller dans projet puis src
cp /p/image.jpg . # copie le fichier image.jpg du disque P dans le dossier courant
./setup.sh # lance le programme setup.sh du répertoire courantTip
. : représente le dossier courant.. : représente le dossier parent~ : répertoire personnel de l’utilisateur (echo $HOME)Warning
2 possibilités pour coller du texte :
sequenceDiagram
Workspace ->> Staging index: add
Staging index ->> Local repository: commit
Local repository ->> Remote repository: push
Remote repository ->> Workspace: pull
2 étapes pour créer une nouvelle version :
git add <filename>
git add . : pour ajouter tous les fichiersgit commit -m "<mon message>"Votre dépôt avant de commencer à coder.
Vous avez :
Vous ajoutez les fichiers créés ou modifiés à l’index :
git add .Vous créez un point de sauvegarde
git commit -m "feat: ajout de l'utilisation de velo"😔 Ce n’est pas toujours évident de trouver un message court et explicite.
Tip
Utilisez un préfixe à votre message selon le pattern <type>: <sujet>:
doc: mise à jour documentairefeat: nouvelle fonctionnalitéfix: correctionrefactor: mise au propre du coderevert: retour arrièretest: Modification des testsPrivilégiez de nombreux petits commits à un gros commit final :
Si finalement, vous n’avez pas envie de « commiter » vos modifications ?
| Commande | Description |
|---|---|
git restore <file> |
Annuler les modifications locales non indexées du fichier |
git reset <file> |
Desindexer un fichier |
git reset --hard |
Revenir à l’état du dernier commit, perdant toutes les modifications locales |
git stash |
Sauvegarder et remettre le working directory à l’état du dernier commit |
Caution
Attention avec les commandes contenant les mots force, hard…
Le fichier .gitignore
.gitignore est un fichier présent à la racine du dépôt permettant de dire à Git quels fichiers il doit ignorer. Par exemple, s’il contient :
*.csv ➡️ tous les fichiers csv seront ignorés par Gitdata/ ➡️ le dossier data et son contenu sera ignoréCela est utile, pour exclure par exemple du dépôt Git :
Un petit quizz !
Projet info/
├── .github/
│ └── workflows/
│ └── ci.yml
├── backend/
│ ├── pyproject.toml
│ └── src/
│ ├── dao/
│ ├── service/
│ └── main.py
├── data/
│ ├── create_tables.sql
│ └── insert_data.sql
├── doc/
│ ├── rapport.qmd
│ └── suivi.md
├── .env
├── .gitignore
├── docker-compose.yml
└── README.md
Les Nudges/
├── Articles/
│ ├── Sunstein_2014_Nudging.pdf
│ ├── Kahneman_1990.pdf
│ └── Nudges that dont nudge.pdf
├── Notes/
│ ├── idees.docx
│ ├── bibliographie.docx
│ └── données.csv
└── Rapport/
├── rapport.docx
├── rapport_v2.docx
├── rapport_v3_final.docx
├── rapport_v3_final.pdf
└── rapport_v3_final_corrige.docx
├── presentation.pptx
└── presentation_finale.pptx
Projet Loto/
├── .gitignore
├── README.md
├── suivi.md
├── data/
│ ├── README.md
│ └── loto.csv
├── R/
│ ├── 01_load.R
│ ├── 02_clean.R
│ ├── 03_explore.R
│ ├── 04_analyze.R
│ └── 05_visualize.R
├── rapport/
│ ├── rapport.qmd
│ └── rapport.pdf
└── presentation/
└── soutenance.qmd
Remarque
Il est tout à fait possible d’avoir plusieurs clones du même dépôt sur son poste.
Important
Chaque dépôt est une copie intégrale du projet.
flowchart
github[(Dépôt distant)]
dev1[(Dépôt local 1)]
dev2[(Dépôt local 2)]
github <--> dev1
github <--> dev2
git pull : mettre à jour son dépôt local à partir du dépôt distantgit push : envoyer ses commits locaux sur le dépôt distantImportant
Il est important de push et pull régulièrement son code pour garder son dépôt à jour.
Vous faites toujours vos actions sur un dépôt local.
Vous ne modifiez jamais le dépôt distant.
Dépôt local ➡️ Dépôt distant
Pour pouvoir pousser son code, il est nécessaire :
git pull! [rejected] main -> main (fetch first)
error: failed to push some refs
hint: Updates were rejected because the remote contains work that you do not
hint: have locally. This is usually caused by another repository pushing to
hint: the same ref. If you want to integrate the remote changes, use
hint: 'git pull' before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
Le message est assez explicite.
git pushgit add <mon_fichier>Autre possibilité : votre fichier est ignoré par git car il fait partie du .gitignore
Dépôt local ⬅️ Dépôt distant
Que se passe-t-il si :
git pull pour mettre à jour votre dépôt à partir du dépôt distant😨 Un conflit ! Git ne sait pas choisir quelle est la bonne version entre la vôtre et celle d’Alice.
😅 Pas de panique ! Pour résoudre le conflit, il faut simplement :
git add puis git commit pour valider la résolution du conflitgit pull
self.couleur = "noir" vs self.couleur = "blanc"Pour résoudre ce conflit, 3 possibilités :
Ensuite, vous validez, créez un commit et poussez le code (git add ., puis git commit -m "<message>" et git push).
Est-ce qu’il y a des fichiers :
Important
La commande git status permet de répondre à ces questions.
Elle peut être utilisée n’importe quand, sans modération ! 🍻
Pour créer votre dépôt local.
Codegit clone <adresse_depot>git clone https://github.com/ludo2ne/Git-tuto.git (https)git clone git@github.com:ludo2ne/Git-tuto.git (ssh)Remarque
Il est possible de créer un dépôt local sans cloner un dépôt distant (git init).
Et éventuellement ensuite de le brancher à un dépôt distant.
Cependant ce cas d’utilisation est assez marginal.
2 protocoles différents pour communiquer avec le dépôt distant.
À utiliser sur les datalabs.
À utiliser si vous travaillez sur la VM ENSAI.
| Commande | Description |
|---|---|
git clone <adr> |
Créer un dépôt local sur son poste |
git status |
Voir où l’on en est |
git add <file> |
Ajouter pour le prochain commit |
git commit -m "<msg>" |
Créer un point de sauvegarde |
git pull |
dépôt local ⬅️ dépôt distant |
git push |
dépôt local ➡️ dépôt distant |
git diff : différence avec le dernier commit
git diff <filename>git checkout <commit_number> : passer à un commit spécifiquegit log : historique des commits
git log --all --decorate --oneline --graph↪ Indispensable d’utiliser Git !
| Terme | Synonymes | Signification |
|---|---|---|
| Git | Outil de versionnage | Logiciel qui gère les versions et l’historique du code |
| GitHub | Plateforme Git | Service web pour héberger et collaborer sur des dépôts Git |
| Git Bash | Terminal | Terminal pour lancer des commandes Git |
| Dépôt | Repository, Repo | Dossier contenant un projet Git (code + historique) |
| Remote | Dépôt distant | Dépôt hébergé sur un serveur (GitHub, GitLab…) |
| Local | Dépôt local, Clone | Copie d’un Remote sur ordinateur, ou dans ton service |
| Commit | Point de sauvegarde | État du projet à un instant donné |
| Push | Envoyer | Transmettre les commits locaux vers le dépôt remote |
| Pull | Récupérer | Ramener les commits du remote vers le local et les fusionner |
| Terme | Synonymes | Signification |
|---|---|---|
| Branche | Branch | Ligne parallèle de développement dans un dépôt |
| Main | Master | Branche principale (tronc) |
| Merge | Fusion | Action de combiner une branche dans une autre |
| Fork | Copier un remote | Copier un remote sur son propre compte GitHub |
| Issue | Ticket | Outil pour signaler un bug, une tâche ou une discussion |
| Pull Request | PR, Merge Request | Proposition d’intégrer des changements d’une branche vers une autre |