Git Cheat Sheet
Par AMO
Commandes perso
Afficher l’état du dépôt, et des branches
git status
git log --oneline --decorate=full
git log --all --oneline --graph --decorate=full
Faire marche arrière sur un commit déjà pushé
git revert <SHA1>
Ceci créé un nouveau commit qui “inverse” les modifications contenues dans le commit pushé. N’inverse que le contenu du commit en paramètre.
Ajouter d’un dépôt créé localement à GitHub
Commencer par créer le dépôt sous Github avec le même nom que le répertoire du dépôt local. Puis lancer:
git remote add origin https://github.com/<nom_user_github>/<nom_dépôt>.git
git branch -M main
git push -u origin main
Supprimer un fichier qui a été indexé et qui est maintenant dans .gitignore
git rm --cached <file>
Aller chercher un fichier dans une autre branche
git checkout <nom-de-autre-branche> -- chemin/vers/le/fichier
git checkout <nom-de-autre-branche> -- chemin/vers/le/répertoire
Ajouter, avec une seule option, tous les fichiers modifiés
git add --all
Voir les différences présentes sur un fichier, entre 2 commits
git diff SHA2 SHA1 -- file_name
Pour les différences entre la version du fichier 2 commits précédents et le dernier commit, plusieurs solutions sont possibles:
git diff HEAD^^ HEAD file
git diff HEAD^^..HEAD -- file
git diff HEAD~2 HEAD -- main.c
Lister l’ensemble des fichiers suivis par Git
git ls-tree --full-tree --name-only -r HEAD
--ls-tree
oblige la commande à s’exécuter comme si elle était lancée depuis le répertoire racine.
--name-only
pour ne pas afficher les SHA1
-r
pour la récursivité et ainsi traverser les répertoires de l’arborescence
Problème sur un truc commité ? Faire marche arrière
Exemple dans le cas, imaginaire, où il faut revenir sur les 5 derniers commits
Soft reset
Pour faire marche arrière, sans vraiment annuler ces 5 commits (car cela entrainerait la perte du travail fait à travers ces commits), utiliser le soft reset:
git reset --soft HEAD~5
Cela conserve les modifications des commits annulés en tant que modififications non indexées.
Hard reset
Plus radical, le hard reset:
git reset --hard HEAD~5
Encore jamais utilisé. Il sera prudent de se renseigner pour identifier les différences avec le soft reset.
Point d’attention
ChatGPT, dans sa bonté, signale que si ces commits ont été poussés sur un dépôt distant, et que d’autres collaborateurs y ont accès, il convient de forcer le push avec la commande:
git push --force
Supprimer les fichiers non trackés du working tree
git clean -f -d chemin_vers_répertoire
Documentation officielle sur le sujet
Cherry-Pick
Situation: correction faite directement sur la prod (branche main), commitée et pushée. Comment la rapatrier en dev (branche dev) ?
Se mettre sur la branche dev:
git checkout dev
Récupérer l’identifiant du commit à récupérer de main:
git log --all --oneline --graph
Une fois l’identifiant du commit repéré, utiliser la commande git cherry-pick
:
git cherry-pick <identifiant du commit>
Cela applique le commit sélectionné à la branche en cours, càd, dev. Si le commit apporte des modifications qui entrent en conflit avec des modifications existantes sur la branche active, alors, il faut les résoudre manuellement.
Git log avec affichage de la date
git log --pretty=format:'%C(yellow)%h%C(reset) %C(green)%ad%C(reset) %C(blue)%an%C(reset) %C(red)%d%C(reset) %s' --date=short
Explications:
-
–pretty=format:’…’ permet de définir le format d’affichage
-
%C(color) change la couleur du texte qui suit jusqu’à %C(reset)
-
%C(yellow)%h%C(reset) affiche le hash abrégé en jaune
-
%C(green)%ad%C(reset) affiche la date au format court en vert
-
%C(blue)%an%C(reset) affiche le nom de l’auteur en bleu
-
%C(red)%d%C(reset) affiche les informations de branche/tag en rouge
-
%s affiche le message du commit sans couleur
-
–date=short affiche la date au format abrégé (ex: 2023-05-11)
Les bases
Création et récupération d’un dépôt
git init <répertoire>
git clone <url> [répertoire]
Processus du commit
Ajout des modifications à la zone de cache:
git add ‹fichier›
Commit des modifications:
git commit -m <message>
Supprimer un fichier:
git rm <fichier>
git commit
Renommer / déplacer un fichier:
git mv <source> ‹destination>|<répertoire de destination>
Faire le point sur un dépôt
Etat du dépôt : nouveaux fichiers, conflits branche locale/distante, zones de cache et de travail:
git status
Afficher les contenu des modifications:
git diff [--cached]| [SHA1 SHA1]
Historique des commits de la branche courante:
git log [--oneline] [SHA1]
Consulter la version d’un fichier d’un commit précis:
git show <SHA1>:<fichier>
Récupérer un fichier d’une version donnée, dans la zone de travail:
git checkout [SHA1]-- ‹fichier>
Liste de auteurs des modifications:
git blame [SHA1] <fichier>
Les branches locales
Création d’une branche:
git branch <branche> [SHA1]
git checkout -b <branche>
Changement de branche:
git status
git checkout ‹branche>
Lister les branches locales:
git branch [-v]
Fusionner une branche dans la branche active:
git merge < branche>
Gérer les conflits de merge:
git status
Editer le(s) fichier(s) et corriger !
Annuler un merge en cours:
git merge --abort
Les branches distantes
Mettre à jour le dépôt local et les branches locales:
git pull
Mettre à jour le départ au local uniquement:
git fetch
Pousser des modifications sur le serveur distant:
git push
Récupérer une branche distante:
git checkout ‹branche>
git checkout -b ‹branche> origin/<branche>
Visualiser l’historique des commits et les références:
git log -oneline -all --decorate=full
Ici, c’est l’option -all est l’option qui affiche l’ensemble des branches, qui est importante.
Gestion des tags
Lister les tags:
git tag
Créer un tag:
git tag [-a] <tag> <SHA1 >
Supprimer un tag local:
git tag -d ‹tag>
Supprimer un tag distant:
git push --delete origin < tag>
Partager des tags:
git push origin ‹tag>
git push --tags
Utiliser la zone de stash
Mettre en stash:
git stash [save message]
Récupérer le contenu du stash:
git stash apply <stash @{n}>
Lister les zones de stash:
git stash list
Supprimer une zone de stash:
git stash drop <stash @{n}>
Voir le contenu d’une zone de stash:
git stash show -p <stash @{n}>
Récupérer et supprimer une zone de stash:
git stash pop <stash @{n}>