FAQ Git : retrouvez les meilleures réponses à vos questions pour apprendre Git, de niveau débutant à expert
FAQ Git : retrouvez les meilleures réponses à vos questions pour apprendre Git, de niveau débutant à expertConsultez toutes les FAQ
Nombre d'auteurs : 6, nombre de questions : 110, dernière mise à jour : 19 juin 2021
- Qu’est ce qu’un commit ?
- Comment créer un commit ?
- Comment ajouter un message en créant un commit ?
- Comment modifier le message d’un commit existant ?
- Comment supprimer le dernier commit de la branche courante sans perdre les modifications ?
- Comment supprimer le dernier commit de la branche courante avec les modifications ?
- Comment supprimer les “n” derniers commits de la branche courante sans perdre les modifications ?
- Comment supprimer les “n” derniers commits de la branche courante avec les modifications ?
- Comment ajouter un commit d’une branche A dans une branche B sans effectuer un merge (cherry-pick) ?
- Comment ajouter un commit provenant d’une branche d’un autre dépôt à la branche courante de ce dépôt ? (cherry-pick)
- Comment annuler un commit existant (revert) ?
Un commit est une révision du code source. Il est identifié par une empreinte numérique générée par une fonction de hachage (algorithme SHA-1).
Un commit est composé de métadonnées et du contenu (le code source) à versionner.
Les métadonnées sont :
- le message du commit ;
- le committer (l’utilisateur qui a créé le commit) ;
- la date de création du commit (au format RFC2822 par défaut, par exemple : Tue Oct 9 00:58:43 2018 +0200) ;
- l’auteur (l’utilisateur qui a créé le contenu du commit) ;
- la date de création du contenu (au format RFC2822) ;
- l’identifiant (SHA-1 donc) du commit parent (avec deux exceptions : si vous créez le premier commit du dépôt, alors il n’y a pas de parents et s’il s’agit d’un commit de merge alors il en a deux).
Sans entrer dans les détails internes du fonctionnement de Git, retenez simplement que par « contenu » on entend à la fois les modifications ajoutées à l’index (staging area) et également les fichiers et répertoires non modifiés.
L’empreinte numérique est appliquée sur les métadonnées et le contenu.
Ainsi, un commit bénéficie des propriétés des empreintes numériques :
- c’est rapide ;
- deux commits différents ne peuvent pas avoir le même identifiant ;
- il n’est pas possible de modifier les métadonnées ou le contenu d’un commit sans modifier son identifiant.
Pour plus de détails, on peut se référer à la documentation officielle ou à un tutoriel sur developpez.com.
Il est nécessaire d’avoir au préalable ajouté des fichiers à l’index (staging area).
git commit
Utilisée seule, cette commande permet d’ouvrir l’éditeur de texte de votre ligne de commande (vim sous macOS et sous Windows via Git BASH, nano sous Ubuntu par exemple) afin d’y saisir le message de commit.
Si aucun fichier n’a été ajouté à l’index, il est possible de passer l’option -a qui demande à Git de prendre tous les fichiers modifiés présents dans le répertoire de travail (working directory).
Une utilisation courante des options est : git commit -am "message de commit" ce qui permet de prendre toutes les modifications en cours et d’ajouter un message de commit dans le même temps.
L’option -m permet d’ajouter un message.
Par exemple :
git commit -m "message de commit"
git commit --amend -m "nouveau message de commit"
Comme expliqué dans la première question, ceci a pour effet de modifier le SHA-1 du commit.
git reset --soft HEAD^
Les modifications qui étaient présentes dans le commit supprimé sont encore présente dans l’index.
git reset --hard HEAD^
Les modifications qui étaient présentes dans le commit supprimé sont supprimées.
git reset --soft HEAD~3
Les trois derniers commits sont supprimés. Les modifications des trois derniers commits sont présentes dans l’index.
git reset --hard HEAD~3
Les trois derniers commits sont supprimés et les modifications qu’ils comportaient le sont avec.
Vous devez avoir effectué un checkout de la branche de destination, puis vous exécutez un cherry-pick en lui passant en paramètre le hash du commit désiré.
Par exemple, pour ajouter le commit 1234abcd à la branche master :
2.
git checkout master
git cherry-pick 1234abcd
L’astuce consiste à ajouter le dépôt source en tant que remote du dépôt courant et à faire un fetch (et seulement fetch) de ses branches.
Par exemple, pour ajouter à master le commit 1234abcd existant sur le dépôt boubou de l’utilisateur toto, la marche à suivre est la suivante :
2.
3.
4.
git remote add boubou git://github.com/toto/boubou.git
git fetch boubou
git checkout master
git cherry-pick 1234abcd
Une pratique essentielle est de ne jamais réécrire ou supprimer un historique qui a été publié et qui a donc pu être récupéré par un autre utilisateur.
Le revert ne supprime rien, il crée un nouveau commit qui est un miroir inverse du commit source.
git revert 1234abcd
Cette commande ajoute à la branche courante un nouveau commit qui sera l’exact inverse du commit 1234abcd. C’est la seule bonne manière d’annuler un commit existant qui a été publié.