PagePrincipale .
memos .
Git
Git
Paramètres globaux
Avant d'utiliser Git, quelques paramètres à configurer:
git config --global user.name "Daniel Rocher"
git config --global user.email daniel.rocher@mondomaine.lemien
git config --global core.editor vim
Coloration syntaxique:
git config --global color.ui auto
éventuellement renseigner une clé privé (pour signature):
git config --global user.signingkey 19A5982E
Commandes de base
Aides:
git help
aide sur une commande:
git commande --help
Initialiser un dépôt:
mkdir monprog && cd monprog
git init
Ajouter des fichiers (existants) au dépôt:
git add fichier1 fichier2
Supprimer un fichier du dépôt:
git rm fichier
Voir le statut:
git status
sont affiché les fichiers modifiés ainsi qu'une liste de fichiers n'ayant pas été rajouté au dépôt.
Pour ignorer certains type de fichier (ex: *~, Makefile, *.o, ...), il est possible de créer un fichier
.gitignore à la racine de notre projet contenant la liste des fichiers à ignorer. Il est également possible de créer un fichier d'exclusion global:
git config --global core.excludesfile Chemin_et_nom_du_fichier_d_exclusion
Commit:
git commit -a -m "mon premier commit"
Modifier le changelog du dernier commit
git commit --amend
Voir les logs:
git log
En cas de perte d'un commit, on peut utiliser reflog pour peut-être le retrouver. reflog garde une trace de nos déplacements (checkout, commit, merge, ...):
git reflog
Voir les différences:
modifications en cours:
git diff
différence avec un commit particulier:
git diff commit
Annuler les modifications courantes et revenir en haut de la branche:
git reset --hard HEAD
- git reset permet de spécifier quel commit est le haut de la branche (HEAD)
- HEAD correspond au haut de la branche
- le répertoire de travail sera dans l'état dans lequel il était après le dernier commit (option --hard)
restaurer un fichier tel qu'il était lors du dernier commit:
git restore fichier (remplace
git checkout fichier)
Se positionner sur un commit particulier:
git switch commit
Attention:, à ce stade nous sommes sur aucune branche (détaché).
Annuler le dernier commit
git reset HEAD^
- git reset permet de spécifier quel commit est le haut de la branche (HEAD)
- HEAD^ correspond au commit n-1 (équivalent à HEAD~1). HEAD~2 = commit n-2, ...
- le répertoire de travail gardera ses modifications (utilisation de l'option --mixed par défaut)
Attention: à utiliser AVANT de pousser vos commits (via
git push)
Si le commit a déjà été poussé, il faut créer un nouveau commit qui inverse (revert) :
git revert 97392dad053c420ecc989915fd6857962e568913
git push
Branches
Voir les branches:
git branch
git branch -a affichera également les branches distantes
Créer une branche à partir de la position courante:
git branch branche1
Se positionner sur la branche:
git switch branche1 (remplace
git checkout branche1)
Créer une branche à partir d'un commit et se positionner dessus:
git switch -c branche2 commit (remplace
git checkout -b branche2 commit)
Supprimer une branche locale
git branch -d branche1
"Faire le ménage" sur les branches distantes qui n'existe plus
git fetch origin --prune
Pousser des branches:
Pousser une branche et paramétrer pour suivre la branche distante (branche de suivi):
git push -u <remote> <branche>
Toutes les branches :
git push <remote> --all
"merger" une branche avec la branche maître:
git switch master
git merge branche1
rebase
permet de repartir sur de "bonnes bases", par exemple si on souhaite intégrer le travail effectué sur une autre branche, et les intégrer dans notre branche (sans les fusionner).
Lire
https://www.miximum.fr/blog/git-rebase/
Résoudre les conflits
modifiez les fichiers ayant comme statut:
"Unmerged paths"
Solution 1: recherchez dans chaque fichiers les sections à corriger comprise entre les lignes <<<<<<<, =======, et >>>>>>> ) puis, une fois corrigé:
git commit -a
Solution 2: utilisez un outil de fusion externe à l'aide
git mergetool
Exemple avec kdiff3:
git mergetool --tool kdiff3
et une fois les conflits résolus:
git commit
Il est possible de choisir un outil de résolution de conflits par défaut:
git config --global merge.tool vimdiff
Créer et appliquer des patchs
créer un fichier diff:
git diff commit > monpatch.patch
ou :
git format-patch -1
Vérifier si le patch s'applique sans erreur:
git apply --check monpatch.patch
Appliquer un correctif :
git apply monpatch.patch
Picorage (cherry-pick) :
- Un picorage consiste à prendre le patch qui a été appliqué sur une branche, et à essayer de l’appliquer sur la branche sur laquelle on se trouve. Par exemple, une vulnérabilité corrigée pour Lineage OS 15.1 (Android 8.1), essayer de l'appliquer sur la branche cm-14.1 (Android 7.1) :
git switch cm-14.1
git cherry-pick 1b4feb73e288ee3e18f6182a0760f53c1166c3cb
Les tags
Lister les tags:
git tag
tags légers: (sans signature, sans adresse mail, ...)
git tag 1.1.beta1 (il s'agit simplement d'un pointeur vers un commit)
tags annotés:
git tag -a 2.0 -m "version 2.0"
git show 2.0
tag 2.0
Tagger: Daniel Rocher <daniel.rocher@mon.domaine>
Date: Fri Jul 30 15:17:44 2010 +0200
version 2.0
commit 42ce24af4104fe6c1a460faaeb78f2d37af80fde
Author: Daniel Rocher <daniel.rocher@mon.domaine>
Date: Fri Jul 30 14:45:51 2010 +0200
tags annotés et signés:
git tag -s 2.1 -m "version 2.1"
ou bien en spécifiant la clé:
git tag -s -u 19A5982E 2.1 -m "version 2.1"
Tags et dépôt distant
Pour pousser un tag sur le dépôt distant:
git push origin 2.1
Pousser tous les tags:
git push origin --tags
Supprimer un tag distant:
git push --tags origin :2.1
Travailler à plusieurs avec git
Créer le dépôt:
mkdir projet.git && cd projet.git/
git init --bare
Ou bien cloner notre projet existant pour créer un dépôt public:
git clone --bare projet/ projet.git
Cloner le projet distant (exemple d'accès via ssh):
git clone ssh://daniel@mon.domaine/serveur/git_depots/projet.git
git remote affichera la liste des dépôts distants
git remote -v idem, mais avec plus d'informations
Ajouter un nouveau dépôt distant:
git remote add robert ssh://daniel@autre.domaine/var/git_depots/projet.git
Récupérer les informations d'un dépôt distant mais sans l'inclure dans notre branche courante:
git fetch origin
git fetch robert branche2
ces modifications seront visibles dans des branches spécifiques de mon dépôt local (dans l'exemple:
origin/master pour l'un,
robert/branche2 pour l'autre).
Les branches de suivi:
Important: git clone configure automatiquement une branche master qui est une branche de suivi pour origin/master.
Si on ne veux pas utiliser
git pull <repository> <refspec> explicitement (ou
git push <repository> <refspec>) , on peut créer une branche de suivi. Exemple:
git push --set-upstream origin master
git push --set-upstream origin experimental
Ou plus simplement, si je donne un nom de branche locale qui existe dans une branche distante, git créera automatiquement une branche locale qui suivra la branche distante:
git switch experimental
donnera le même résultat que la commande précédente.
Si une branche existe déjà localement, elle ne pourra pas être créé. On pourra cependant modifier la configuration pour que notre branche locale suive la branche distante. Exemple pour
master ->origin/master:
git config branch.master.remote origin
git config branch.master.merge refs/heads/master
autre exemple (
experimental -> origin/experimental):
git config branch.experimental.remote origin
git config branch.experimental.merge refs/heads/experimental
Tirer les modifications des dépôts distants
git pull ( =
git pull origin master)
git pull robert branche2
Attention! git pull récupère la branche distante et la fusionne avec notre branche locale (commit de fusion).
Pousser nos modifications vers un dépôt distant (si droit en écriture):
git push ( =
git push origin master)
Sauvegarder l’état actuel de votre travail (stash)
Permet de sauvegarder un travail sans faire de commit afin de pouvoir le réutiliser plus tard.
Sauvegarder l’état actuel
git stash
ou
git stash save "etat actuel"
Afficher la pile courante
git stash list
Appliquer le dernier stash de la pile SANS le supprimer
git stash apply
Appliquer le dernier stash de la pile et le supprimer
git stash pop
fonctionnalités Avancées
Pour supprimer un dossier et des fichiers dans tous l'historique
Attention DANGER : tout l'historique est réécrit ! De plus, tous les collaborateurs devront recloner le dépôt
sudo apt install git-filter-repo
git filter-repo --analyze
git filter-repo --invert-paths --path CHEMIN_ETOU_FICHIER
# force
git filter-repo --force --invert-paths --path CHEMIN_ETOU_FICHIER
# autre exemple :
git filter-repo --strip-blobs-bigger-than 10M
git push origin --force --all
Maintenance
vérifier le dépôt:
git fsck
Libérer de l'espace disque, compresse certains objets, ...:
git gc
Effacer tous les commits perdus, etc -- À utiliser avec précaution !!!
git fsck --no-reflogs --unreachable
git reflog expire --expire=now --all
git gc --aggressive --prune=now
git fsck --no-reflogs --unreachable
Références:
Pages utiles:
RechercheTexte,
TableauDeBordDeCeWiki
Flux RSS:
Wiki,
Commentaires