Table des matières
- Tutoriel GIT
- Introduction
- Installer GIT
- Bien configurer son GIT
- Créer un projet GIT
- Git et les branches
- Créer un patch par commit
- Envoi de patches
- Commiter vos modifications
- Modifier le message du commit précédent
- Revenir à un commit précédent
- Git log --diff-filter
- Divers
- Utiliser .gitignore
- Créer et utiliser un miroir git
- Construire et envoyer un patch
- Branches
- Tags
- Modifier son dernier commit
- Packer son dépôt
- Limiter la taille des packs
- R&D sur GIT
Tutoriel GIT
Introduction
Voici un petit tutoriel qui vous permettra de prendre en main GIT, le gestionnaire de versions distribué.
Installer GIT
Voici le code pour installer GIT
sudo apt-get install git-core git-doc git-email gitweb gitk
Bien configurer son GIT
Voici comment s'identifier dans git
git-config --global user.name "Sylvain" git-config --global user.email "sylvain@example.com"
Votre configuration est enregistrée dans le fichier ~/.gitconfig
[user] email = sylvain@example.com name = Sylvain
Mais ce fichier peut être surchargé par les variables d'environnements
echo 'export GIT_AUTHOR_NAME="Sylvain"' >> ~/.bashrc echo 'export GIT_COMMITTER_NAME="sylvain"' >> ~/.bashrc echo 'export GIT_AUTHOR_EMAIL="sylvain@example.com"' >> ~/.bashrc source ~/.bashrc
Créer un projet GIT
Setup a public GIT repository
mkdir itools cd itools git-init git add . git commit
Modifier les ACL du gitosis-admin. Pour cela il faut opérer sur un clone du gitosis-admin.git que l'on push après modification :
- le fichier à modifier est gitosis.conf
- on ajoute le projet en writable dans le/les groupes voulus (group itaapy en général) ! merci de conserver l'ordre alpha
- on ajoute une section pour le projet avec sa description et son owner ! merci de conserver l'ordre alpha
- diff de vérification, commit et push
Pour le faire exister en remote
git remote add origin git@git.hforge.org:itools.git git push origin master
Récupérer la branche distante "0.15" sous le nom "origin" (sur une seule ligne)
git-remote add -f -t 0.15 -m 0.15 origin git+ssh://itaapy/var/git/itools.git
Appliquer tous les patchs d'origin dans le master vide
git-merge origin
Maintenant "origin" est 0.15 et non master (0.16) comme avec un git-clone. On peut faire les git-fetch origin et git-rebase origin comme d'habitude.
Clones a repository into a new directory
$ git-clone http://git.abakuc.com/abakuc.git
Autre exemple
$ git-clone git+ssh://itaapy/var/git/basty--herve
Synchronisation du dêpot
$ git-fetch origin $ git-log master..origin $ git-rebase origin
Git et les branches
Travailler avec plusieurs branches dans GIT
$ git-clone itaapy:/var/git/itools.git $ git-branch $ git-branch -r $ git-branch 0.15 origin/0.15 $ git-branch $ git-checkout 0.15 $ git-status $ git-checkout -f $ git-rebase origin/master
Créer un patch par commit
$ git-format-patch origin 0001-XXX.patch 0002-XXX.patch
Créer un unique patch pour plusieurs commit effectués : Pour créer un patch unique sur plusieurs commit, il suffit de faire un reset de vos commit et de créer votre patch.
Voici un exemple pour créer un patch unique sur vos 2 derniers commit
$ git-reset --soft master~2 # XXX on n'est pas censé commiter ici ? $ git-format-patch origin
Il est aussi possible de regrouper tout les patchs en un seul
$ git-format-patch origin..maBranche --stdout > myPatchXYZ.patch
Envoi de patches
$ git-send-email --smtp-server smtp.nerim.fr --to jdavid@example.com 0001-XXX.patch 0002-XXX.patch
"smtp-server" est optionnel si vous en avez déjà un sur localhost:25
Voir les modifications que j'ai apportées au dépôt
$ git-diff master --color
Pour toujours profiter de la couleur, ajouter un alias dans ~/.bashrc
alias git-diff='git-diff --color'
On peut toujours le désactiver si besoin en appelant 'git-diff' (avec les apostrophes).
Commiter vos modifications
Avant de commiter, vous devez vérifier ce qui a été modifié
$ git-diff
ou
$ git-diff <fichier ou répertoire>
approuver la modification avec
$ git-add <fichier ou répertoire)
Si on modifie encore un fichier approuvé, git est assez intelligent pour montrer le diff entre le dernier git-add et la nouvelle modification.
Vérifier qu'on n'oublie rien
$ git-status
Vous montrera notamment les fichiers qui n'ont pas été ajoutés (se demander alors pourquoi).
On peut maintenant faire le commit
$ git-commit
Vérifier si le chef du projet sur lequel on contribue n'a pas des préférences pour le message de commit.
Modifier le message du commit précédent
$ git-commit --amend
Revenir à un commit précédent
Il est possible d'annuler le ou les derniers commits. Exemple pour annuler le dernier commit :
$ git-reset master~1
Ce qui fera disparaître toute modification.
Pour annuler les deux derniers commits
$ git-reset --soft master~1
L'option "--soft" conserve les modifications. On peut alors refaire son commit.
Attention car faire disparaître des commits modifie l'historique. Si vous aviez fait un miroir juste avant, git refusera d'écrire sur le miroir sans l'option "-f".
Pour annuler un commit plus loin, et vu qu'on ne peut/doit pas modifier l'historique, il faut appliquer le patch inverse :
$ git-revert <ID du commit>
Git va préparer un commit "Revert of 'message du commit'" en appliquant le patch inverse, s'il n'y a pas de conflit bien sûr. Vous devrez garder ces deux commits dans votre historique.
Git log --diff-filter
L'option --diff-filter permet de filtrer les commits ayant ajouté/supprimé/copié/modifié/renommé ...
--diff-filter=[(A|C|D|M|R|T|U|X|B)...[*]]
Valeurs possible pour --diff-filter
- A: ajouté
- C: copié
- D: supprimé
- M: modifié
- R: renommé
- T: changé
- U: unmerged
- X: "unknown"
- B: paring broken
Exemple: Trouver quel commit a supprimé un fichier
$ git log --diff-filter=D -- nom/du/fichier/supprimé
Divers
Afficher les log des différents commit effectués
$ git-log --color
Pour toujours avoir la couleur, faites un alias bash (voir "Envoi de patch" plus haut).
Afficher la liste des fichiers du dépôt git
$ git-ls-files
Visualiser le delta entre la branche active (devis) et la branche de base de devis (origin)
$ git log --oneline -r devis..origin
"--oneline" permet d'afficher un commit par ligne.
Pour cloner une branche de itools avec git:
$ mkdir itools $ cd itools $ git-init $ git-remote add -f -t 0.15 -m 0.15 origin git+ssh://itaapy/var/git/itools.git $ git-merge origin
Avoir des statistiques sur le dernier patch effectué:
$ git show --stats
Utiliser .gitignore
$ cat .gitignore build dist MANIFEST version.txt doc/README.html doc/doc-zones.xcf doc/index.html doc/publication.png doc/specifications.html doc/installation.html doc/tunnel*.png out.* *.pyc
Ou alors .git/info/exclude
$ cat .git/info/exclude *~ *.pyc *.swp build dist MANIFEST version.txt locale/*.mo *.xml.es *.xml.fr *.xml.it *.xml.zh *.xhtml.es *.xhtml.fr *.xhtml.it *.xhtml.zh test/fables/catalog
Créer et utiliser un miroir git
$ grep GIT ~/.bashrc export GIT_AUTHOR_NAME="Moi ..." ... $ cd ~/sandbox $ cg-clone /var/git/PvxCoreApplication--luis PvxCoreApplication--moi $ cd PvxCoreApplication--moi $ cg-admin-setuprepo -g users /var/git/PvxCoreApplication--moi $ cg-branch-add mirror /var/git/PvxCoreApplication--moi $ cg-push mirror
Construire et envoyer un patch
$ git-format-patch origin $ git-send-email --smtp-server smtp.nerim.fr --to norman@khine.net \ 0001-Change-the-storage-for-companies-and-addresses-now.patch
Pour appliquer le patch
$ git-am 0001-Change-the-storage-for-companies-and-addresses-now.patch
Pour utiliser les alias de git-push
Créer l'alias "mirror" dans .git/config
[remote "mirror"] url = git+ssh://itaapy/var/git/ortho--herve.git push = +refs/heads/*:refs/remotes/*
Ce qui va mirrorer toutes les branches et tous les tags.
Pour ne mirrorer que master
[remote "master"] url = git+ssh://itaapy/var/git/ortho--herve.git push = master:master
Si on a fait un git-rebase qui a modifié l'historique, on doit ajouter un -f:
git-push -f mirror
Astuce : ajoutez un alias bash "git-mirror='git-push mirror'". Ne mettez pas "-f" dans l'alias.
Branches
Pour créer une nouvelle branche depuis master
$ git-checkout -b newname
Pour supprimer une branche
$ git-branch -d oldname
Pour supprimer une branche distante
$ git push origin :oldname
Modifier son dernier commit
Il peut être utile de modifier son dernier commit par exemple :
- Afin de le renommer
- Pour fusionner une nouvelle modification à ce commit.
Dans ce cas utilisez la commande
$ git-commit --amend
Compter le nombre de commit par commiteur:
$ git shortlog -sn
1537 J. David Ibanez 434 Henry Obein 364 Hervé Cauwelier 177 David Versmisse 162 Nicolas Deram 71 Taverne Sylvain
Packer son dépôt
Il est conseillé de régulièrement packer son dépôt. Pour cela on peut par exemple utiliser
$ git gc
Limiter la taille des packs
Pour éviter de se retrouver avec des packs de plusieurs giga peu évidents à manipuler, on peut restreindre la taille maxi des packs.
Dans son .gitconfig ou le .git/config d'un dépôt, on peut ajouter les informations ci-dessous (pack de taille maxi 512Mo):
[pack]
packSizeLimit = 512m
R&D sur GIT
- Setup git over http (WebDav)
- Working with Others
- A tutorial introduction to git (for version 1.5.1 or newer)
- Refspec syntaxe (voir chapitre REMOTES, DEFAULT BEHAVIOUR)
- Tutoriel suivant les profils
- [Basic Repository], [Individual Developer (Standalone)], [Individual Developer (Participant)], [Integrator], [Repository Administration]
- http://www.kernel.org/pub/software/scm/git/docs/everyday.html
Tutoriel basé sur des cas d'utilisation GitMagic