Vous faites parti 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.txt
│ │ ├─── Rapport_new.txt
│ │ ├─── Rapport_v1.0.txt
│ │ └─── Rapport_v1.2.txt
│ ├─── Rapport_old.txt
│ ├─── Rapport_2022.05.15.txt
│ └─── Rapport_2022.05.15_new.txt
😕 Quelle est la bonne version du fichier ?
😊 Un seul fichier + l’historique des modifications
├───Projet info
│ └───Livrables
│ └───Rapport.txt
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 |
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 |
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 courant
Tip
.
: 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 :
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.
├─── Projet info
│ ├─── src
│ │ ├─── main.py <- fichier modifié
│ │ ├─── velo.py <- nouveau fichier
│ └─── doc
│ │ └─── Rapport.txt
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 testsSi 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 :
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.
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 pousser et puller réguliérement son code pour garder son dépôt à jour.
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 push
git add <mon_fichier>
Autre possibilité : votre fichier est ignoré par git car il fait parti 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 votre 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 !
Code
git 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 si vous voulez simplement avoir une copie locale du code sans partager vos modifications.
À utiliser si vous travaillez en projet.
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
Imaginez que vous souhaitez ajouter une nouvelle fonctionnalité à votre code.
Seulement vous n’êtes pas encore sûr que :
Note
Vous aimeriez pouvoir :
Note
La branche principale se nomme généralement main ou master.
Commande | Description |
---|---|
git branch -a |
Lister toutes les branches |
git switch <branch> |
Changer de branche |
git switch -c <branch> |
Créer et changer de branche |
git merge <branch> |
Fusionner <branch> dans la branche actuelle |
git branch -d <branch> |
Supprimer la branche |
git push origin <branch> |
Pousser la branche vers le dépôt distant |