Git est un outil avant tout fait par des développeurs (Linus Torvald, 2005) pour des développeurs.
Git permet :
C’est l’outil n°1 du travail collaboratif, essentiel à maîtriser pour tout développeur qui se respecte.
Git est un logiciel de gestion de versions décentralisé.
L’historique d’un répertoire se représente sous la forme d’un graphe.
Chaque nœud est appelé commit et contient :
La liste des commandes documentées est ici : https://git-scm.com/docs
git init
: Initialise un répertoire géré par Git.git config
: Configure le comportement de git.git status
: Affiche l’état courant des fichiers.git add
: Ajoute des fichiers au prochain commit.git commit
: Crée un snapshot.git log
: Visualise l’historique, i.e. le graphe des commitsgit restore
: Annule des modifications.git rm
/git mv
: Supprime/déplace un fichier.git checkout
: Charge l’état d’un commit précis.git init
.git
(le dépôt) dans le répertoire courant.
$ cd /chemin/vers/mon/repertoire/de/base
$ git init
Initialized empty Git repository in /chemin/vers/mon/repertoire/de/base/.git/
$ ls -a
.git
git init
Dossier
Dossier
qui contient uniquement le répertoire .git
.
$ git init monRepertoireDeBase
Initialized empty Git repository in /chemin/vers/monRepertoireDeBase/.git/
$ cd MonRepertoireGit
$ ls -a
.git
git config
[--global] user.name <myname>
myname
comme nom d’auteur des commits
git config
[--global] user.email <myemail>
myemail
comme email de l’auteur des commits
git config
[--global|--local] -l
$ git config user.name "Adrien Krähenbühl"
$ git config -l
core.repositoryformatversion=0
core.filemode=true
core.bare=false
core.logallrefupdates=true
user.name=Adrien Krähenbühl
$ cat .git/config
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
[user]
name = Adrien Krähenbühl
--global
est à utiliser pour que la configuration soit valable pour tous les dépôts de l’ordinateur..git/config
Le répertoire de travail (working directory) est le répertoire sur le disque dur. Les fichiers y sont créés/modifiés/supprimés.
La zone de transit (staging area) ou index, est un espace temporaire qui stocke les modifications qui seront commitées.
Le dépôt (répertoire .git
) stocke tous les commits.
Les commandes git qui suivent vont permettre de manipuler les fichiers pour les faire passer d’une zone à une autre.
git status
affiche les infos sur l’état courant des fichiers.
$ git status
On branch master
Changes to be committed:
new file: NouvelleClasse.java
modified: README.md
Changes not staged for commit:
modified: Diagramme.puml
Untracked files:
Test.java
Changes to be committed
liste les fichiers dans la zone de transit.Changes not staged for commit
liste les fichiers du répertoire de travail qui ont été modifiés depuis le dernier commit.Untracked files
liste les fichiers qui ne sont pas versionnés.git add
$ git add MaClasse.java
$ git status
On branch master
Changes to be committed:
modified: MaClasse.java
git commit
[-m "message"]
message
indiquant en quoi consiste les modifications.
$ git status
On branch master
Changes to be committed:
modified: MaClasse.java
$ git commit -m "Ajout du fichier Maclasse.java"
$ git status
On branch master
nothing to commit, working tree clean
git log
[--oneline] [--graph] [--branches]
Liste les commits avec leurs métadonnées :
--oneline
: chaque commit sur une seule ligne (version condensée)--graph
: visualisation du graphe--branches
: visualisation de toutes les branches$ git log
commit 638c310fa5a42839595e9d8499fdb98773feff5e (HEAD -> master)
Author: Adrien Krähenbühl <krahenbuhl@unistra.fr>
Date: Tua Jan 11 10:02:59 2022 +0100
Ajout du fichier Maclasse.java
$ git log --oneline
638c310 (HEAD -> master) Ajout du fichier Maclasse.java
git restore
<file>
$ cat MaClasse.java
class MaClasse {}
$ git status
On branch master
Changes not staged for commit:
modified: MaClasse.java
no changes added to commit
1. Depuis le dernier commit, MaClasse.java
a été modifié.
$ git restore MaClasse.java
$ cat MaClasse.java
$ git status
On branch master
nothing to commit, working tree clean
2. Après git restore
, les modifications sont annulées.
git restore
--staged <file>
<file>
, i.e. les retire de la zone de transit. \(\rightarrow\) le fichier n’est pas modifié sur le disque dur
$ cat MaClasse.java
class MaClasse {}
$ git status
On branch master
Changes to be committed:
modified: MaClasse.java
1. Depuis le dernier commit, MaClasse.java
a été modifié et indexé.
$ git restore --staged MaClasse.java
$ cat MaClasse.java
class MaClasse {}
$ git status
On branch master
Changes not staged for commit:
modified: MaClasse.java
no changes added to commit
2. Modifications désindexées.
git mv
<file> <destination
déplace <file>
vers <destination>
$ git mv MaClasse.java MaClasse2.java
$ git statusOn branch master
Changes to be committed:
renamed: MaClasse.java -> MaClasse2.java
git rm
<file>
supprime <file>
$ git rm MaClasse.java
$ git status
On branch master
Changes to be committed:
deleted: MaClasse.java
Toute la partie précédente montre comment créer des commits en gérant les fichiers présent dans le répertoire de travail.
On peut obtenir un historique comme celui-ci :
$ git log --oneline --graph
* 56dd655 (HEAD -> master) Suppression de MaClasse.java
* eaa13b4 Ajout de README.md
* 6d865ec Ajout de Diagramme.puml
* 638c310 Ajout du fichier Maclasse.java
git checkout
<commit-id>
<commit-id>
(calculé par la fonction de hachage SHA-1)
$ git log --oneline --graph
* 56dd655 (HEAD -> master) Suppression de MaClasse.java
* eaa13b4 Ajout de README.md
* 6d865ec Ajout de Diagramme.puml
* 638c310 Ajout du fichier Maclasse.java
$ ls
Diagramme.puml README.md
2 - “Voyage” vers le commit d’identifiant 6d865ec
$ git checkout 6d865ec
HEAD is now at 6d865ec Ajout de Diagramme.puml
3 - État après déplacement
$ git log --oneline --graph
* 6d865ec (HEAD) Ajout de Diagramme.puml
* 638c310 Ajout du fichier Maclasse.java
$ ls
Diagramme.puml MaClasse.java
HEAD
pour indiquer où il se trouve dans le graphe des commits.git commit
fait en réalité deux choses :
HEAD
sur ce nouveau commitgit checkout
déplace uniquement le pointeur HEAD
sur un commit donné en argument.
1 - Départ
2 -
git commit -m "..."
3 -
git checkout 6d865ec
Au prochain CM : les branches !
Comment ça fonctionne physiquement ?
Git sauvegarde l’ensemble des commits dans un répertoire
.git
à la racine de cette arborescence.Pour pouvoir manipuler une arborescence, Git se base sur 3 éléments :
.git