Tutoriels‎ > ‎

totoriel 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 avec ubuntu

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 "Votre Nom ou pseudo ou ce qui vous référence"
git-config --global user.email "monemail@exemple.org"

Votre configuration est enregistrée dans le fichier ~/.gitconfig (répertoire racine de votre compte)

[user]
  email = monemail@exemple.org
  name = Votre Nom ou pseudo ou ce qui vous référence

Mais ce fichier peut être édité directement si vous le souhaitez

Créer un projet GIT

Setup a public GIT repository

mkdir mondepot
cd mondepot
git init
git add .
git commit

Pour le faire exister en remote

git remote add origin <url du depot distant>
git push origin master

Récupérer la branche distante "gh-page" sous le nom "origin" (sur une seule ligne)

git remote add -f -t <fetchedrepo> -m <mergedrepo> origin <url repo>
-t = track 
-m = for merge

git remote add -f -t gh-pages -m gh-pages origin git@github.com:pascalfares/pisae2013.git


Appliquer tous les patchs d'origin dans le master vide

git merge origin

Maintenant "origin" est  gh-pages et non master  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 git@github.com:pascalfares/pisae2013.git

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 git@github.com:pascalfares/pisae2013.git
$ git-branch
* master
$ git-branch -r
  origin/HEAD -> origin/master
  origin/gh-pages
  origin/master
$ git-clone git@github.com:pascalfares/pisae2013.git
$ git-branch
  gh-pages
* master
$ git checkout gh-pages
$ git status
$ git checkout -f
$ git rebase origin/master

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é

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 (gh-pages) et la branche de base de devis (origin)

$ git log --oneline -r gh-pages..origin

"--oneline" permet d'afficher un commit par ligne.

Pour cloner une branche de itools avec git:

$ git show --stats

Utiliser .gitignore


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@github.com:pascalfares/pisae2013.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@github.com:pascalfares/pisae2013.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
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
XXXXXXXXXXXXXXXX