PRÉSENTATION
gestion de versions décentralisé
Un peu d'histoire
Git n'était pas, au départ, à proprement parler un logiciel de gestion de versions.
par bien des aspects, vous pouvez considérer Git comme un système de fichiers : il permet un adressage associatif, et possède la notion de versionnage, mais surtout, a été conçu en résolvant le problème du point de vue d'un spécialiste des systèmes de fichiers. Il n'y avait donc aucun intérêt à créer un système de gestion de version traditionnelLinus Torvalds
VERSIONING
Le Versioning chez les Autres
Gestion d'une liste de fichiers et de leurs modifications dans le temps.
L'autre Vision du versioning
(PRESQUE)
TOUTES LES OPÉRATIONS SONT LOCALES
La plupart des opérations de Git ne nécessite que des fichiers et ressources locaux.
GESTION DE L'INTÉGRITÉ
Mecanisme de controle
24b9da6552252987aa493b52f8696cd6d3b00373
Philosophie de l'ajout
Dans quel état j'erre...
validé, modifié et indexé
- vous modifiez des fichiers dans votre répertoire de travail ;
- vous indexez les fichiers modifiés, ce qui ajoute des instantanés de ces fichiers dans la zone d'index ;
- vous validez, ce qui a pour effet de basculer les instantanés des fichiers de l'index dans la base de données du répertoire Git.
Avantages de GIT
- Le dépôt, puisque local et autonome, est toujours accessible et extrêmement rapide, même lorsque déconnecté du réseau.
- Git ne stocke pas les fichiers, mais les différences entre les fichiers : ce principe lui permet de disposer d'un des mécanismes de fusion les plus efficaces.
- Contrôle total sur le dépôt : on ne dépend plus d'une entité externe. Avec une solution centralisée.
- Un système de branchage extrêmement efficace.
Fonctionnement
Structure du repository
3 Type d'objets
- Les blobs : qui représente en réalité un fichier, ou plutôt une version bien précise d'un fichier.
- Les trees : qui sont en fait des répertoires, contenant des objets blobs, comme dans tout système de fichiers.
- Les commits : le nom parle de lui même.
- Les tags : un tag peut être associé à un commit, afin de l'identifier plus simplement.
Le répertoire .git
-
config/ :
-
objects/* :
-
ref/heads/* :
-
logs/* :
-
refs/remotes/* :
-
index :
-
HEAD :
Utilisation
Création d'un repository git
cd monprojet/
git-init
git-add .
git-commit
git-clone remote_url
Enregistrer des modifications dans le dépôt
git status
git add LISEZMOI
Indexer des fichiers modifiés
Si un fichier est modifié mais pas indexé il ne sera pas commité !
$ git status # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # new file: LISEZMOI # # Changes not staged for commit: # (use "git add <file>..." to update what will be committed) # # modified: benchmarks.rb
#
Il faut donc l'indexer.
$ git add benchmarks.rbOn contôle.
$ git status # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # new file: LISEZMOI # modified: benchmarks.rb #
$ git status # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # new file: LISEZMOI # modified: benchmarks.rb # # Changes not staged for commit: # (use "git add <file>..." to update what will be committed) # # modified: benchmarks.rb
Ignorer des fichiers
Le fichier ".gitignore" contient toute les règles d'exclusions.
# un commentaire, cette ligne est ignorée # pas de fichier .a *.a # mais suivre lib.a malgré la règle précédente !lib.a # ignorer uniquement le fichier TODO à la racine du projet /TODO # ignorer tous les fichiers dans le répertoire build build/ # ignorer doc/notes.txt, mais pas doc/server/arch.txt doc/*.txt
Inspecter les modifications indexées et non indexées
$ git status # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # new file: LISEZMOI # # Changes not staged for commit: # (use "git add <file>..." to update what will be committed) # # modified: benchmarks.rb #
$ git diff diff --git a/benchmarks.rb b/benchmarks.rb index 3cb747f..da65585 100644 --- a/benchmarks.rb +++ b/benchmarks.rb @@ -36,6 +36,10 @@ def main @commit.parents[0].parents[0].parents[0] end + run_code(x, 'commits 1') do + git.commits.size + end + run_code(x, 'commits 2') do log = git.commits('master', 15) log.sizeCette commande compare le contenu du répertoire de travail avec la zone d'index. Le résultat vous indique les modifications réalisées mais non indexées.
Comparer les fichiers indexés avec le dernier instantané.
git diff --cached (avec les versions 1.6.1 et supérieures de Git, vous pouvez aussi utiliser git diff --staged, qui est plus mnémotechnique).
$ git diff --cached diff --git a/LISEZMOI b/LISEZMOI new file mode 100644 index 0000000..03902a1 --- /dev/null +++ b/LISEZMOI2 @@ -0,0 +1,5 @@ +grit + by Tom Preston-Werner, Chris Wanstrath + http://github.com/mojombo/grit + +Grit is a Ruby library for extracting information from a Git repositor
Valider vos modifications
$ git commit
Éliminer la phase d'indexation
git commit -a
Mettre un commentaire
git commit -a -m 'added new benchmarks'
Resultat
$ git commit -m "Story 182: Fix benchmarks for speed" [master]: created 463dc4f: "Fix benchmarks for speed" 2 files changed, 3 insertions(+), 0 deletions(-) create mode 100644 LISEZMOI
Visualiser l'historique des validations
$ git log commit ca82a6dff817ec66f44342007202690a93763949 Author: Scott Chacon <schacon@gee-mail.com> Date: Mon Mar 17 21:52:11 2008 -0700 changed the version number commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7 Author: Scott Chacon <schacon@gee-mail.com> Date: Sat Mar 15 16:40:33 2008 -0700 removed unnecessary test code commit a11bef06a3f659402fe7563abf99ad00de2209e6 Author: Scott Chacon <schacon@gee-mail.com> Date: Sat Mar 15 10:31:28 2008 -0700 first commit
Gestion des TAGS
$ git tag v0.1
$ git tag -a v1.4 -m 'my version 1.4' $ git tag v0.1 v1.4
$ git show v1.4 tag v1.4 Tagger: Scott Chacon <schacon@gee-mail.com> Date: Mon Feb 9 14:45:11 2009 -0800 my version 1.4 commit 15027957951b64cf874c3557a0f3547bd83b3ff6 Merge: 4a447f7... a6b4c97... Author: Scott Chacon <schacon@gee-mail.com> Date: Sun Feb 8 19:02:46 2009 -0800 Merge branch 'experiment'
LEs Branches
Création d'une Branche
$ git branch test
Le pointeur HEAD
Changer de branche
$ git checkout test
La branche sur laquelle HEAD pointe avance avec chaque nouveau commit.
On revient a la branche initial et on remplace les fichiers de la copie de travail.
$ git checkout master
On modifie ensuite un fichier sur master et on commit.
et paf !
Pour Git, une branche n'est en fait qu'un simple fichier contenant les 40 caractères de la somme de contrôle SHA-1 du commit sur lequel elle pointe, les branches ne coûtent rien à créer et détruire. Créer une branche est aussi rapide qu'écrire un fichier de 41 caractères (40 caractères plus un retour chariot).Scott Chacon
LE MERGE
Le FAST FORWARD
$ git checkout master $ git merge my_branch Updating f42c576..3a0874c Fast forward LISEZMOI | 1 - 1 files changed, 0 insertions(+), 1 deletions(-)
LES CONFLITS
$ git merge my_branch Auto-merging index.html CONFLICT (content): Merge conflict in index.html Automatic merge failed; fix conflicts and then commit the result.Les ennuis commencent...
Voir les conflits
[master*]$ git status index.html: needs merge # On branch master # Changes not staged for commit: # (use "git add <file>..." to update what will be committed) # (use "git checkout -- <file>..." to discard changes in working directory) # # unmerged: index.html #
<<<<<<< HEAD:index.html <div id="footer">contact : email.support@github.com</div> ======= <div id="footer"> please contact us at support@github.com </div> >>>>>>> my_branch:index.htmlUn fois le(s) fichier(s) corrigé(s), on oublie pas d'indexer.
Le REBASE
Dans Git, il y a deux façons d'intégrer les modifications d'une branche dans une autre : en fusionnant (merge) et en rebasant (rebase).
Le rebase, consiste à ré-écrire l'historique de la branche, de manière à ce qu'il s'adapte à la dernière version de la branche sur laquelle on veut la merger.
Une fois l'historique ré-écrit, nous pouvons merger la branche, et aucun conflit ne peut alors intervenir, puisque le rebase aura fait en sorte, au préalable, de s'adapter à la dernière version de la branche destination.
$ git checkout my_branch $ git rebase master First, rewinding head to replay your work on top of it... Applying: added staged commandAprès gestions des conflits voila le résultat :
Une fois le rebase terminer on merge normalement.
Dans ce cas on se retrouve dans un cas de FAST FORWARD.
$ git checkout master $ git merge my_branch
Après merge standard :
Après un rebase et un merge :
Références
PRO GIT
Git, gestionnaire de version décentralisée
http://www-igm.univ-mlv.fr/~dr/XPOSE2008/git/gestionnaires.html
Site du Zero
Gérez vos codes source avec Git
Un petit jeu
Maintenant foncés !
git
By nafresne
git
- 820