Ceci est une ancienne révision du document !
Table des matières
GIT
Liens:
Installation
# aptitude install git-core
config
$ git config --global user.name "Thierry JAOUEN" $ git config --global user.email <adresse_email@xxxxxx.fr> $ git config --global core.editor vim
Bases
initialiser depot
On va dans un repertoire de developpement:
$ cd <PATH>
Et puis:
$ git init Initialized empty Git repository in /home/thierry/devel/c/test/.git/
Un coup d'oeil:
$ git status # On branch master # # Initial commit # nothing to commit (create/copy files and use "git add" to track)
Bah oui, y a rien.
ajouter fichiers
$ touch reappro.c $ touch Makefile $ git add reappro.c Makefile
On aurait pu faire:
$ git add *
ou
$ git add .
Un coup d'oeil:
$ git status # On branch master # # Initial commit # # Changes to be committed: # (use "git rm --cached <file>..." to unstage) # # new file: Makefile # new file: reappro.c #
premier commit
$ git commit
(commentaire du commit
grace à vim)
Created initial commit 5d5dfef: My first commit 0 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 Makefile create mode 100644 reappro.c
Un coup d'oeil:
$ git status # On branch master nothing to commit (working directory clean)
Ok, il est content.
modification
On modifie le fichier “reappro.c” … mais bien que git sait que le fichier est modifié, il ne l'incluera pas automatiquement dans le prochain commit …
Donc, aprés modif, soit:
$ git add <le_nom_du_fichier_modifié>
Ce qui n'est pas génial…
Sinon, y a mieux: ajouter -a
au commit
. Exemple:
$ git commit -a -m "seconde version" Created commit 7bb4fe4: seconde version 1 files changed, 13 insertions(+), 0 deletions(-)
( -m
permet de se passer de vim pour mettre un commentaire )
annuler
vite
On souhaite retrouver un fichier dans l'etat du dernier commit
:
$ git checkout <nom_du_fichier>
Mais aussi (et ca s'applique a tout les fichiers modifiés) :
$ git reset --hard
un etat precis
Avec git-log
, on retrouve le “sha” du “commit”. Par exemple:
... commit b2a6c281ed5fcf3b5a8185bb041e732acc54e0a2 Author: Thierry JAOUEN <mymail@myfai.fr> Date: Sat Dec 12 01:03:01 2009 +0100 ...
On y revient, en effacant tout ce qui n'existait à cette époque:
$ git-reset --hard b2a6c281ed5fcf3b5a8185bb041e732acc54e0a2
log
Simple:
$ git log
Avec les differences:
$ git log -p
Un peu moins:
$ git log --stat --summary
A savoir
Branches
bases
Par défaut, on est dans la branche master :
$ git branch * master
On va creer une nouvelle branche:
$ git branch experimental
Voyons ça:
$ git branch experimental * master
On est toujours dans la branche master…
Changeons de branche pour experimental :
$ git checkout experimental Switched to branch "experimental" $ git branch * experimental master
Et voila.
Faire les modifs dans la branche experimental …
Faire un commit a partir de cette branche:
$ git commit -a -m "dans ma branche experimentale"
Et revenir a la branche master :
$ git checkout master
fusion
fusionner la branche courante avec une autre branche:
$ git merge experimental
S'il n'y a pas de conflit, c'est bien.
Sinon, il faut etudier les conflits comme cela:
$ git diff
Corriger les conflits, commit
des changements et refaire un merge .
suppression
Couper (supprimer) une branche, en verifiant (au passage) quelle est bien “mergé” :
$ git branch -d experimental Deleted branch experimental.
Couper (supprimer) une branche sans condition :
$ git branch -D experimental Deleted branch experimental.
clone
simple
On va cloner pour travailler sur le projet…
$ git-clone ssh:<USER@MACHINE>/<PATH>/monprojet ./monprojet
Et voila, le projet est cloné dans le répertoire: monprojet
Modifier le projet…
Y a t'il eu des modifications à la source ?
$ git-pull
Already up-to-date.
Non, aucune.
“commiter” ses modifications…
Et puis “push”:
$ git-push
Counting objects: ….
Compressing objects: ….
Writing objects: ….
Total ….
Ok.
Mais comment le “distant” sait que j'ai fait une modif ???
En fait git-status
dit ce qui a été modifié.
Alors j'ai fait:
$ git-reset –hard
Et voila…
Mais il doit y avoir plus simple…?
La réponse est là: http://git.or.cz/gitwiki/GitFaq#Whywon.27tIseechangesintheremoterepoafter.22gitpush.22.3F
=== origin ===
$ git-remote show origin
thierry@xxxxxxxxxx's password:
* remote origin
URL: ssh:thierry@xxxxxxxxxx/~/devel/yyyyy/labo/kkkkkk
Remote branch merged with 'git pull' while on branch master master Tracked remote branch master
bare
ajouter “–bare” pour que l'orgine soit “oublié”, comme si vous étiez l'initiateur du repository.
exclude
Il y a plusieurs façons de faire…
La doc:
$ man gitignore
.gitignore
Dans son repertoire de travail, créer un fichier .gitignore
et mettre dedans les repertoires ou les fichiers (pattern) a exclure.
Exemple:
$ cat .gitignore # ---------------- obj/ samples/ # ----------------
Et puis finalement:
$ git add .gitignore
Parce qu'il fait aussi partie du projet, finalement.
Et voila, la commande git-status
devrait ignorer les répertoires.
fusion
(Et non pas “merge”, qui induit une faille spatiotemporelle dans mon cerveau)
Lien: http://www.kernel.org/pub/software/scm/git/docs/howto/using-merge-subtree.html
On veut “fusionner” 2 partie d'un même projet, mais qui ce sont developpé independament.
Par sécurité, j'ai fait ça dans un clone . Ce n'est que tout à la fin, une fois satisfait du résultat, que j'ai fait un push |
Dans le répertoire du projet receveur:
$ git-remote add -f <un_nom_de_projet> <chemin_repo>
( git-remote show
peut maintenant nous montrer ce nom de projet)
$ git-merge -s ours --no-commit <un_nom_de_projet>/master Automatic merge went well; stopped before committing as requested $ git-read-tree --prefix=<subdir/> -u <un_nom_de_projet>/master
( les fichiers sont là, mais les logs ne sont pas à jour… )
$ git-commit -a -m "fusion avec <un_nom_de_projet>" $ git-pull -s subtree <un_nom_de_projet> master
( les logs contiennent aussi ceux du projet importé… )
Et comme on a plus besoin du “remote”…
$ git-remote rm <un_nom_de_projet>
Et voila.
“<subdir>” peut être “<un_nom_de_projet>”.