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.

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é

source: http://osdir.com/ml/git/2009-04/msg02653.html

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

Tags

Pour lister les tags

$ git tag

Pour créer un tag

$ git tag new_tag

Pour supprimer un tag local

$ git tag -d tag_name

Pour pusher un tag

$ git push origin --tag

Pour supprimer un tag distant

$ git push origin :refs/tags/tag_name

Pour renommer un tag

$ git tag new_tag old_tag
$ git push origin --tag
$ git push origin :refs/tags/old_tag

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

Tutoriel basé sur des cas d'utilisation GitMagic