git-101

Baptiste Lecocq (@tiste)

Sommaire

  • Un peu d'histoire
  • Intérêts
  • Git : les principes
  • Git : la ligne de commande
  • GitFlow

Un peu d'histoire...

Un peu d'histoire...

  • Créé en 2005 par Linus Torvalds (qui haïssait les outils de l'époque)
  • Actuellement 602.000 versions pour Linux
  • Open source Version Control System

Pour résoudre les problématiques

  • Échange d'informations sur un projet
  • Fichiers supprimés
  • Et même de l'envoi de code source par mail...

Intérêts : Git n'est pas centralisé...

Intérêts : ... Mais distribué (décentralisé)

Intérêts

  • Les branches sont des pointeurs = simples d'utilisation (0.091s pour en créer et se positionner)
  • Hors-ligne
  • Ne supprime jamais, on ne fait qu'ajouter
  • "Delta Storage" : le code est versionné par différences, pas par fichier
  • Le contenu est important, pas le contenant
  • Chaque clone du projet est un backup
  • Rapide

Rapide

Rapide

Les principes : l'architecture en 3 zones

La première zone représente le dossier courant. La seconde, la zone de staging (un fichier retenu dans un état). La dernière représente la validation (le commit), c'est à dire une version à l'instant t des fichiers.

Les principes : l'architecture

Git : la ligne de commande

Configuration

git config --global user.name "Baptiste Lecocq"
git config --global user.email "hello@tiste.io"
git init

Crée un repository, i.e. un dossier de travail

Un dossier .git contient toutes les informations nécessaires à git pour fonctionner.

git add filename.txt
git add .
git add -A

Ajoute les fichiers modifiés (du Working directory) dans la zone d'index (le stage)

git commit -m "feat(users): add missing validation on name"

Créé une version locale des modifications des fichiers (présents dans la zone d'index)

git log

Permet de voir tous les commit effectués (complété avec --pretty et --graph, cela donne un beau visuel)

git status

Affiche l'état actuel (en réalité, la vie) du repo

Les différentes zones y sont représentées.
git rm filename.txt

Supprime un fichier du repo git

Supprimer un fichier à la main ne le supprimera pas pour les futurs commit. C'est pour cela qu'avant de faire un git commit, il est préférable de regarder si le fichier est bien supprimé.

Remarque : le fichier sera toujours disponible pour les commit antérieurs.

git diff
git diff master..develop

Affiche les modifications effectuées mais pas encore "on stage"

L'ajout de l'option --cached affichera les différences entre les fichiers "on stage" et le dernier commit.

git branch branchname

Crée une branche

git checkout -b branchname

Crée une branche et s'y déplace

C'est en réalité la contraction de git branch branchname et de git checkout branchname

git checkout master

Se déplace sur une branche

  • Une branche est juste un pointeur qui se déplace sur les commits
  • Créez des branches pour passer d'une fonctionnalité à une autre
  • Créez des branches

Créez des branches

git merge --no-ff branchname

Fusionne la branche nommée avec la branche courante

--no-ff ?

--no-ff

Lorsque git merge, il utilise l'ancètre commun et les deux derniers commits des branches à merger

--no-ff

L'historique sera plus lisible et plus simple à réécrire, dans le cas d'un défaut

Squashing

GitHub propose un mode de "squash & merge" qui permettra de regrouper la feature en un seul et unique commit

git checkout -- filename.txt

Réinitialise un fichier modifié

git revert e285d87

Annule les modifications d'un commit dans un nouveau commit

git tag v0.1
git tag v0.1 e285d87

Crée un tag sur le commit courant ou un commit spécifique

git commit --amend

Fusionne les changements de la zone d'index avec le dernier commit

À ne faire que sur sa propre branche, car l'identifiant du commit changera.

...
Prenez une grande inspiration

GitFlow

GitFlow

  • master : Releases, tagguées
  • develop : Releases mineures
  • feature/cache-conf : Une fonctionnalité par personne
  • hotfix/navbar : Fix urgent pour la production
  • release/1.1.42 : Mise en production

GitHub Flow

  • master : Releases, tagguées
  • develop : Releases mineures
  • feature/cache-conf : Une fonctionnalité par personne
  • hotfix/navbar : Fix urgent pour la production
  • release/1.1.42 : Mise en production

Git vers l'Internet et au delà

Oui, ce fond a déjà été utilisé.

git clone git@github.com:tiste/credit-card.git

Copie un repository en local

Le chemin peut prendre la forme d'un ssh, http, chemin système et même ftp.

git peut avoir plusieurs dépôts distants : les remotes

origin est le nom de celle par défaut

git add remote upstream git@bitbucket.com:tiste/credit-card.git

Ajoute une remote "upstream"

git push origin master

Publie les changements sur une branche spécifique d'une remote spécifique

Tip : git config --global push.default simple pushera les modifications de la branche courante en remote avec git push

git pull --rebase

=

git fetch + git merge

Tire les changements de la remote vers le local

fetch ne fait que récupérer les modifications sans les appliquer à la branche courante locale. merge va appliquer les modifications remote à la branche courante locale.

--rebase

Permet de mettre de côté nos commits locaux, de fusionner la branche courante avec la remote, et enfin de réappliquer nos anciens commits locaux

Quelques liens

git-101

Baptiste Lecocq (@tiste)