git

Sommaire

Index

Introduction

Le métier de développeur

Développer c’est:


Ou dit autrement:

Gestion de l’information

Ligne de vie d’un fichier (timeline)

Temps en abscise sur un axe horizontal

Plusieurs utilisateurs, un seul fichier

Le contrôle de version

Problématique

Pour chaque version du document

Outils d’échanges possibles

Besoins

Concurrents de git

Système centralisée

Gestion centralisée

Exemples de systèmes centralisés

Système décentralisée

Gestion décentralisée

Exemples de systèmes décentralisés

Mise en place

Installation

http://git-scm.com

Lancement de git

Sous Windows : git-bash

Sous Mac: commande git installée par défaut

Linux: commande git installable par paquet

Configuration de git

Votre identité

git config --global user.name "Votre vrai nom ou pseudo"
git config --global user.email "votre.email@example.com"
# Vérification
git config -l

Permet de répondre à la question Qui l’a modifié ?

Quelle version de git

git --version

Les bases de git

Ligne de commande

Objectif

Comprendre les concepts

Création d’un projet

Taper les commandes suivantes

mkdir bonjour
cd bonjour
git init

Création fichier index.html

Récupérer le fichier index.html

Etat courant du projet

git status

Commande utilisée très fréquemment

Exemple utilisé

Création d’une page web simple

Concept

Photographie

Nature morte

Plusieurs étapes

Commit

Trois étapes

Message

git commit --message "Le message qui explique ce qui a été modifié"

Exemple

git commit -m "First version"

Working directory

Comment savoir s’il est “propre”

git status

Modifications dans un fichier

Pour les visualiser

git diff

Les trois zones de git

WC / Stage / Repos

WD_Staging_Repos

Copie de travail / Zone de validation / Dépôt

Historique

Historique de l’ensemble du dépôt

git log

Historique d’un fichier particulier

git log -p chemin_vers_le/fichier

Exercices

Faites plusieurs modifications successives avec enregistrement dans l’historique:

Manipulation

  1. Ajouter vos noms et prénoms dans le fichier index.html
  2. Modifier la couleur du nom et la couleur du prénom (deux couleurs différentes)
  3. Ajouter un paragraphe intitulé Présentation (avec un titre niveau 3)
  4. Ajouter quelques lignes indiquant quelles sont vos technologies préférées.

Ajout d’un second fichier

Ajout d’un fichier CSS

styles.css

h1

Les branches

Utilisation

Une branche = une fonctionnalité

Ajout:

git branch blue-frame

Liste des branches

Pour afficher les branches disponibles

git branch

Passer d’une branche à une autre

Changement de branche

git checkout blue-frame

Affichage sur l’invite de commande

Ajouter le code ci-dessous dans le fichier ~/.bash_profile


#Git Prompt
#http://stackoverflow.com/questions/12870928/mac-bash-git-ps1-command-not-found
source ~/.git-prompt.sh

MAC_PS1='\h:\W \u\$ '
GIT_BASH_WINDOWS_SINGLE_DIR_PS1='\[\033]0;$TITLEPREFIX:${PWD//[^[:ascii:]]/?}\007\]\n\[\033[32m\]\u@\h \[\033[35m\]$MSYSTEM \[\033[33m\]\W\[\033[36m\]`__git_ps1`\[\033[0m\]\n$ '
GIT_BASH_WINDOWS_PATH_PS1='\[\033]0;$TITLEPREFIX:${PWD//[^[:ascii:]]/?}\007\]\n\[\033[32m\]\u@\h \[\033[35m\]$MSYSTEM \[\033[33m\]\w\[\033[36m\]`__git_ps1`\[\033[0m\]\n$ '
GIT_BASH_WINDOWS_SINGLE_DIR_NO_CR_PS1='\[\033[32m\]\u@\h \[\033[35m\]$MSYSTEM \[\033[33m\]\W\[\033[36m\]`__git_ps1`\[\033[0m\]\n$ '

