Série Git - Les commandes usuelles (3/5)

Comment intéragir avec Git ?

Le fonctionnement de Git intégré, nous allons présenter quelques commandes usuelles de Git.

Il ne s’agit là que d’une petite partie des commandes disponibles, mais elles représentent une base suffisante pour bien démarrer.

Remarque
Pour chaque commande, un exemple d’usage est disponible en cliquant sur le champ Exemple d'usage de la commande ....

Récupère un repository git existant et copie la dernière version dans le répertoire de travail.

Exemple d'usage de la commande git clone État initial :
1
tree -a
1
0 directories, 0 files

Clone d’un projet Git existant :

1
git clone git@github.com:github/super-linter.git
1
2
3
4
5
6
7
Cloning into 'super-linter'...
remote: Enumerating objects: 6, done.
remote: Counting objects: 100% (6/6), done.
remote: Compressing objects: 100% (6/6), done.
remote: Total 11404 (delta 1), reused 0 (delta 0), pack-reused 11398
Receiving objects: 100% (11404/11404), 17.73 MiB | 1.53 MiB/s, done.
Resolving deltas: 100% (7463/7463), done.

Un répertoire du nom du projet est créé :

1
tree -a -L 3
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.
└── super-linter
    ├── action.yml
    ├── .automation
    │   ├── clean-code-base-for-tests.sh
    │   ├── cleanup-docker.sh
    │   ├── README.md
    │   ├── test
    │   ├── upload-docker.sh
    │   └── validate-docker-labels.sh
    ├── CODE_OF_CONDUCT.md
    ├── dependencies
    │   ├── Gemfile
    │   ├── Gemfile.lock
    │   ├── package.json
    │   ├── package-lock.json
    │   ├── phive.xml
    │   └── python
    ├── .devcontainer
    │   ├── devcontainer.json
    │   └── README.md
    ├── Dockerfile
    ├── .dockerignore -> .gitignore
    ├── docs
    │   ├── disabling-linters.md
    │   ├── release-process.md
    │   ├── run-linter-locally.md
    │   └── using-rules-files.md
...
143 directories, 492 files

Initialise un répertoire (repository) git. Cela a pour unique effet de créer le répertoire .git dans le répertoire courant contenant un ensemble de fichiers générés par défaut.

L’initialisation d’un repo peut aussi être réalisée directement dans GitLab puis cloné en local.

Exemple d'usage de la commande git init

Création d’un répertoire vide :

1
2
3
mkdir tmp_git_repo
cd tmp_git_repo
tree -a
1
0 directories, 0 files

Initialisation d’un projet Git :

1
git init
1
Initialized empty Git repository in /home/puddi/tmp_git_repo/.git/
1
tree -a
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.
└── .git
    ├── branches
    ├── config
    ├── description
    ├── HEAD
    ├── hooks
    │   ├── applypatch-msg.sample
    │   ├── commit-msg.sample
    │   ├── fsmonitor-watchman.sample
    │   ├── post-update.sample
    │   ├── pre-applypatch.sample
    │   ├── pre-commit.sample
    │   ├── pre-merge-commit.sample
    │   ├── prepare-commit-msg.sample
    │   ├── pre-push.sample
    │   ├── pre-rebase.sample
    │   ├── pre-receive.sample
    │   ├── push-to-checkout.sample
    │   └── update.sample
    ├── info
    │   └── exclude
    ├── objects
    │   ├── info
    │   └── pack
    └── refs
        ├── heads
        └── tags

10 directories, 17 files

La commande git status est la commande qui permet d’obtenir un rapport de l’état courrant de répertoire de travail comparé au dernier état historisé. Cette commande décrit aussi les fichiers à l’état de staging.

Exemple d'usage de la commande git status On exécute la commande une première fois pour s'assurer qu'il n'y a aucune modification en attente de validation.
1
git status
1
2
3
4
5
On branch master

No commits yet

nothing to commit (create/copy files and use "git add" to track)

On ajoute un fichier README.md :

1
touch README.md

On exécute de nouveau la commande git status :

1
git status

On voit ici que Git a bien détecté le nouveau fichier et il nous spécifie que ce fichier n’est pas suivi :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
On branch master

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        README.md

nothing added to commit but untracked files present (use "git add" to track)

La commande git log permet d’afficher l’historique des modifications.

Exemple d'usage de la commande git log
1
git log
1
2
3
4
5
commit 89bf63e0e7e764b6eec8c52ba16c9cd5eba43589 (HEAD -> master)
Author: siwon <simon.rousseau@protonmail.com>
Date:   Tue Mar 30 09:25:05 2021 +0200

    mise a jour de mon fichier

