Aide-mémoire Git
Les commandes du quotidien, et surtout la section « je me suis trompé ».
Se configurer, une fois pour toutes
$git config --global user.name "Prénom Nom"
$git config --global user.email "prenom.nom@mail.fr"
$git config --global init.defaultBranch main
$git config --global pull.rebase false# fusionner plutôt que rejouer
$git config --list# tout relire
Démarrer
$git init# transformer le dossier courant en dépôt
$git clone <url># récupérer une copie d'un dépôt existant
$git clone <url> nom-local# en choisissant le nom du dossier
La boucle de la journée
$git status# où j'en suis : c'est la commande à taper en cas de doute
$git add fichier.py# préparer un fichier précis
$git add .# préparer tout ce qui a changé
$git commit -m "message" # enregistrer un instantané de ce qui est préparé
$git push# envoyer sur le dépôt distant
Regarder ce qui s'est passé
$git log --oneline# une ligne par commit
$git log --oneline --graph --all# avec les branches dessinées
$git log -p fichier.py# l'historique d'un seul fichier, avec les diffs
$git diff# ce qui a changé et n'est pas préparé
$git diff --staged# ce qui est préparé et pas encore enregistré
$git show <commit># le contenu d'un commit
$git blame fichier.py# qui a écrit quelle ligne, et quand
Les branches
$git branch# lister
$git switch -c ma-branche# créer et s'y placer
$git switch main# revenir sur la principale
$git merge ma-branche# ramener son travail dans la branche courante
$git branch -d ma-branche# supprimer une branche fusionnée
$git push -u origin ma-branche# la publier la première fois
Travailler avec les autres
$git pull# récupérer et fusionner le travail des autres
$git fetch# récupérer sans fusionner, pour regarder d'abord
$git remote -v# voir les dépôts distants
$git log HEAD..origin/main# ce qui est arrivé et que je n'ai pas encore
$git status# la liste des fichiers en conflit
$git add fichier-resolu.py
$git commit# le message de fusion est proposé
$git merge --abort# ou tout annuler et revenir avant la fusion
Je me suis trompé
| Ce qu'on veut | La commande |
|---|---|
| Annuler mes modifications d'un fichier, non préparées | git restore fichier |
| Retirer un fichier de la préparation, sans perdre les changements | git restore --staged fichier |
| Corriger le message du dernier commit | git commit --amend -m "nouveau message" |
| Ajouter un oubli au dernier commit | git add oubli puis git commit --amend --no-edit |
| Annuler le dernier commit, garder les changements | git reset --soft HEAD~1 |
| Annuler le dernier commit et les changements | git reset --hard HEAD~1 |
| Annuler un commit déjà envoyé, proprement | git revert <commit> |
| Mettre mon travail de côté un instant | git stash puis git stash pop |
| Récupérer un commit perdu | git reflog puis git reset --hard <commit> |
Ce qui se trompe le plus souvent
| Le piège | Ce qu'il faut faire |
|---|---|
reset sur une branche partagée | revert, qui ajoute un commit au lieu de réécrire |
.gitignore posé trop tard | git rm --cached fichier pour cesser de le suivre |
| Un secret enregistré puis retiré | le considérer comme divulgué et le changer |
git add . sans regarder | git status puis git diff avant chaque commit |
Un reset --hard malheureux | git reflog, qui garde tout pendant trente jours |
| Un conflit qu'on ferme sans relire | chercher les repères restants avant de valider |
Ne pas versionner n'importe quoi
$cat .gitignore
node_modules/
__pycache__/
.env
*.log
dist/
$git rm --cached .env# cesser de le suivre, sans le supprimer
$git commit -m "retirer .env du suivi"