Présentation
Si vous connaissez dĂ©jĂ bien GIT et que vous maĂ®trisez un minimum l’outil dans vos dĂ©veloppements, vous serez ravis d’apprendre que cette page recense quelques astuces qui vous simplifieront la vie !
Et qui sait, peut-ĂŞtre apporterez vous aussi une astuce ou deux sur cette page.
Optimisations diverses
RĂ©ordonner les objets GIT afin de gagner de la place
Lorsque vous effectuez la commande git count-objects dans votre dépôt, vous vous rendrez sûrement compte que le dépôt prend de la place inutilement.
Cette place peut se libĂ©rer Ă l’aide de la commande suivante :
git repack && git prune
La première commande va réordonner les objets, la seconde faire le ménage.
RĂ©ordonner l’arbre de manière interactive
Cette manipulation d’arbre est Ă faire sur les commits qui n’ont pas encore Ă©tĂ© envoyĂ© sur le dĂ©pĂ´t distant.
Ceci pour Ă©viter des conflits a posteriori.
git rebase --interactive
Pour en savoir plus je vous invite grandement Ă lire la documentation git officielle sur la modification des commits .
En relation avec les commits
Retourner au dernier commit effectué
Cela aura pour conséquence de perdre les modifications effectuées entre-temps.
git revert HEAD
Enlever un fichier se trouvant dans la liste “Changes to be committed: "
Faites simplement :
git reset -- /chemin/vers/depot/git/fichier
Enlever un fichier se trouvant dans la liste des “Changed but not updated: "
Faites simplement :
git checkout -- /chemin/vers/depot/git/fichier
Faire plusieurs commits avec un fichier modifié à plusieurs endroits
Il peut arriver qu’on veuille faire un commit d’un morceau de fichier, puis un commit de l’autre morceau de fichier modifiĂ©.
Cependant GIT voit le fichier comme modifiĂ© et l’ajoute tel quel Ă la liste des choses Ă commiter.
Pour permettre l’ajout d’une partie du fichier dans le commit, puis le reste des modifications dans un, voire plusieurs, commits, il suffit d’utiliser la commande suivante :
git add --patch mon_fichier
Ensuite pour voir que tout est OK on fait :
git diff --cached
Et finalement :
git commit
Recommencez autant de fois que nĂ©cessaire jusqu’Ă commiter toutes vos modifications.
Nombre de commit par auteur
Il suffit d’aller dans le dĂ©pĂ´t et de lancer la commande suivante (sous un SHELL bash/zsh/sh/autre):
git log --pretty=%ae|sort|uniq -c
Variables disponibles :
- %H Somme de contrĂ´le du commit
- %h Somme de contrôle abrégée du commit
- %T Somme de contrĂ´le de l’arborescence
- %t Somme de contrĂ´le abrĂ©gĂ©e de l’arborescence
- %P Sommes de contrĂ´le des parents
- %p Sommes de contrôle abrégées des parents
- %an nom de l’auteur
- %ae courriel de l’auteur
- %ad date de l’auteur (le format respecte l’option –date:simple_smile:
- %ar date relative de l’auteur
- %cn nom du validateur
- %ce courriel du validateur
- %cd date du validateur
- %cr date relative du validateur
- %s sujet
Changer des informations de commit suivant un critère
Il arrive parfois de vouloir changer un pseudo ou un nom en autre chose pour diverses raisons (oubli de configuration de son adresse courriel, nom au lieu de pseudo, etc.). Pour cela il suffit de suivre un peu le script suivant (en adaptant) :
git filter-branch --commit-filter '
if [ "$GIT_COMMITTER_NAME" = "<Ancien nom>" ];
then
GIT_COMMITTER_NAME="<Nouveau Nom>";
GIT_AUTHOR_NAME="<Nouveau Nom>";
GIT_COMMITTER_EMAIL="<Nouveau courriel>";
GIT_AUTHOR_EMAIL="<Nouveau courriel>";
git commit-tree "$@";
else
git commit-tree "$@";
fi' HEAD
Antidater un commit
Il suffit d’utiliser la variable d’environnement GIT_AUTHOR_DATE avant de faire un commit, par exemple :
GIT_AUTHOR_DATE="2015-11-05 15:42:06" git commit
Et votre commit sera fait Ă la date voulue.
Les branches
Créer une branche distante
git checkout -b nouvelle_branche
git push origin nouvelle_branche
Récupérer une branche distante
git pull
git branch -a
git checkout --track origin/nom_branche_distante
Si on veut renommer la branche locale avec un autre nom, on fait :
git checkout --track -b ma_branche_locale origin/nom_branche_distante
Attacher une branche distante Ă une branche que nous avons
Nous avons crĂ©e une branche Ă l’aide de la commande git branch ma_super_nouvelle_branche, mais nous voulions qu’elle soit attachĂ©e Ă la branche distante ma_branche_distante. Dans ce cas nous devons faire :
git branch --set-upstream ma_super_nouvelle_branche origin/ma_branche_distante
Supprimer une branche distante
git push origin :branche_distante
Si la branche a le mĂŞme nom qu’un tag :
git push origin :refs/heads/branche_distante
Fusion d’une branche Ă une autre en gardant l’historique
On se rend dans la branche qu’on veut garder. Puis on incorpore l’autre branche.
git checkout mabranche
git merge --no-ff autrebranche
Comparer 2 branches
Je vous propose 2 méthodes :
- afficher le détail de ce qui a changé
- afficher seulement les noms de fichiers ajoutés/modifiés/supprimés
Afficher le détail de ce qui a changé
Il suffit de donner les deux branches à comparé séparées par 2 points :
git diff maBranche..master
Afficher seulement les noms de fichiers ajoutés/modifiés/supprimés
Ajoutez –name-status en argument de git diff :
git diff --name-status maBranche..master
Afficher le nom du remote de la branche courante
On va utiliser les possibilités de git config.
@ représente HEAD.
git config --get branch.`git rev-parse --abbrev-ref --symbolic-full-name @`.remote
Les tags
Pousser sur le dépôt distant les tags locaux
git push --tags
Supprimer un tag distant
git tag -d MonTag
git push origin :refs/tags/MonTag
Personnalisation
Auto complètement des commandes GIT
Un script permet de compléter automatiquement les commandes, à la manière de BASH.
Ce dernier est disponible sur le dépôt GIT du projet GIT .
Ainsi :
- Prenez le fichier contrib/completion/git-completion.bash et copiez le à la racine de votre répertoire personnel.
- Éditez le fichier ~/.bashrc
- Ajoutez la ligne suivante :
source ~/git-completion.bash
- Rechargez votre fichier .bashrc :
source ~/.bashrc
Essayez ; profitez.
Omettre certains fichiers de l’historique (fichier ignore)
Parfois certains fichiers nous embêtent littéralement dans nos commandes git status (entre autre).
Ces fichiers peuvent ĂŞtre des binaires gĂ©nĂ©rĂ©s lors des tests, des fichiers personnels utilisĂ©s pour le projet, des fichiers temporaires de diffĂ©rents utilitaires d’Ă©dition de code, etc.
Deux mĂ©thodes s’offrent Ă vous pour ignorer les fichiers :
- un fichier .gitignore dans la racine de votre projet git
- un fichier n’importe oĂą dans votre machine renseignant les fichiers Ă omettre, ou les “pattern” Ă utiliser pour omettre un certain nombre de fichiers et/ou dossiers
La méthode partagée, pour tout les utilisateurs du dépôt
Cette mĂ©thode permet de dĂ©livrer sur le dĂ©pĂ´t git un ensemble de règles pour omettre des fichiers qui ne sont pas nĂ©cessaires Ă l’avancement du projet ou pour toute autre raison que ce soit.
Pour cela faites :
- Créez le fichier .gitignore
- Remplissez-le avec un ensemble de règles, par exemple :
*.pyc
*~
*.swp
Ceci vous permet de partager avec les autres utilisateurs ce qu’il faut ignorer (pour Ă©viter de faire trop d’objets git dans le dĂ©pĂ´t).
La mĂ©thode “personnelle”
Cette mĂ©thode est la mĂŞme, crĂ©ez le fichier que vous voulez Ă l’endroit que vous voulez, par exemple : ~/.gitignore, puis dites Ă git oĂą trouver ce fichier pour l’utiliser, via la commande :
git config --global core.excludesfile ~/.gitignore
Remplissez avec des règles qui vont bien.
Liens utiles
- Compter ses commits
- Astuces Git par Github (en)
- Explications de qualitĂ© sur la manière de sĂ©parer les modifications d'un fichier en plusieurs commits (en) : C’est une explication très utile pour amĂ©liorer la qualitĂ© de son historique GIT et se simplifier certaines tâches ardues de remodelage du dĂ©pĂ´t après coup, ou mĂŞme la recherche de bugs potentiels.
- Le cas des workflow (en) : Documentation officielle sur la compréhension des Workflows
- Restructurer un dépôt interactivement (en) : Explications de la documentation officielle