#Removes all lowercase char from hostname to shorten it:
GIT_BASH_WINDOWS_SHORT_PS1='\[\033]0;$TITLEPREFIX:${PWD//[^[:ascii:]]/?}\007\]\n\[\033[32m\]\u@`tr -d "abcdefghijklmnopqrstuvwxyz" <<< \h` \[\033[35m\]$MSYSTEM \[\033[33m\]\W\[\033[36m\]`__git_ps1`\[\033[0m\]\n$ '
GIT_BASH_WINDOWS_SHORT_NO_CR_PS1='\[\033[32m\]\u@`tr -d "abcdefghijklmnopqrstuvwxyz" <<< \h` \[\033[35m\]$MSYSTEM \[\033[33m\]\W\[\033[36m\]`__git_ps1`\[\033[0m\]\n$ '

#To be enhanced with a right display using this:
#printf '%'$COLUMNS's\n' 'Something to display'

setps(){
OLDPS1=$PS1
if [[ "$1" == '' ]] ; then
echo 'Choose PS1 :'
echo ' 1 : Standard Apple PS1'
echo ' 2 : Git Bash with current dir'
echo ' 3 : Git Bash with current dir (without blank line)'
echo ' 4 : Git Bash with current path'
echo ' 5 : Git Bash with shortened hostname and current dir'
echo ' 6 : Git Bash with shortened hostname and current dir (without blank line)'
echo 'Select 1, 2, 3, 4 or 5:'
read pschoice
else
pschoice=$1
fi
case $pschoice in
1) PS1=$MAC_PS1
;;
2) PS1=$GIT_BASH_WINDOWS_SINGLE_DIR_PS1
;;
3) PS1=$GIT_BASH_WINDOWS_SINGLE_DIR_NO_CR_PS1
;;
4) PS1=$GIT_BASH_WINDOWS_PATH_PS1
;;
5) PS1=$GIT_BASH_WINDOWS_SHORT_PS1
;;
6) PS1=$GIT_BASH_WINDOWS_SHORT_NO_CR_PS1
;;
*) echo "Nothing to change: PS1 is kept"
                         ;;
esac
}
setps 6

Télécharger le fichier .git-prompt.sh

Placer ce fichier dans votre dossier HOME

Le renommer en .git-prompt.sh

En pratique

Création d’un encadré en CSS

git branch blue-frame

Ajout encadré

dans styles.css

Faire un commit

Changement de branche

Retour à la branche master

git checkout master

Fusion des modifications

git diff master..blue-frame
git merge blue-frame
git log

En apparence, la branche blue-frame a disparu

Suppression effective de la branche

Suppression de la topic-branch blue-frame

git branch -d blue-frame

Travail en parallèle

Nouvelle évolution

Nouvelle branche red-frame

Le client a décidé d’ajouter un cadre en rouge contenant le texte Important

On va créer une nouvelle branche: red-frame

Créer et changer de branche

En une seule commande :

git checkout -b red-frame

Ajouter la couleur

Dans styles.css, ajouter un style correspondant à ce nouveau paragraphe.

Faire un commit.

Evolution parallèle

Correction de texte

Pendant ce temps, une modification est faite dans la branche master

Modification du texte

Changer de branche

git checkout master

Dans la branche master

Remplacement de

git est formidable en git est indispensable

Fusion des deux branches

git merge red-frame

Graphe

Branche blueframe

Outils d’inspections

Graphe des modifications

Log amélioré

git log --graph --full-history --all --pretty=format:"%h%x09%d%x20%s"

Raccourcis

Création d’un raccourci

git config --global alias.graph '!git log --graph --full-history --all --pretty=format:"%h%x09%d%x20%s"'

Deux alternatives

lg1 = log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(dim white)- %an%C(reset)%C(bold yellow)%d%C(reset)' --all
lg2 = log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold cyan)%aD%C(reset) %C(bold green)(%ar)%C(reset)%C(bold yellow)%d%C(reset)%n''          %C(white)%s%C(reset) %C(dim white)- %an%C(reset)' --all

Utilisation