Ici, l’historique est composé d’un seul commit dont on peut extraire les informations suivantes :

  • Hash du commit : “89bf63e0e7e764b6eec8c52ba16c9cd5eba43589” (pouvant être raccourci par “89bf63e”)
  • Auteur : siwon
  • Date : Tue Mar 30 09:25:05 2021 +0200
  • Commentaire : mise a jour de mon fichier

La commande git diff permet d’afficher les modifications au sein des fichiers suivis entre l’état courant et le dernier commit.

Exemple d'usage de la commande git diff
1
git status
1
2
On branch master
nothing to commit, working tree clean
1
2
echo "pouet" > README.md
git diff
1
2
3
4
5
6
diff --git a/README.md b/README.md
index e69de29..fc024dd 100644
--- a/README.md
+++ b/README.md
@@ -0,0 +1 @@
+pouet

Ici, on peut lire que la ligne pouet a été ajoutée au fichier README.md.

La commande git branch permet de lister les branches locales ou de créer des branches locales via la commande git branch new_branch_name.

Exemple d'usage de la commande git branch
1
git branch
1
* master

Ici nous n’avons que la branche master. Ajoutons une nouvelle branche.

1
2
git branch test
git branch
1
2
* master
  test

Ici, nous pouvons voir qu’il y a deux branches (master et test), dont une précédée d’un * qui signifie qu’il s’agit de la branche active localement.

La commande git checkout permet de déplacer la position du pointeur HEAD vers un commit spécifique.

Cela est par exemple utile dans le cas où nous voulons basculer d’une branche à une autre, retourner sur un commit précédent ou retourner sur tag précédent.

Enfin cette commande permet aussi de créer une nouvelle branche et de basculer dessus directement.

Exemple d'usage de la commande git checkout
1
git branch
1
2
* master
  test

Ici, nous sommes sur la branche master. Basculons sur la branche test.

1
2
git checkout test
git branch
1
2
  master
* test

Nous avons ici basculé sur la branche test. Créons et basculons maintenant sur une branche test2.

1
2
git checkout -b test2
git branch
1
2
3
  master
  test
* test2

Nous avons bien créé une nouvelle branche test2 et basculé directement sur celle-ci.

La commande git add permet d’ajouter un fichier dans l’état Staged. Cela veut donc dire que le fichier est suivi (s’il ne l’était pas déjà) et que sa version est référencée dans le prochain point de validation.

Cette commande sera ainsi utilisée pour ajouter un fichier ou juste avant de faire un commit.

Exemple d'usage de la commande git add
1
git status
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
On branch master

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        README.md

nothing added to commit but untracked files present (use "git add" to track)

Ici, nous sommes sur la branche master et le fichier README.md n’est pas suivi.

1
2
git add README.md
git status
1
2
3
4
5
6
7
8
On branch master

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

        new file:   README.md

Le fichier README.md est maintenant suivi et prêt à être commité.

La commande git commit permet d’enregistrer les changements présents dans l’espace staging et de les ajouter dans l’historique des commits (.git repository).

Exemple d'usage de la commande git commit
1
git status
1
2
3
4
5
6
7
8
On branch master

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

        new file:   README.md

Ici, nous sommes sur la branche master et le fichier README.md est prêt à être commité.

1
2
git commit -m "feat: ajout du fichier README.md"
git status
1
2
On branch master
nothing to commit, working tree clean

Contrôlons maintenant l’historique des commits :

1
git log --oneline
1
0c30a17 (HEAD -> master) feat: ajout du fichier README.md

Le commit est bien enregistré dans l’historique Git local.

La commande git merge permet de fusionner les modifications d’une branche dans la branche courante.

Cette fonction est une des clés pour le fonctionnement de Git en mode collaboratif :

%%{init: { 'logLevel': 'debug', 'theme': 'base', 'gitGraph': {}} }%% gitGraph commit branch feature checkout feature commit checkout main commit checkout feature commit
Exemple d'usage de la commande git merge

Prenons l’exemple ci-dessus, nous sommes sur la branche main et souhaitons fusionner les commits présents dans la branche feature.

1
git merge feature

Cette commande va alors récupérer les commits présents dans la branche feature et les réappliquer dans la branche main.

Comme présenté dans la partie 2 de cette série, il est possible de copier les projets Git sur des remotes.

Ces remotes peuvent être des plateformes d’hébergement (comme GitHub et GitLab que nous présenterons dans le prochain article) ou tout simplement un serveur Git distant.

Pour réaliser des synchronisations avec les copies distantes du projet, il existe deux commandes : git pull et git push.

La commande git pull permet de récupérer les modifications distantes et de les appliquer localement (pour mettre à jour notre copie locale du projet).

L’utilisation est la suivante : git pull.

La commande git push permet de pousser les modifications locales et de les appliquer sur la copie distante (pour mettre à jour la copie distante du projet).

L’utilisation est la suivante : git push.