git

 

In case of fire

git commit -am "" & git push

Plan

  • La ligne de commande
  • Les clients Git
  • Il y a quoi sous le capot ? (.git/)
  • Pimp My Git!
  • Quelques scénarios
  • Les outils autour de git
  • REX et bonnes pratiques
  • Dissection d'un commit (si on a le temps)

Notre base

It's time to ...

Les bases

TODO :

- Staging area + commandes + (ui ?)

- Les commandes de base ---> tuto Dana/PA

- à quoi sert git, pourquoi git ?

 

Git en ligne de commande

Notre base

source : lesjoiesducode

Rebase

git rebase master

Rebase

Rebase

Rebase Intéractif

git rebase -i master

pick 1 Start my branch1
pick 2 Continue my branch1

Rebase Intéractif

Journal de références (Reflog)

git reflog
### Output
0f8dde4 HEAD@{0}: rebase -i (finish): returning to refs/heads/master
0f8dde4 HEAD@{1}: rebase -i (squash): first + third
606813c HEAD@{2}: rebase -i (start): checkout f07ec95
b8fed7c HEAD@{3}: commit: third
e3025b3 HEAD@{4}: commit: second
606813c HEAD@{5}: commit: first
f07ec95 HEAD@{6}: commit (initial): initial

Quelques scénarios

Notre base

Et on bouge la tête ...

git checkout master

Tag

git tag "Add-great-lib" 1

git à la cerise

git cherry-pick Add-great-lib

Tel Louis XVI...

git checkout --detach C

Une autre cerise

git cherry-pick Add-great-lib

Back to master

git checkout master

Enfaite non, pas si bien la lib...

git reset --hard HEAD~1

Oh et puis si, je vais la remettre

git reflog
# reflog output...
# Find the commit xxx to which we want to reset

git reset xxx

Les GUI pour Git

SourceTree

Kraken

Tig

ncurses-based (GUI dans un terminal) text-mode interface

Tig

IntelliJ, VSCode...

Avantages

Git pour les null
  • Facile à prendre en main
  • Pas de commandes à apprendre
  • Représentation visuel de l'arbre de branches Git
  • C'est quand même pas moche...

Inconvénients

  • On ne sait pas ce qu'il y a sous le capot
  • Besoin d'un compte fabriquant
  • Erreurs pas toujours compréhensibles
  • Conflits possibles entre les différents processus

Il y a quoi sous le capot ?

Plongeons dans .git

COMMIT_EDITMSG

Les fichiers

Le dernier message de commit

config

Surcharge de la config git locale à cette machine et à ce répo

description

Description du répo utilisée pour Gitweb, inutilisé sinon.

FETCH_HEAD

Résultat du dernier git fetch.

HEAD

La ref courante du repository

index

Représentation de la "staging area"

ORIG_HEAD

Les fichiers (suite)

Mis à jour lors de merge, rebase. C'est le hash du commit servant de parent pour la suite de la commande.

packed-refs

Mis à jours lors du gc de git.

Contient les refs "dormantes" du répo. (voir ici)

MERGE_HEAD

MERGE_MODE

Fichiers créés au début d'un merge et détruits à la fin.

MERGE_MSG

Hash "dernier" commit de la branche

Indicateur utilisé pour savoir quelles branches merger en cas de git pull

ae4cc3ca...                branch 'develop' of xxxx
face39bb...  not-for-merge branch 'bugfix/fix-display-of-no-data-component' of xxxx

Le nom de la branche sur le remote et l'adresse du remote

FETCH_HEAD

Les répertoires

hooks

Scripts jouer en fonction d'évènements de git.

info

Contient des informations complémentaire au répo.

Notamment un fichier exclude qui agit comme un .gitignore local (non-partagé)

Les répertoires

logs

Historique des opérations git par ref

objects

La "BDD" de git. (voir git-cat-file)

rebase-apply

Espace de travail de git utilisé lors des git-rebase et des git-am.

refs

Les refs (branches, tag, stash) les plus souvents accédés du répository.

Elles peuvent être "archivées" dans le fichier packed-refs

Pour approfondir le sujet

Pimp My Git!

Aliases

[alias]
  co = checkout							
  st = status --short --branch
  mr = !sh -c 'git fetch $1 merge-requests/$2/head:mr-$1-$2 && git checkout mr-$1-$2' -
  out = log @{u}..
  in  = log ..@{u}
  • pre-commit
  • prepare-commit-msg
  • post-checkout
  • ...

Hook

Hooks via Husky

{
  "hooks": {
    "pre-push": "npm run lint && npm run test:once"
  }
}
  • Versionné au sein du projet
  • Hooks partagés par toute l'équipe
  • Simplification de  l'écriture des hooks (Bash)

Mon premier plugin !

