Git

Intro

GIT est un logiciel de versioning qui permet de suivre les évolutions d’un projet et de travailler dessus en collaboration. On va pouvoir enregistrer ces évolutions dans un dossier qui va se trouver à la racine du projet. Par exemple, si je veux suivre un dossier /projet le dossier .git dans:

projet/ .git/

Un dossier caché .git va être créé dans lequel on retrouve les configs du projet et l’historique du projet. Tout se passe en ligne de commande avec le terminal ce qui peut en dérouter plus d’un, mais une fois l’outil assimilé, vous pourrez à loisir conserver, mettre à jour et partager votre projet.

Pros for Git

C’est un logiciel de versioning décentralisé, ainsi chaque utilisateur possède l’ensemble du projet et de l’historique (Tout cela se trouve dans le dossier .git à la racine du projet). Ceci permet de pouvoir récupérer l’ensemble du projet si un des collaborateurs efface le projet.

Installation

Install with Homebrew

Install git with homebrew : brew install git See GIT version : git --version

Download Page for an install without Homebrew

Update with Homebrew

Update git : brew update git

Autocompletion

This is a great way to have access to all the params for git commands, using Tab keystroke. (push 2 times to see possible options)

To install git autocompletion : brew install git bash-completion

Then open your .bash_profile and add this :

if [ -f $(brew --prefix)/etc/bash_completion ]; then
  . $(brew --prefix)/etc/bash_completion
fi

Configs de Git

See this french article and Github Help for more information on git configs.

See config of a project : git config –list Edit global config of git : git config --global --edit

This is my global config:

Organisation of a Git project

On a donc le dossier projet qui contient .git : dossier avec l’historique et les configs du projet

Espace de travail : Il est hyper important de se rappeler que tous les dossiers et fichiers de projet ne sont qu’une version à un instant t de notre projet. On va voir par la suite que l’on peut naviguer entre différentes versions avec les branches et que GIT affiche dans l’espace de travail les fichiers de la branche (=version) souhaitée.

Start a git project

2 façons de faire cela :

git clone

cloner un dossier déjà suivi par GIT qui se trouve sur un autre ordinateur:

cd /Users/username/path/to/web/folder
git clone git@host.fr:/volume1/web/NomProjet.git

git init

Initialiser un projet:

cd /volume1/web
git init NomProjet

git status

Notre projet est donc suivi par git. Admettons que j’ai initialisé un projet et que j’ajoute un dossier /lib dans ce projet. Une des premières commandes que je vais utiliser est la suivante : git status. Bien entendu et pour toutes les commandes que je vais utiliser, il faut se placer dans le dossier racine c-à-d dans /projet/ pour notre exemple cd /chemin/vers/le/dossier/projet

Revenons à git status. Cette commande va permettre de nous donner les états des fichiers et des dossiers contenu dans le projet. Ainsi notre exemple nous indiquerait que le dossier /lib/ a été ajouté au projet. On l’ajoute pour le suivre et le faire rentrer dans notre historique : git add <nomDuFichier> Pour notre exemple : git add /lib/ La commande ‘add’ sert à dire à GIT que les fichiers sont prêts pour le prochain commit. Dans notre exemple, le fait d’avoir utilisé la commande git add n’a pas enregistré les modifications mais cela précise seulement que le dossier /lib doit être ajouté au prochain commit. En l’état, les modifications ne se trouvent que dans votre espace de travail.

to see what you’ve changed but not yet staged : changes between git diff compares what is in your working directory with what is in your staging area : git diff -staged

git commit

C’est un ensemble de modifications de fichiers/dossiers qui permettent d’ajouter une fonctionnalité, de régler un problème…. Par exemple, on veut ajouter un projet cakephp. On va récupérer un projet vide et le placer dans le dossier /projet/

On aura donc l’arborescence suivante:

projet/ app/ libs/ plugins/ ….

