drupal 7 in a nutshell...formation git total • delicious insights, paris geneanet • 24–25...

108
Geneanet • 24–25 octobre 2013 Git Total Formation intra-entreprise chez Geneanet Delicious Insights

Upload: others

Post on 17-Oct-2020

1 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Geneanet • 24–25 octobre 2013

Git TotalFormation intra-entreprise chez Geneanet

Delicious Insights

Page 2: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013Christophe Porteneuve 2

§ Christophe Porteneuve§ Git + github depuis 2008

§ Open-source (Rails, Prototype, Sprockets, etc.)§ Privé / Corporate (~100 projets)

§ Co-fondateur et CTO, Delicious Insights§ Créateur des formations Git Attitude et JS Attitude

$ whoami

Page 3: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

10 octobre 2011 3

La gestion de versions : pourquoi, comment ?

Page 4: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013Christophe Porteneuve 4

§ On veut toujours pouvoir revenir en arrière…§ Parce qu’on s’est trompé§ Parce qu’on veut comparer§ Parce qu’on veut sauvegarder§ …

§ On veut pouvoir travailler à plusieurs…§ sans se marcher dessus§ sans devoir tout consolider manuellement§ sans se bloquer les uns les autres§ en réseau… ou hors-ligne !

Pourquoi gérer des versions ?Parce que sinon c’est la chienlit…

Page 5: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013Christophe Porteneuve 5

À la base : des sauvegardes locales…et souvent manuelles ! Ou RCS, PVCS, Time Machine…

Page 6: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013Christophe Porteneuve 6

Puis vinrent les gestions centraliséesCVS, Subversion (SVN), ClearCase, VSS, Perforce, TFS, RTC…

Page 7: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013Christophe Porteneuve 7

Et enfin les gestions distribuéesDarcs, DCVS, Git, Mercurial, Bazaar, Fossil…

Page 8: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013Christophe Porteneuve 8

Principaux avantages du décentraliséC’est le top, mais ‘faut dire pourquoi…

§ Pas de criticité d'une seule machine (point de défaillance / SPF).§ Les contributeurs peuvent travailler déconnectés du « serveur ».§ On peut participer à un projet sans nécessiter les permissions par un

responsable du projet (les droits de commit/soumission peuvent donc être donnés après avoir démontré son travail et non pas avant) ; inestimable pour la contribution aux projets open-source.

§ La plupart des opérations sont (beaucoup) plus rapides, car locales !§ On peut faire du travail « privé » : des brouillons, des essais… sans

risque de gêner les collaborateurs.§ Rien n’empêche de garder un dépôt de référence, avalisé, sur lequel

seuls certains peuvent écrire.

Page 9: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013Christophe Porteneuve 9

Quelques concepts génériquesTout métier a son jargon

§ Commit / Révision / VersionSérie de modifications faisant l’objet d’une soumission unique, idéalement thématique et atomique. Reçoit un identifiant unique.

§ HeadDernier commit en date dans l’historique de référence actuel

§ Tag / LabelÉtiquette sémantique apposée sur un commit (ex. « v1.0 »). Un tag n’est pas censé être repositionné après coup.

§ DépôtEnsemble de révisions pour un même projet, local ou distant (sur un serveur), avec les méta-données associées.

§ BrancheHistorique thématique (série de révisions). Un même dépôt peut avoir plein de branches, comme un arbre.

§ Tronc / MasterLa branche de référence d’un dépôt

§ FusionRéconciliation des travaux de plusieurs branches pour un résultat consolidé

§ ConflitSituation empêchant une fusion automatique ; se résout manuellement

§ Working Directory/Tree/CopyL’état actuel sur le disque des dossiers et fichiers

git help glossary

Page 10: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

10 octobre 2011 10

Configuration aux p’tits oignons

Page 11: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013Christophe Porteneuve 11

§ Installer un Git à jour correctement§ http://bit.ly/prepgit

§ Une configuration globale (pour votre profil utilisateur, tous dépôts confondus) bien pratique§ https://gist.github.com/470582§ Passons-la en revue ensemble…

§ Un ajustement de configuration de shell (Linux / OSX / fenêtre de commande msysgit)§ https://gist.github.com/473838§ Examinons le pourquoi du comment ensemble…

§ Quelques essais pour s’assurer que tout est au point

Vos besoinsPetit quiz rapide

Page 12: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

10 octobre 2011 12

Concepts fondamentaux

Page 13: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013Christophe Porteneuve 13

Les zones« Où » est votre fichier

working directory stage git directory

(repository)

add commit

reset [--mixed]

checkout / reset --hard

Super ressource interactive : http://ndpsoftware.com/git-cheatsheet.html

Page 14: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013Christophe Porteneuve 14

Le cycle de vie du fichierDans quel(s) état(s) est votre fichier

modified staged unmodified

add

reset [--mixed]

untracked

commit

rm --cached

modifier le fichier

Page 15: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013Christophe Porteneuve 15

§ git add = prendre une photo, stocker dans l’index / le stage

§ git commit = prendre les photos du stage et en faire un commit (metadonnées + tree + blobs)