#!/bin/zsh
								
	c=$(git branch | grep -c "$1")
								
	if [[ "$c" -eq 1 ]]; then
		git checkout $(git branch | grep "$1")
	else
		echo "'$1' is ambigus"
		git branch | grep "$1"
		exit 1
	fi

Plugins

  • git-svn
  • octopussy
  • git-git
  • pleins d'autres

D'autres scénarios !

Git fight!

La gestion de conflits (démo)

Renaming a file,

How dangerous could it be...

End of lines (EOL)

ou l'enfer des projets legacy

Les outils autour de git

Repository management services

Github, Gitlab, Bitbucket, Gogs, Coding...

Gitlab

Gitlab n'est pas git...

What else ?

  • Stockage des source centralisé
  • Gestion des utilisateurs
  • Pull request
  • Fork

Intégration continue

Jenkins, VSTS, Gitlab-CI...

REX et bonnes pratiques

Attention, cette partie contient des avis personnels...

  • Un commit a-t-il une taille idéale ? (combien de fichiers, combien de ligne)
  • Faire des beaux commits atomiques ! (git add --patch)
  • Comment rédiger le messages (This commit will...msg), avec combien de charactère par ligne et pourquoi cette rigueur ?
  • Pourquoi sauter une ligne entre le titre et le texte...
  • Ne pas commencer le message pas un '#' ! (ni le nom d'une ref d'ailleurs)

Bonnes pratiques sur la construction du message de commit et de la façon de commiter

Inclure git dans le processus de développement

  • Tech-Lead code-review
  • Résolution de conflits par le tech-lead
  • Commit message comme changelog

La gestion de conflits

  • Le meilleur moyen de résoudre les conflits, c'est de ne pas en avoir :
    • Retarder les refactoring structurels sur des modules où d'autres travaillent
    • Avoir une approche feature first pour les merges, c-a-d celui qui fait le refactoring structurel, doit faire la résolution des conflits quitte à refaire son refactoring.
    • L'importance des conventions de codage pour éviter les conflits par exemple tab vs espace
  • Sinon, il faut y aller pas à pas et si possible avoir les différents développeur sous la main...

Les conflits cachés

Lorsque l'on fait un merge entre une feature et un refactoring, il faut bien faire attention à ne rien avoir cassé.

Si le refactoring a supprimé un fichier qui était référencé mais PAS modifié par la feature, git sera incapable de voir qu'il y a un problème.

Dans ce cas ce sera le compilateur et eventuellement l'éxecution des tests qui permettront de détecter le problème.

Gitflow

  • Pas forcément adapté, selon la taille de l'équipe
  • Créer des noms de branches explicites Avoir un outil qui ne fait pas l'auto-completion des noms de branches n'est pas une excuse

Dissection d'un commit

Git, c'est magique!

 

Avez vous déjà vu ...

Un commit de Michel ?

commit 8684d0560cb7c51234cbefebd83409e90cb7e29f
 Author: Michel michel.xxxx@viseo.com
 Date:   Wed Dec 6 12:40:14 2017 +0100

"Init presentation"

git hash

algorithme sha-1

hash

"Hasher" un commit

sha1(
  commit_message,
  commiter,
  commit_date,
  author,
  authoring_date,
  Hash-Of-Entire-Working-Directory
)

Hash-Of-Entire-Working-Directory ?

Exemple : myProjet

Ce que nous voyons

 .
 │ main.java
 │
 ├───.git
 └───resources
 │     logo.png
 └───components
       ...

Exemple : myProjet

Ce que git voit

Hashons notre commit

				
sha1(
  "Init presentation",
  "michel.xxxx@viseo.com",
  Wed Dec 6 12:40:14 2017 +0100,
  "michel.xxxx@viseo.com",
  Wed Dec 6 12:40:14 2017 +0100,
  aa1b2fb696a831c89c53f787e03d863691d2b671
)

Mais ça sert à quoi ?

Conserver l'intégrité des données

Hash du commit parent

sha1(
 meta data
 commit_message
 commiter
 commit_date
 author
 authoring_date
 Hash-Of-Entire-Working-Directory
 hash-of-parent-commit
)

On est tous le(a) fils(fille) de quelqu'un...

Pour approfondir le sujet : git objects

Quelques commandes pratiques

Cherry pick plusieurs commits

git cherry-pick cool-feature~3..cool-feature

Git rerere

"reuse recorded resolution"

git config --global rerere.enabled true

Licence

Pour ce qui concerne tous les contenus que nous avons produits dans cette présentation : Licence Creative Commons licence Creative Commons Attribution - Pas d’Utilisation Commerciale 4.0 International .
Fondé(e) sur une œuvre à https://github.com/barmic/viseo-take-an-hour_cassandra.git.

GIT & GitLab

By bzah

GIT & GitLab

  • 243