On lance git status : On voit que git a detecté mon dossier mais qu’il n’est pas encore versionné. On va donc faire : git add /app /libs /plugins /etc On peut ajouter les dossiers tous à la suite après git add. Une autre façon de faire serait d’ajouter tous les fichiers et dossiers avec la commande : git add --all. Cette commande va ajouter tous les dossiers et fichiers detectés comme modifiés ou comme nouveau. Ici nous n’avons pas d’autres fichiers donc on peut faire : git add –all. On voit qu’il vaut mieux finir une fonctionnalité ou régler un pb les uns après les autres et de commit une fois qu’une fonctionnalité est ajoutée. Ainsi on commit la fonctionnalité et on a de nouveau un espace de travail vierge où git ne verra pas de fichiers modifiés. Si l’on veut travailler sur plusieurs fonctionnalités, il faudra faire des branches sur lesquels travailler (voir plus loin les branches).

Revenons à notre exemple. Avec git add –all, tous nos fichiers sont enregistrés comme faisant parti du prochain commit. Faisons notre commit:

git commit -m "Initialisation of cakephp project"

Donc maintenant, si je relance git status, GIT ne detecte plus les fichiers modifiés ou ajoutés car il les a enregistré (versionné).

Maintenant, on peut les remodifier. Modifions le fichier config/core.php Lançons : git status Le fichier est bien noté comme modifié et on peut l’ajouter pour qu’il soit présent dans le prochain commit : git add app/Config/core.php Modifions maintenant le fichier database.php et configurons l’accès à notre base de données:

git status
git add app/Config/database.php

Maintenant re-modifions le core.php et git status On retrouve notre fichier dans 2 états. Mais pourquoi?? C’est logique : - On a la version au moment où j’ai ajouté avec git add - et on a la nouvelle version modifiée à l’instant

Si l’on veut les derniers changements, il faudra ré-ajouter avec git add app/Config/core.php. Et ainsi on pourra commiter avec les changements des 2 fichiers : git commit -m "config of core and database for cakephp project"

3 statuts pour les fichiers - Fichier modifié - Fichier ajouté - Fichier enregistré pour le prochain commit

Pour voir les commits enregistrés : git log

.gitignore

Il existe des fichiers dans notre projet que l’on ne veut pas prendre en compte et qui ne doivent pas faire parti du versionning. C’est le cas par exemple des fichiers .DS_STORE sur mac, ou de dossier de cache ou temporaire que l’on ne veut pas enregistrer dans le versioning de GIT. Pour cela, on peut mettre un fichier .gitignore avec des règles.

Branches

Pour montrer les branches du projet : git branch

Pour créer une branche et se placer dessus : git checkout -b NomBranche

Par défaut, la branche master est celle où se trouve la dernière version stable d’un projet.

Remotes

Pour voir quels remotes (dépots distants) sont disponibles pour le projet : git remote -v (En général origin avec l’URL du dépot du serveur)

Pour ajouter des remotes (dépots distants) dans mon systeme git local (sur mon ordi) : git remote add immo git://host.fr/volume1/web/dev/depot.git

Pour supprimer un remote : git remote rm immo

Pour récupérer sur mon ordi local les branches et les états du serveur distant : git fetch origin

Puis on peut suivre cette branche et aller dessus: git checkout --track origin/nom_branch

Enfin on peut la merger à notre branche master par exemple:

  git checkout master
  git merge nom_branch

List the URL for the remote repository as well as the tracking branch information : git remote show origin

Send and Receive data

Voir l’article sur les clés SSH pour configurer les clés SSH.

git pull

Cette commande permet de récupérer les données d’un remote

git push

Permet d’envoyer les commits sur un remote

Other things

Gitweb : Web interface to see branches/remotes and changes

git instaweb --httpd=webrick
git instaweb --httpd=webrick --stop

Gitolis : Management of permissions

TO DO

Fork sur Github

On a donc 2 dépots sur github : - un dépôt du projet original : exemple les docs officiels de cakephp : https://github.com/cakephp/docs.git - le dépôt forké qui est sur github https://github.com/cakephp-fr/docs.git - le dépôt cloné à partir du dépôt forké qui est sur mon ordi dans mon dossier

Git and Gandi Simple Hosting

http://wiki.gandi.net/fr/simple/git