§ On peut donc avoir un même fichier dans deux zones (stage et WD) mais avec un état différent (staged, forcément, mais aussi dirty/changed) : il suffit de le modifier entre le add et le commit

Le stage / l’indexSouriez pour la photo

Page 16: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

10 octobre 2011 16

Créer un dépôt

Page 17: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013Christophe Porteneuve 17

§ Soit on est les initiateurs du dépôt…1. git init2. Création éventuelle des .gitignore 3. git add .4. git commit -am "Import initial"

§ Soit on récupère un dépôt distant existant§ git clone git@monserveur:chemin/du/depot.git (R/W)§ git clone git://github.com:rails/rails.git (R/O)§ git clone http://lalose.net/depotpourri (R/O)

bientôt obsolète…

Vos besoinsPetit quiz rapide

Page 18: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013Christophe Porteneuve 18

git add . — ahem…git add -u : parce que tu avais oublié git rmgit add -A : combo classique + -u (WD + index)git add -f : même si le fichier est ignorégit add -i : pour ne prendre que des morceaux !git add -p : histoire d’accélérer le -i

git addTout est dans la granularité

Page 19: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013Christophe Porteneuve 19

git commit -m : le message à la voléegit commit -a : chopper tout ce qui est déjà tracké

§ Attention, pas les untracked !

git commit -am : la combogit commit … -- chemin… : juste certains fichiers

§ Et donc on ignore le stage sur ce coup

git commit -t template : gabarit de message

git commitDu plus long au plus court

Envie de voir sous le capot ?git help core-tutorial / git help tutorial-2

git help repository-layout

Page 20: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

10 octobre 2011 20

Examiner en détail le WT, l’index, le dépôt…

Ah la vache c’estque tu as de bons

yeux dis donc

Page 21: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013Christophe Porteneuve 21

§ Permet de voir immédiatement§ Les fichiers non versionnés (untracked)§ Les fichiers modifiés non validés (modified)§ Les modifications validées (staged)§ Certains cas spéciaux (both modified : conflit de fusion…)

§ Fournit des indications utiles aux débutants§ Pour valider une modification§ Pour « dévalider » une modification validée§ etc.

§ On en a la version courte dans le prompt conseillé

git status« Bon j’en suis où là ?! »

Page 22: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013Christophe Porteneuve 22

git diff --stagedgit diff --stat/numstat/shortstat/dirstat[=…]git diff -wgit diff --word-diff/word-diff-regex=…§ Syntaxes d’intervalle§ Limitation à certains chemins

git diffMille et un formats

Page 23: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013Christophe Porteneuve 23

git log --stat/numstat/shortstat/dirstat[=…]§ Stats rapides sur l’impact du log sur le dépôt§ dirstat en particulier est sympa pour du 10,000-ft

git log --graph§ Histoire de visualiser les branches, fusions…

git log -p§ Afficher les diffs à la volée. Conserve le graphe !

git log --author=… : filtrer par auteurgit log --grep -E -i … : filtrer sur les messagesgit log -S / -G : filtrage sur les diffs (texte ou regex)

git logTellement plus d’infos

Page 24: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013Christophe Porteneuve 24

§ Affiche une entité Git (commit, tree, blob) de manière appropriée

§ git show commit§ Message + diff

§ git show blob§ Contenu du blob (fichier à une révision spécifique)§ Pratique en combo avec la syntax commit:path

§ git show tag§ Objet référencé (révision en général)

§ …

git showPour y voir clair

Page 25: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013Christophe Porteneuve 25

§ Très large gamme de possibilités§ git help rev-parse

§ sha/abbrev-sha : classique^, ^^, ^^^… ~n : parent, grand-parent, etc. (main line)^n : nième parent (pertinent sur merges seulement){date-spec} : top utile pour log/diff§ :0:path / :1:path / :2:path / :3:path

§ Le stage, l’ancêtre commun, le parent main line, le parent fusionné

§ @{n}, @{-n}§ Tout ça en suffixe d’une autre ref : combinable, donc…

Les syntaxes de révisionSoyons précis

Page 26: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013Christophe Porteneuve 26

§ HEAD§ La tête de la branche courante

§ ORIG_HEAD§ La version plus lisible de HEAD@{1}.

§ Précédente position de HEAD§ MERGE_HEAD, REBASE_HEAD

§ Révision en cours de fusion/rebase

§ FETCH_HEAD§ Révision distante qui a fait l’objet du dernier fetch (généralement la

tête de la branche distante)

Les révisions symboliquesÇa veut toujours dire la même chose

Page 27: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

10 octobre 2011 27

Soucis classiques et solutions optimales

Page 28: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013Christophe Porteneuve 28

git commit --amend§ En fait un reset --soft HEAD^ suivi d’un commit classique…

git commit --amend -C HEAD (alias « git oops »)§ Récupérer le message d’origine, tel quel§ Ni vu ni connu, on croirait que t’avais tout bon du 1er coup

J’ai oublié un truc dans le commitEt c’est même pas la première fois

Page 29: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013Christophe Porteneuve 29