git graph
git lg1
git lg2

Autres exemples

https://stackoverflow.com/questions/1057564/pretty-git-branch-graphs

https://stackoverflow.com/questions/1838873/visualizing-branch-topology-in-git

Outils graphique

Tig

Toutes plateformes: Introduction · Tig - Text-mode interface for Git

Sur Mac : GitUp

Inspecter les modifications

Outils externes

Création d’un raccourci

git difftool --tool=meld
git config --global alias.meld '!git difftool --tool=/Applications/Meld.app/Contents/MacOS/Meld'

Gestion des conflits

Une nouvelle branche

git branch pratique
git checkout pratique

Modifier

git est formidable en git est pratique

Création du conflit

Dans la branche master

Modifier

git est indispensable en git est génial

Fusion avec conflit

git checkout master
git merge pratique
git add index.html
git commit -m "Résolution conflit"

Intervention humaine

Toujours nécessaire

Rappel

Suppression d’une branche

Branche inutile

Une branche devient inutile

Suppression

git branch -d pratique

Suppression d’une branche non fusionnée

git nous averti

En cas de suppression qui entraînerait une perte de données

Exemple:

Création branche

git branch sans-issue
git checkout sans-issue

Edition du fichier

echo ".sansIssue { fill: #444;}" >> styles.css

Ajout et commit

git status
git add styles.css
git commit -m "sans issue"

Retour à la branche master

git checkout master

Tentative de suppression

git branch -d sans-issue

Forcer la suppression

git branch -D sans-issue

Démonstration

Site de démonstration

Outil en ligne

http://onlywei.github.io/explain-git-with-d3/

En pratique

Faire quelques exercices

Présentation de GitHub

Exemple de dépôt GitHub

https://github.com/jgm/pandoc

https://github.com/raghur/mermaid-filter

https://github.com/nishimaki10/pandoc-mermaid-filter

https://github.com/jonas/tig

Découverte

Cliquer sur les différents liens présents sur la page du projet

Indicateurs principaux

Star

Popularité

Permet de choisir une librairie par rapport à une autre

Fork

Copie du projet permettant de travailler de son côté

Dernier commit

Indique l’état de santé actuel du projet

Un commit ancien

mauvais signe

Nombre de contributeurs

Indique le nombre de personnes ayant travaillé sur le projet

Montre l’intérêt de l’open-source

Révélateur de la santé du projet

Nombre d’issues

Montre le nombre de bugs ouverts

A comparer avec le nombre de commit et de contributeurs

Page utilisateur

https://github.com/torvalds/

Permet de donner une idée des qualités d’un développeur

Les recruteurs peuvent examiner votre profil GitHub

Applications graphiques

GitKraken

https://www.gitkraken.com/

Visual Source Tree

https://www.sourcetreeapp.com/

GitHub

https://desktop.github.com/

Travail à plusieurs

Local et distant

Serveur distant

Configuration GitHub

Création d’un dépôt

Repository = dépôt

repos = repository

Configuration locale

GitHub donne les lignes pour ajouter un remote sur un dépôt local

git remote add origin...

Synchronisation: pousser

git push

git push -u origin master

Examen des modifications dans GitHub

Examiner les commits

diff

Onglet network

graph

Synchronisation: tirer

git pull

git pull origin master

En pratique

On fait évoluer master en parallèle

Transformer

git est indispensable en git est collaboratif

Ajouter dans des branches “topic”

un background de l’encadré

un background de la page

une couleur pour le texte

Quelques liens utiles

Liste de commandes utiles

git cheat sheet

Configuration de GitHub

En https

Caching GitHub passwords in git

En SSH

Une série d’articles pour se connecter à GitHub via SSH est disponible ici

La création des clefs SSH peut se faire comme indiqué dans ce document annexe sur la gestion des clefs SSH

L’ajout d’une clef se fait en allant lire cet article de la série donnée ci-dessus.

Alternatives à GitHub

https://gogs.io/

https://about.gitlab.com/

https://bitbucket.org