Git pour les (pas si) nuls
-
Upload
malk-zameth -
Category
Technology
-
view
2.453 -
download
4
description
Transcript of Git pour les (pas si) nuls
GitPour les (pas si) nuls
Générique
MoiChez
LicenceTrouvez
pres
Sources
@malk_zameth@linagoraCC-BY-SA 3.0slideshare.net/malk_zameth/git-pour-les-pas-si-nuls● The Friendly Manual● Pro Git● kernel.
org/pub/software/scm/git/docs/gitworkflows.html
● rogerdudler.github.com/git-guide/
Partie I: Intro
Qu'est-ce?
Contrôle de version (VCS)Mais c'est quoi "contrôle de version"?
Gestion de l'information dans le temps
c-a-d.?
Mémoire de ce qu'on a fait
Un grand archive de copies donc?
Grand archive organisant automatiquement
Je lui delegue la memoire de ce que mes fichiers on été.
DistribuéJe controle mes versions en local et à distance (nul
maître)
Synchro fichierremplaçant RSync
Transfert fichierremplaçant ftp
Pourquoi utiliser un VCS?Je gagne quoi moi?
Ne pas perdre le passéComme le "de-faire" et "re-faire" de mon editeur.
Mais pour toujours.
Visualiser le changementVoire comment un fichier a changé, ce qu'a été fait.
Arreter de faire la même chose a la main
le massacre des .oldles copies de dossier sous-le-coude
Avoir plusieurs versions de vos idées qui co-
existentc'est le cas dans votre tête déjà, mettez sur fichier!
Pourquoi utiliser un DVCS?Quel gain d'un Git/Hg/Bz sur un SVN ?
“Aucun homme n'est une île, un tout, complet en
soi”Jhon Donne
Faciliter la collaborationJe partage directement avec toi ce que nous avons en
commum.
Plus de commits en pratique
Je peux commiter sans impacter personne, sans que ça se voit, je peux editer/delester/regrouper mes commits avant de publier : donc je le fait plus
souvent.
Decouple VCS de l'accès à l'infra
Je commite dans l'avion, dans le train, pendant que mon serveur est hors service.
Decouple VCS de l'Existance de l'infra
Je peux utiliser sans jamais avoir un serveur quelque part. Où avant qu'il soit prêt.
Pourquoi utiliser Git?plutôt qu'un autre DVCS ?
PuissancePlein (il faut admettre: trop), de fonctionalités.
VitesseGit et Hg sont les deux allucinants et personne les bat.
SimplicitéNe pas confondre avec "faible courbe d'aprentissage".
C'est l'invèrse du jeu d'échecs.
SécuriséOn peut utiliser/obliger les clefs SSH pour ecrire sur un
depot et/ou lire.
Devenu lingua francaEn 2009 persone m'aurait convaincu que j'écrirais ça un
jour
GitHubCar le reseau social est une bonne idéee aussi pour le
travail.
Où utiliser Git?
Sur chaque fichier qui sera édité.
Toujours.Pas d'exceptions.
Quand utiliser git?
À chaque édition.Toujours.
Pas d'exceptions.
Qui doit utiliser Git?
Cette présentation vise deux publiques.
Tout être humain voulant "chercher bonheur".Vous éditez des fichiers? Continuons donc!
Tout être humain voulant "gêrer des projets"
Vous produisez des fichiers en équipe? Continuons donc!
Comment utiliser Git?
Partie II: Git tout seul dans sa machine sans
connectionOui ça vaut largement déjà le coup!
Il faut un client gitTrois parfums
Vous êtes dev?Vous avez donc déjà un Environnement de Dev?
Intégrez Git a votre Environnement!
Eclipse: EgitEmacs: Magit
Vim: vim-fugitiveSublime Text 2: sublime-text-2-git
Pas Dev; pas peur du terminal?
La ligne de commande est votre amie.
git tout court donc, dans toute sa puissance.
Et si j'ai peur du terminal?
Dans cette présentation je vous prends par la main
et peut être après vous n'aurez plus peur.
Et si après j'ai toujours peur du terminal?
git-colaou bien gitg, giggle, gitk+git-gui etc.
Pas à paspour apprendre git, il vaut mieux utiliser un peu
Créez un repertoire de test
la où vous voulez, disons:mkdir -p ~/git-test; cd ~/git-test
Créez un fichier de votre choix
votre oeuvre litteraire a vous, un programme, disons:echo "mon merveilleux fichier" > test.txt
git initon dit a git "Interesse toi a ce répértoire et ces sous-
répértoires"
Nous avons maintenant un .git
ls .git donne quoi?
HEADLibellé comme un autre.
point "le plus a jour", le "present" le "dernier commit".
git statusquel est ma situation actuelle?
Mon fichier n'est pas encore pris en compte par
git!
git commitJ'ai fait des modifications/ajouts et veux que ils soient
pris en compte.
Erreur!git connais pas le fichier.
Commit a deux étapes
d'abord on un indexe des changements
on apelle ça "stage":J'ai fait des changements, garde les dans le
colimateur, il a d'autres fortement associés que je dois finir.
git add <nom du fichier>disons git add test.txt.
notez que le message de git status change.
puis:git commit
J'ai fini un sous ensemble de modifications qui sont liés, je veux donner a eux une description.
On peut faire plusieurs stage sur le même fichier
Et si le concept même de stage ne me sert a rien?
git commit -ane m'embete pas avec le stage et commite mes
changements
A vous de jugezil n'y a pas de "meilleure" manière, le stage est un outil
optionnel a utiliser ou a oublier.
Que contient le passé de mon projet?
git logles gros chiffres incomprehensibles? identifiants
uniques!
Messages de commit: fil d'Arianne vers le passé
Qu'ai je fait moi dans ce passé?
git log --author
Qu'a été fait depuis hier?
git log --since "yesterday"
memorisez le moins possible
Notez les commandes qui vous sont utiles
qui vous utilisez vraiment
donnez des noms a ces commandes
de noms à vous, personnels que votre cerveau souviendra
git config alias.<nom> <commande>
git config alias.st statusgit config alias.lg "log --pretty=oneline --abbrev-
commit --graph --decorate"l'option --global les mets dans votre fichier de conf à
vous
Voir le passé
git show <version>:<nom du fichier>
git show HEAD~3:test.txt
Voire les differences entre les fichiers actuels
et HEAD
git diff
Entre l'actuel est un point du passé
git diff <version>git diff head~3
Entre deux points du passé
git diff <version>..<version>
git diff HEAD~3..HEAD~4
Comment Ré-écrire l'histoire?
Je veux oublier des changements
git reset <version>Ne Jamais faire sur quelque chose qu'on publie. On ne
réecrit pas de l'histoire déjà racconté!
Je veux regrouper des changements
git rebase -i <version>Aussi a ne faire que si on a pas publié l'info.
Je oublier des changements en indiquant
bien cela comme une action
git revert <version a oublier>
Petit commits frequents : plus de souplesse et
pouvoiron peut mieux choisir quoi reverter dans le futur
on peut toujours regrouper des petits commits dans un seul plus grand (squash)
les numero de version unique sont indigestes
Je veux donner un nom a une version spécifique
git tag <nom de la version>
git tag 1.0git tag publiee_dans_la_newsletter_octobre_2012
Je veux travailler avec plusieurs visions du même
documentau même temps
les branches
git branch <branche>fait la creation de la branche, a partir de HEAD
Ne va PAS a la branche
git checkout <branche>change de branche, va la branche choisie
cela prête à confusionOn peut un jur creer une branche et oublier de
changer vers elle, faire des bêtises!
git checkout -b <branche>fait la creation de la branche et immediatement
change de branche (faites en un alias, utilisez toujours comme ça)
Consolider des branches en une seule
git merge <branche a merger sur l'actuelle>
pas envie de garder la branche?
git branch -d <branche a effacer>
on a pas besoin de griller des neurones a inventer de tres bons nos pour des branches temporaires qu'on
effacera juste après
On a toujours une branche
celle par defaut s'apelle master
Utilisez de branches!
Utilisez-les souvent!avant de demarrer chaque nouvelle direction dans les
fichier du projet; chaque nouvelle idée; chaque nouvelle demande.
Pourquoi?
Jongle entre une version connue et celle en cours
très vite
idées et experimentationsdans un coin prévu.
gestion de version sur les idées
que je peux, finalement, abandoner sans rien toucher de mon historique
J'évite une infinité de problèmes.
99% des fois que j'aide quelqu'un avec un "problème" sur git: le problème n'aurait jamais existé si la
personne au depart de son changement avait crée une branche!
Partie III : Git avec des remotes"serveurs distants"
prendre une copie d'un depot distant
elle deviendra locale, une reference au depot distant sera faite sur le nom par defaut origin
git clone <url du depot>git clone https://github.com/malk/git-playback.git
ajouter un remotepour les même projet on peut avoir beaucoup
genre un du client, un pour chaque collaborateur, etc.
git remote add <nom> <url>
git remote add mmozuras https://github.com/mmozuras/git-playback.git
On a nos remotes
prendre les changements distants
copies à coté, mes fichiers ne changent pas
git fetch <remote> <branche>
git fetch mmozuras master
Incorporer des changements distants
déjà récupérés par un fetch
On sait déjà faire ça!c'est une branche comme une autre!
On fait un merge!
git merge origin/masterje merge la branche master dans origin ( origin/master ) dans ma branche actuelle (je choisit l'actuelle avec
un checkout)
On ne merge que la version déjà "fetché"
si on oublie le fetch on merge une version peut etre déjà vieille
Confusion possiblecomment éviter?
git pull <remote> <branche>git pull origin master
fait un fetch puis un merge: plus d'oubli.
Incorporer changements locaux dans branche
distanteSi nous avons les permissions!
git push <remote> <branche>
git push --tags origin masterl'option tags fait un push des tags créees aussi
Avant tout push
● Un petit git status○ Suis-je au bon endroit? sinon checkout.○ Il manque quelquechose a comitter? on ne push que
HEAD!● Je fait un pull de la branche distante● J'incorpore tout, événtuel, changement● resout tout, éventuel, conflit: les
commiter.● C'est bon je peux "pusher".Suivez cette checklist ça vous évitera des soucis!
Partie IV : Gestion de projet
On doit produire de choses ensemble: évitons le chaos
Workflow
Processus de travailComment j'enchaine les diverses étapes de travail pour
produire.
Plusieurs VCS contrainent ou forcent un workflow
Git permet une infinitéun aperçu kernel.
org/pub/software/scm/git/docs/gitworkflows.html
Dont plusieurs incompatibles!
Si vous ne choisissez pas un workflow pour vous
Vous avez un sans se rendre compte, naturellement
Ou peut être plusieurs!
Si vous ne choisissez pas un pour votre équipe
Vous avez surement déjà plusieurs!
J'espere qu'ils soient tous compatibles! La chance!
Cela peut engendrer dès problèmes
Trouvez donc un workflow!
Deux bonnes heures bien investies!Je peux vous aider au pire.
Definissez les phases de vie de votre production
Création? Consolidation? mise en prod? hotfix? quoi d'autre?
Tout ça ça deviens de branches.
Definissez les intercations entre ces phases
et transformez-les en alias/script git avec des noms qu'ont un sens pour votre équipe.
Et vous aurez un workflowmon point de départ favori:
http://nvie.com/posts/a-successful-git-branching-model/
Quel commit a inséré ce bug?
git bisecton declare des versions comme ayant ou pas le bug (on teste a chaque fois) et par dichotomie ils nous aide a
retrouver la version qu'a inseré le bug
Qui a inseré cette ligne dans le fichier?
git blameDonne auteur par ligne (--L pour limiter les lignes)
Où a-t-on écrit tel truc? Entre mes fichiers au sein d'un projet?
git grepcomme grep, mais dans l'arbre de fichiers controlé par
git
Voire l'effet des commits de quelqu'un comme un slideshow de son travail
git playbackhttps://github.com/mmozuras/git-playbackgénère un fichier html avec un tel slideshow
Aprendre git a resoudre un conflit d'une manière
comme on a déjà fait avant
l'apprendre a suivre nos habitudes et donc économiser du temps.
git ReReRefaut d'abord activer
git config --global rerere.enabled 1après ça la commande marche
ouvrir un serveur http tournant une page en
navigation de l'arborescence d'un depot
git
git instaweb(j'avais dit: trop ;)
Devenir un pro du git