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:
{% gist cake17/6624482 %}
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