git reset§ Le couteau suisse de Git§ Une des commandes les plus méconnues pourtant :-(

git rm --cached§ Si ça n’a jamais été committé jusqu’ici§ Ou pour déversionner un fichier tout en le gardant dans le WD

J’ai stagé un truc que j’aurais pas dûUne erreur est si vite arrivée

Page 30: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013Christophe Porteneuve 30

§ Si ça vient d’arriver, il suffit de revenir en arrière avec un reset et de refaire le bon commit§ On combinera avec profit rm --cached et --amend…§ …ou simplement un reset --soft manuel

J’ai committé un truc en tropJe me méfie jamais assez de git add .

Page 31: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013Christophe Porteneuve 31

§ Tout dépend du niveau de confidentialité…§ Fichier confidentiel qui ne doit en fait figurer nulle part

dans l’historique : il va falloir réécrire l’histoire§ Le plus « simple » est un filter-branchgit filter-branch --index-filter \ 'rm --cached --ignore-unmatch SECRET.txt'§ Sinon une modif du commit fautif et un rebase par-dessus…§ Dans tous les cas, on flingue les SHA, il faudra faire quelques

forçages sur les pushes, fetches/pulls, etc.

§ Fichier non sensible, il faut juste le virer…§ Commit dédié, rien de spécial

J’ai committé un truc en trop (y’a un bail)Je sais j’aurais dû le voir avant

Page 32: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013Christophe Porteneuve 32

§ On était parti pour du chirurgical et puis on s’est laissé entraîner

§ Tirer parti du git add -p§ Retirer du stage « trop enthousiaste » avec git reset

ou git rm --cached (pour du non versionné jusqu’ici)§ Faire une série de commits atomiques

Ça va faire un commit fourre-tout…Je me suis plus senti j’ai tout patché

Page 33: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013Christophe Porteneuve 33

§ Déjà, le caler une bonne fois :git config --global user.namegit config --global user.email

§ Ensuite, recaler le commit qu’on vient de faire :git commit --amend --reset-author

§ Si on ne l’a pas encore fait, qu’on doit aller super vite et qu’on n’a pas le temps de faire la config globale là tout de suite :git commit --author= 'John Smith <[email protected]> 'git commit --author=john # Recherche dans l’histo du motif

J’ai oublié de configurer mon nom…Qui c’est qu’a pas bien configuré le serveur de prod ?

Page 34: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013Christophe Porteneuve 34

§ Virtuellement impossible§ git reflog§ Enregistre la séquence complète des positions

successives du HEAD (très pratique lorsqu’on se plante dans ses reset…)

§ « Strictement local » (tout commit y figurant qui n’est pas dans l’historique pushé reste local)

§ Purgé quand ?§ Au moment d’un GC (manuel ou auto)§ Selon les réglages gc.reflogExpire et gc.reflogExpireUnreachable

Eh ben voilà, ayé, j’ai paumé le commit !Je savais bien qu’à force de faire ces reset et trucs-machins là, j’allais me flinguer…

Page 35: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

10 octobre 2011

Gérer l’imprévu (« ah non, pas maintenant !…»)

35

Page 36: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013Christophe Porteneuve 36

§ Le stash !§ Au-delà d’un simple stash / stash apply

§ stash save : message explicite, conserver le stage…§ stash pop --index§ stash branch

§ Également utile pour contourner une prudence parfois conservatrice§ Refus de merge (donc pull) en raison de fichiers modifiés (staged

ou dirty) également concernés par la fusion, alors qu’on sait pertinemment qu’on n’aura pas de conflit

§ stash + merge + stash pop --index !

Mais je suis en plein dans un truc là !Et c’est tout cassé, je vais pas en faire un commit…

Page 37: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013Christophe Porteneuve 37

§ Annuler le merge :-/§ Mais on n’est pas obligé de planter les modifs locales résiduelles

avec un git reset --hard :§ git reset --merge

§ Et si c’est un rebase…§ git rebase --abort

§ Et si je peux pas annuler le merge ?!§ Un peu chaud : cloner ailleurs, faire le commit + push…§ …puis finir son merge, et faire un git pull --rebase

(probablement) avant de pouvoir faire son push

C’est-à-dire que là je suis en plein merge…Donc sérieux le WT est dans un état plutôt bancal

Page 38: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

10 octobre 2011 38

Branches et fusions : concepts, trucs & astuces

Page 39: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013Christophe Porteneuve 39

§ C’est un historique parallèle aux autres, qu’on peut faire évoluer, donc, sans gêner les autres

§ Grande liberté de manœuvre§ Nécessitera à terme une réconciliation entre branches :

on parle de fusion§ Divers workflows possibles ; dans un contexte produit

classique, ce modèle de chez nvie est pas mal…§ Git a le cheap branching : c’est instantané et ne coûte

pratiquement rien en mémoire/disque, alors ne surtout pas se priver !§ On amorce une tâche non triviale (< 5mn) : hop une branche !

Les branches, qu’est-ce que c’est au juste ?Avec Git, ce sont de simples étiquettes que le HEAD fait bouger…

Page 40: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013Christophe Porteneuve 40

§ Liste les branches§ locales par défaut (-l)§ distantes (-r)§ toutes (-a)

§ Crée une branche locale§ git branch la-branche [base, HEAD par défaut]

§ Supprime une branche locale§ git branch -d la-branche§ git branch -D la-branche (si non fusionnée)

git branchVous aussi vous êtes dans la branche

Page 41: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013Christophe Porteneuve 41

§ Changer de branche (la refléter sur le WD)§ Mais pas que des têtes de branche

§ N’importe quelle révision

§ Mais pas que le WD§ Un ou plusieurs fichiers spécifiques

§ Raccourcis de création de branche§ git checkout -b new_branch

§ Et en cas de WD conflictuel…§ git checkout -m / -p

git checkoutVous aussi vous êtes dans la branche

Page 42: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013Christophe Porteneuve 42

git branchVous aussi vous êtes dans la branche

f30ab34ac298ca9

HEAD

master

Page 43: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013Christophe Porteneuve 42

git branchVous aussi vous êtes dans la branche

f30ab34ac298ca9

HEAD

master

git branch fastapi

Page 44: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013Christophe Porteneuve 43

git checkoutRevoyons la scène au ralenti

f30ab34ac298ca9

HEAD

master

fastapi

git branch fastapi

Page 45: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013Christophe Porteneuve 43

git checkoutRevoyons la scène au ralenti

f30ab34ac298ca9

HEAD

master

fastapi

git checkout fastapi

Page 46: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013Christophe Porteneuve 44

git commitTu me fais tourner la tête

f30ab34ac298ca9

HEAD

master

fastapi

git checkout fastapi

Page 47: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013Christophe Porteneuve 44

git commitTu me fais tourner la tête

f30ab34ac298ca9

HEAD

master

fastapi

git commit -a …

Page 48: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013Christophe Porteneuve 45

git checkoutRevenons en arrière un instant

f30ab34ac298ca9

HEAD

master

fastapi

c2b9e

git commit -a …

Page 49: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013Christophe Porteneuve 45

git checkoutRevenons en arrière un instant

f30ab34ac298ca9

HEAD

master

fastapi

c2b9e

git checkout master

Page 50: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013Christophe Porteneuve 46

git commitLa divergence est née

f30ab34ac298ca9

HEAD

master

fastapi

c2b9e

git checkout master

Page 51: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013Christophe Porteneuve 46

git commitLa divergence est née

f30ab34ac298ca9

HEAD

master

fastapi

c2b9e

git commit -a …

Page 52: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013Christophe Porteneuve 47

git commitEt voilà deux historiques à réconcilier à terme

f30ab34ac298ca9

HEAD

master

fastapi

c2b9e

git commit -a …

87ab2

Page 53: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013Christophe Porteneuve 48

§ Trop facile ! Une branche, c’est juste une étiquettegit branch gros-taf-finalementgit reset --soft HEAD~3git checkout gros-taf-finalement

J’aurais dû faire une branche, en fait…Finalement ça va prendre plus de temps que prévu ce truc…

HEAD~3

HEAD~2

HEAD~1

WDmasterHEAD

masterHEAD~3

HEAD~2

HEAD~1

WDgros-…HEAD

Page 54: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013Christophe Porteneuve 49

§ Comme tout le monde§ Ça vient pas mal des vieux VCS (Subversion, etc.)

§ Et pas mal aussi d’un vrai manque de formation

§ Mais en fait, tout est question de méthodologie§ Bien comprendre les étapes§ Bien connaître les (nombreux) outils à disposition§ Commencer par y voir clair§ Résoudre les conflits un par un

Tu as peur de fusionnerSi si, avoue

Page 55: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013Christophe Porteneuve 50

§ Un WD « in good order »§ En gros, sans fichier modifié/staged concerné par la fusion

§ De préférence, des commits atomiques (réduit la surface d’impact de chacun)

§ Quand est-on en situation de fast forward ?§ Quelques astuces sur git merge :

§ --squash§ --log / -m§ --ff-only§ -s strategy -X strategy-option (ours, theirs…)

Pour faire une bonne fusion, il faut…Recette officielle de Mamie Nova

Page 56: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013Christophe Porteneuve 51

Bien avoir le résultat en têteVersion merge commit

Page 57: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013Christophe Porteneuve 52

Bien avoir le résultat en têteVersion fast-forward

Page 58: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013Christophe Porteneuve 53

§ Opère une fusion classique§ Si pas fast-forward, crée un commit (à 2 parents)

§ Message assez basique§ git merge -p peut donner un message plus utile§ On peut bien sûr préciser le message (-m …)

§ Nombreux usages avancés possibles§ Pas de commit auto (vérification manuelle avant)§ Squash commits§ Stratégies de fusion, etc.§ Hors du cadre de cette formation, mais git help merge !

git mergeFusions & Acquisitions pour le tout-venant

Page 59: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013Christophe Porteneuve 54

§ git status§ Qu’est-ce qui s’est bien passé, et qu’est-ce qui a planté ?

§ Le contenu du fichier§ Les marqueurs >>> / <<< / ||| (mode diff3)

§ git merge / git mergetool§ git log --merge -p fichier

§ Détails des commits non partagés + touchant le fichier planté

§ git show :1:… / :2:… / :3:…§ Affiche la version intégrale d’un fichier planté, dans sa version pré-

divergence, main line ou à fusionner (plus de contexte !)

Quand ça veut pas, ça veut pasMais il suffit de garder la tête froide

Page 60: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013Christophe Porteneuve 55

§ Édition manuelle dans l’éditeur§ Moi j’aime bien…§ Parfois la seule solution (lorsqu’on crée un résultat qui n’est pas le

choix de l’un ou l’autre mais un mix spécifique)

§ Assistance par outil§ git mergetool

§ Config merge.tool (jetons un œil à p4merge !), mergetool.*§ Plein de déjà pris en charge, on en trouve pour tous les OS et EDI§ On peut configurer ses outils propres

§ Ne pas oublier le add !

Et quand on a compris, on fait quoi ?Fusionner, fichier par fichier

Page 61: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013Christophe Porteneuve 56

§ Le rebase est là pour modifier tout ou partie de l’historique d’une révision (généralement une tête de branche) en la faisant repartir sur une autre base (rebase)

§ Changement de sens : on merge vers soi, mais on rebase une autre

§ Deux grands scenarii :§ Soigner / restructurer l’historique (on verra tout ça plus loin)§ Éviter les merge commits en leur préférant la consolidation des

commits individuels dans une même branche

Merge vs. RebaseRien à voir

Page 62: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013Christophe Porteneuve 57

Bien avoir le résultat en têteVersion rebase

Page 63: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013Christophe Porteneuve 58

§ git rebase nouvelle-base [branche-concernée]§ Par défaut ça concerne le HEAD

§ Rejoue chaque commit sur la nouvelle base, ce qui revient conceptuellement à les fusionner un par un§ Donc risques de conflit, comme pour une fusion classique§ Auquel cas on s’arrête en cours de route et c’est à vous de jouer

§ Si résolution d’un conflit sur un des commits rebasés :§ git rebase --continue § git rebase --abort§ git rebase --skip

git rebasePartir sur de nouvelles bases

Page 64: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013Christophe Porteneuve 59

§ Chaque commit d’origine en produit un nouveau§ Le SHA parent a changé, donc par ricochet, le commit lui-même, et

donc les suivants, etc.

§ Dans la pratique, un peu malin : évite les « doublons », qui produiraient en fait des commits vides§ Quand on rebase une modif A sur une base qui contient déjà, quel

qu’en soit le cheminement, cette même modif A

Merge vs. RebaseOn réécrit quand même l’histoire…

Page 65: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

10 octobre 2011 60

Soigner son historique

Page 66: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013Christophe Porteneuve 61

§ On s’y prend à plusieurs fois pour finaliser un correctif§ Pour avoir le fix, il faut tout récupérer. Pas de cherry-pick simple :(

§ On a fait des commits fourre-tout§ Le problème inverse : trop de sujets dans un même commit

§ On mélange les sujets, on entrelace des commits sans rapport§ Ça oblige une récupération thématique à procéder par commits

individuels, plutôt qu’avec un intervalle bien défini

§ On a bâclé les messages de commit§ On a fait des branches inutilement tard

§ Alors que leur contenu est indépendant des derniers commits

Les raisons d’un historique pourriTu es coupable et tu le sais

Page 67: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013Christophe Porteneuve 62

§ Faciliter la lecture du log§ Plus court, dénué de commits superflus / réciproques / etc.§ Mieux ordonné§ Thèmes mieux regroupés

§ Faciliter la récupération ciblée de commits§ Cherry-picking§ Merge / rebase d’intervalle continu§ Récupération de branche sans dépendance historique superflue

§ Réduction des risques de conflits hors-sujet

§ Passer pour un super-héros§ « Ce type réussit tout du premier coup, et dans l’ordre ! »

Pourquoi soigner son historique ?Parce qu’on aimerait ne pas se faire haïr des collègues, tiens !

Page 68: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013Christophe Porteneuve 63

§ Un couteau suisse incroyable !§ Simple comme une édition de fichier, ligne par ligne

§ Virer des commits§ Réordonner des commits§ Fusionner des commits§ Découper des commits

§ Sans doute le moins simple, puisqu’on incruste des commits classiques avant un git rebase --continue

§ Reformuler des messages de commit§ Bref, tout ce qu’on peut souhaiter :-)

Rebase interactif : Léon, nettoyeurTu as fait ça n’importe comment mais ça va pas se voir…

Page 69: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013Christophe Porteneuve 64

§ On précise l’ensemble des points concernés :§ La tête à rebaser, la base sur laquelle repartir…§ …mais aussi le premier commit à rebaser (qui par défaut est

l’ancêtre commun)

git rebase --onto master stats client

Découpler des devs orthogonauxLe rebase tri-partite, parce que tu le vaux bien

C1 C2 C3 master

C5 C6 stats C8

C1

client

C2 C3

C5 C6

master

stats

C8’ client’

Page 70: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013Christophe Porteneuve 65

§ Les tutos et glossaires Git intégrés§ git help tutorial§ git help workflows§ git help glossary§ git help cli

§ Une tonne de ressources au top§ http://git-scm.com/documentation

§ Git en bref§ http://gitref.org/§ http://git-scm.com/docs/everyday (« Everyday Git »)

§ Re-pratiquer de zéro, différemment§ http://gitimmersion.com/

Quelques ressources en plus…Directement dans ton Git

Page 71: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

10 octobre 2011 66

Collaborer à l’aide de dépôts distants

Page 72: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013Christophe Porteneuve 67

§ Les vieilles habitudes ont la vie dure : souvent un seul dépôt distant (celui de référence)§ Très vrai en entreprise§ Beaucoup moins dans l’open-source

§ On peut parfaitement en avoir plusieurs, chacun pouvant être en lecture seule (R/O) ou lecture-écriture (R/W), et tous n’ayant pas forcément les mêmes révisions, branches, tags, etc.§ Un par collaborateur majeur, par exemple§ Un par équipe interne§ etc.

Un… ou plusieurs ! dépôts distantsQuand y’en a pour un, y’en a pour dix

Page 73: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013Christophe Porteneuve 68

§ remote = dépôt distant§ git remote gère ces définitions pour chaque dépôt local

§ git remote§ git remote add name url

§ ex. git remote add origin [email protected]:tdd/attitude.git§ git remote rename old new

git remoteAssocier le local à un/des distant(s)

Page 74: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013Christophe Porteneuve 69

§ user@ == ssh://user@ — git over SSH (port 22)§ Protocole Git R/W sécurisé par SSH. Le plus fréquent en collab’.

§ git:// — protocole Git (port 9418)§ Protocole Git R/O. Le plus fréquent en consultation.

§ http(s):// ou ftp(s):// — la lose internationale (port 80)§ Pour les pauvres hères empêtrés derrière un pare-feu trop dur…

§ filesystem — pratique pour les tests à l’arrache™§ Un simple chemin de fichier suffit !

§ rsync — parce qu’on est des h4xx0rs !§ Le principal protocole de mirroring/synchro distante. Peu employé

dans la réalité vis-à-vis de Git, mais bon…

Protocoles de dépôt distantPas tous égaux (ni en droits, ni en performance, ni en prise en charge)

Page 75: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013Christophe Porteneuve 70

Exploiter une branche distanteOn a les mêmes à la maison

$ git remote add origin …$ git fetch originremote: Counting objects: 22, done.remote: Compressing objects: 100% (17/17), done.remote: Total 22 (delta 9), reused 0 (delta 0)Unpacking objects: 100% (22/22), done.From … * [new branch] master -> origin/master * [new branch] foobar -> origin/foobvar$ git branch -a remotes/origin/master remotes/origin/foobar$ git branch -r origin/master origin/foobar$ git branch -t foobar origin/foobar

Page 76: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013Christophe Porteneuve 71

Exploiter une branche distanteEncore plus simple sur les Git récents

(master) $ git checkout foobarBranch foobar set up to track remote branch foobar from origin.Switched to a new branch 'foobar'(foobar) $

Page 77: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013Christophe Porteneuve 72

§ Récupère en local une copie de toutes les dernières révisions sur les branches trackées (à moins de préciser ce qu’on fetche).

§ N’altère pas les branches locales.§ Plus besoin du réseau après ! git fetch origin master (explicite) git fetch origin (les trackées de origin) git fetch (les trackées du remote par défaut) git fetch --all (les trackées de tous les remotes)

git fetch On met tout dans le sac on triera après

Page 78: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013Christophe Porteneuve 73

§ Techniquement, fetch + merge (trackée courante)§ Si on préfère le rebase, on fera un git pull --rebase§ Comme on peut, à la base, dissocier fetch et merge, on

a tendance à s’en servir quand on a peu de temps online devant soi…§ git fetch§ on se déconnecte (ex. on va prendre un train)§ git merge (au calme, offline…)

git pullUn petit raccourci classique

Page 79: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013Christophe Porteneuve 74

§ Synchronisation montante ; possible uniquement sur un remote R/W (user@ ou ssh://user@)

§ Automatique sur branches trackées, sinon il faut préciser. On peut restreindre à une seule trackée aussi.git push -u origin fastercsv (1er envoi + tracking)

git push origin (les trackées d’origin)

git push (les trackées de tous les remotes)

§ Pas forcé d’avoir le même nom…git push -u origin master:christophe-master

§ Utilisé pour supprimer des branches distantesgit push origin :branch-to-delete

git pushParce que partager c’est bien

Page 80: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013Christophe Porteneuve 75

Pourquoi préférer les pulls en rebase ?Parce qu’une fusion artificielle ça pollue l’historique

$ git pullCurrent branch master is up to date.

$ git pullCurrent branch master is up to date.

Page 81: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013Christophe Porteneuve 75

Pourquoi préférer les pulls en rebase ?Parce qu’une fusion artificielle ça pollue l’historique

$ git pullCurrent branch master is up to date.

$ git pullCurrent branch master is up to date.

$ git push… master -> master

Page 82: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013Christophe Porteneuve 75

Pourquoi préférer les pulls en rebase ?Parce qu’une fusion artificielle ça pollue l’historique

$ git pullCurrent branch master is up to date.

$ git pullCurrent branch master is up to date.

$ git push… master -> master

$ git pushTo /tmp/test-remote ! [rejected] master -> master (non-fast-forward)…

Page 83: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013Christophe Porteneuve 76

Pourquoi préférer les pulls en rebase ?Parce qu’une fusion artificielle ça pollue l’historique

$ git pullMerge made by the 'recursive' strategy.…

Page 84: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013Christophe Porteneuve 76

Pourquoi préférer les pulls en rebase ?Parce qu’une fusion artificielle ça pollue l’historique

$ git pullMerge made by the 'recursive' strategy.…

Page 85: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013Christophe Porteneuve 76

Pourquoi préférer les pulls en rebase ?Parce qu’une fusion artificielle ça pollue l’historique

$ git pullMerge made by the 'recursive' strategy.…

$ git lg* 1114592 - (HEAD, master) Merge branch 'master' of…|\| * a626f04 - (origin/master) …* | 0fcbc1a - …|/* 4991700 - …

Page 86: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013Christophe Porteneuve 76

Pourquoi préférer les pulls en rebase ?Parce qu’une fusion artificielle ça pollue l’historique

$ git pullMerge made by the 'recursive' strategy.…

$ git lg* 1114592 - (HEAD, master) Merge branch 'master' of…|\| * a626f04 - (origin/master) …* | 0fcbc1a - …|/* 4991700 - …TOXIQ

UE

Page 87: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013Christophe Porteneuve 77

Pourquoi préférer les pulls en rebase ?Parce qu’une fusion artificielle ça pollue l’historique

$ git pull --rebaseFirst, rewinding head to replay your work on top of it...Applying: …

Page 88: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013Christophe Porteneuve 77

Pourquoi préférer les pulls en rebase ?Parce qu’une fusion artificielle ça pollue l’historique

$ git pull --rebaseFirst, rewinding head to replay your work on top of it...Applying: …

Page 89: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013Christophe Porteneuve 77

Pourquoi préférer les pulls en rebase ?Parce qu’une fusion artificielle ça pollue l’historique

$ git pull --rebaseFirst, rewinding head to replay your work on top of it...Applying: …

$ git lg* 68bf59e - (HEAD, master) …* a626f04 - (origin/master) …* 4991700 - …

Page 90: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013Christophe Porteneuve 77

Pourquoi préférer les pulls en rebase ?Parce qu’une fusion artificielle ça pollue l’historique

$ git pull --rebaseFirst, rewinding head to replay your work on top of it...Applying: …

$ git lg* 68bf59e - (HEAD, master) …* a626f04 - (origin/master) …* 4991700 - …nicke

l

Page 91: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013Christophe Porteneuve 78

§ On utilise généralement les tags pour préciser un point événementiel dans un historique, le plus souvent une version précise quand on a une seule branche de production.§ Les tags de version sont généralement au format « vX.Y.Z »

§ Un tag n’est pas censé être bougé avec le temps, pour des raisons de QA / certification / validation principalement.§ En revanche, une branche de version (release/prod) évolue au fil

des bugfixes, hotfixes et security fixes.

§ git tag [-f] nom-du-tag§ git tag -l [pattern]

Les tagsMarquage de versions précises ou annotations événementielles

Page 92: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013Christophe Porteneuve 79

§ Il va falloir écraser de l’historique distant§ Attention : ça va gêner ceux qui l’ont déjà récupéré§ Méthodologie :

1. Se replacer, en local, sur un historique valable pour la branche2. Forcer le push avec git push -f3. Si nécessaire, recaler les tags concernés avec git tag -f et les

mettre à jour sur le remote avec git push --tags -f4. Pour les machines qui avaient déjà récupéré l’histo pourri : forcer

le pull avec git pull -f

Quand le dépôt distant est foireux…Quelqu’un a pushé des trucs moisis

Page 93: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

10 octobre 2011 80

Cherry-picking etréutilisation de fusions manuelles

Page 94: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013Christophe Porteneuve 81

§ Parce qu’on n’est pas obligé de se farcir un historique pour récupérer juste un commit§ Typiquement un bugfix autonome, orthogonal

§ Trivial : git cherry-pick le-commit§ Conceptuellement, un rebase miniature (limité à un commit)

§ Comment sélectionner des commits cibles ?§ git cherry -v§ Dans le même univers :

§ git branch --contains§ git branch --merged / --no-merged

§ Fréquent pour porter un fix local sur l’upstream (ex. d’un fork vers le dépôt d’origine). Si sur Github, préférer une pull request :-)

Cherry pickingParce que diff/apply manuel ça va bien 2 minutes

Page 95: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013Christophe Porteneuve 82

§ REuse REcorded REsolution§ Flag global : rerere.enabled§ Enregistre les « empreintes » des résolutions

manuelles de conflits§ Les partage avec les autres via le remote§ Réutilisé automatiquement lors d’une fusion (merge ou

rebase, pas de jaloux)§ Permet notamment des workflows sympathiques de

« control merges » annulables mais profitables

RerereLes vrais amis résolvent leur conflit une bonne fois pour toutes

Page 96: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

10 octobre 2011 83

Chasse aux bugs accélérée : le bisecting

Page 97: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013Christophe Porteneuve 84

§ Recherche dichotomique entre le dernier point que vous identifiez comme OK et le point KO (généralement le HEAD de master)§ On délimite l’historique à tester, et on y va à coup de « plus petit

plus grand », en quelque sorte§ Ne marche que si le bug n’a pas toujours été là !

§ Dichotomique donc en O(ln(2))…§ C’était il y a 30 commits : 5 tests au pire§ C’était il y a 1000 commits : 10 tests au pire ! \o/

Le principeEt révisons nos logarithmes de 2

Page 98: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013Christophe Porteneuve 85

§ git bisect start§ git bisect bad§ git bisect good le-dernier-sha-qui-allait-bien§ (pour chaque checkout auto, on teste, puis git bisect bad/good/skip)

§ git bisect reset

Au plus « lent » : 100% manuelParce qu’on a quand même un peu de temps

Page 99: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013Christophe Porteneuve 86

§ git bisect start commit-foireux dernier-bon-commit

§ Embraye directement sur la dichotomie et la boucle de tests interactive

§ En cas d’erreur ou d’interruption, on peut…§ Sauver le log (git bisect log > le-fichier-de-log)§ L’éditer si besoin§ Le rejouer automatiquement avec git bisect replay le-fichier

Pré-limiter depuis la ligne de commandeHistoire de gagner un peu de temps

Page 100: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013Christophe Porteneuve 87

§ git bisect run le-script§ N’importe quel fichier scriptable dans l’environnement

§ Shell, Ruby, Python, Node, PHP…§ Le script fait son test et renvoie 0 (good), 125 (skip) ou 1-127 (bad)

§ Et pour réduire encore la liste des candidats§ Limiter à certains fichiers (ne s’occupe que des commits qui les

concernent)

§ Ça peut aller très, très vite§ Sur un SATA classique, j’ai cherché à travers 1000 commits en

moins de 20 secondes !§ Sur un SSD, ça va encore beaucoup, beaucoup plus vite !

Automatiser à fond les ballonsParce qu’hors du scripting, point de salut

Page 101: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

10 octobre 2011 88

Submodules vs. subtrees

Page 102: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013Christophe Porteneuve 89

§ Submodules§ Facile à mettre en place ;

peu de notions avancées§ Dépôts imbriqués§ Cycles de vie distinct : mise

à jour locale en deux temps§ Récupération de mise à jour

en deux temps§ Donc de nombreux pièges

dans l’emploi quotidien en termes de maintenance

§ Subtrees§ Un peu complexe à mettre

en place (notions avancées)§ Un seul dépôt par codebase

utilisatrice§ Donc, un cycle de vie

unique, mise à jour intégrée§ Récupération de mise à jour

intégré, normale, usuelle§ Maintenance explicite lors

d’un partage de mise à jour locale vers la version centrale, ou inversement

Petit comparatif rapideHistoire de bien cerner le sujet

Page 103: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013Christophe Porteneuve 90

§ Récupération initiale du dépôt§ …mais on oublie le git submodule init + git submodule update

§ Mise à jour locale§ …mais on est sur un detached head§ …ou simplement sur un head en retard sur le remote§ …mais on oublie le push du submodule : le dépôt parent s’y perd

§ Récupération de mise à jour§ …mais on oublie le git submodule update

Les pièges usuels des submodulesEt rien que pour ça, on devrait éviter…

Page 104: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013Christophe Porteneuve 91

§ En gros, une branche est dédiée au subtree, sans rien de commun avec les branches du projet principal !

§ git remote add remote-subtree git@l-hote:le-depot.git§ git fetch remote-subtree§ git checkout -t -b plugin remote-subtree/master§ git checkout master§ git read-tree --prefix=vendor/plugins/ -u plugin

Mettre en place des subtreesEt se tordre un peu le cerveau sur des concepts de dingues

Page 105: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013Christophe Porteneuve 92

§ git checkout plugin§ git pull§ git checkout master§ git merge --squash -s subtree --no-commit plugin

§ Sans créer pour autant, donc, un commit dédié au merge (et notamment, ne touche pas au HEAD ni au MERGE_HEAD)

Récupérer des mises à jour distantesMais explicitement, sans surprise

Page 106: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013Christophe Porteneuve 93

§ Ben, l’inverse :§ git checkout plugin§ git merge -s subtree master§ git push

§ Et si on veut visualiser les différences ?§ (master) git diff-tree -p plugin§ (plugin) git diff-tree -p master§ (plugin/master) git diff-tree -p remote-subtree/master

Partager des upgrades d’un subtree localDéjà, parce que c’est possible

Page 107: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

10 octobre 2011 94

Une dernière question…

Page 108: Drupal 7 in a Nutshell...Formation Git Total • Delicious Insights, Paris Geneanet • 24–25 octobre 2013 Christophe Porteneuve 17! Soit on est les initiateurs du dépôt… 1.git

10 octobre 2011 95

I DON’T ALWAYS ATTENDTRAINING SESSIONS

BUT WHEN I DO, I DO ITWITH ATTITUDE!