Table des matières

Workshop Git : initiation

git sur wikipedia

Presentation

L' outil de gestion de versions le plus populaire au monde.

Il est décentralisé : on a pas besoin d'un serveur pour l'utiliser.

Usages

Disclaimer

help

Tuto 1 : débuter en clonant un dépôt git existant (double window CLI / FS_Browser)

git clone git@github.com:mxbossard/mass.git
git clone https://github.com/mxbossard/mass.git
cd mass
git branch
git branch -r
git switch develop
git branch
git log
git log --pretty=oneline --abbrev-commit --graph --decorate
git hist ORIG_HEAD.. --stat --no-merges

Mot clés

Tuto 2 : modifier des fichiers comparer et commit les modifications

git status
git diff
git diff HEAD
git diff HEAD^
echo foo > bar
echo baz >> README.md
mkdir pif
git status
git diff
git add .
git status
git diff
git diff --staged
git commit -m "ma modif"
touch pif/paf
git commit -a --amend
git log
git diff
git diff HEAD
git diff HEAD^

Fonctionnement

Interne

Documentation Git Internals - Git Objects

Décentralisé

Commit Hash (sha1)

Hash des données et méta-données contenu dans le commit. Une représentation du commit réputé unique dans un repo.

Branch

Une branche pointe vers un commit, mais à la différence du tag, on "travail sur une branche". Cela veut dire que notre espace de travail (working dir) est en général accroché sur une branche. Lorsque l'on effectue un commit, ce commit est attaché à la branche, et devient le dernier commit de la branche.

diff comme patch

Les git diff permettent de produire des fichiers patch qui peuvent être appliqués à la main.

Tuto 3 : Initialiser son propre dépôt git et travailler dessus

git init myrepo
cd myrepo
touch myfile
git commit -a -m message
echo foo > myfile
git commit -a -m foo
echo bar > baz
git checkout -b develop
git commit -a -m baz
echo bar >> baz
git status
git stash
git status
git stash list
git switch master
git status
git switch develop
git stash apply
git commit -m -a "baz2"
git tag 0.0.1
git tag
git checkout HEAD^
git checkout HEAD^^
git checkout 0.0.1
git switch develop

Forges git

Exemples de forges git "Public"

Intérêts

Exemples de solutions déployable

Il existe des outils pour déployer dans une forge git privé.

Tuto 4 : Creer et suivre (track) un remote repo (dépôt distant) sur une forge git

Demo en live sur framagit.

git remote
git remote add origin git@framagit.org:labomedia/foo.git
git remote
git remote -v
git branch -M main
git push -uf origin main

Visit URL: https://framagit.org/labomedia/foo.git

Quoi commit ?

.gitignore file permet de configurer des fichiers à ne pas commit

Attention, si vous avez commit un secret sur un dépôt distant, il faut considérer que le secret n'est plus secret.

Fichiers à commit

Fichiers à ne pas commit

Travail collaboratif

Reset, Restore, Revert

Il est parfois nécessaire de faire des opérations de "retour en arrière" :

Il est facile de modifier des commit dans son repo local tant qu'ils n'ont pas été partagés dans un autre repo. Toutefois, il est toujours dangereux de modifier l'historique des commit, surtout lorsqu'on travail à plusieurs.

Attention, si vous avez commit un secret sur un dépôt distant, il faut considérer que le secret n'est plus secret.

git restore

Manipule le "working tree" ou le "staging area". Ne change pas l'historique.

git revert

Annule les modifications d'un ou plusieurs commit. Ne change pas l'historique

git reset

Permet de modifier l'historique (à faire avec précaution).

Merge vs Rebase ?

Débat d'ordre philosophique non tranchable. Cela dépend des pratiques de chacun, de l'équipe et du workflow de travail.

Les 2 opérations permettent de fusionner 2 branches en une. Typiquement on va fusionner la branch develop dans la branch main lorsque l'on a terminé ses modifications sur la branch develop.

Les 2 opérations different dans la manière de réaliser cette fusion dans l'historique.

Merge

Ne modifie pas l'historique et ajoute un nouveau commit dans la branch accueillant la fusion.

Rebase

Modifie l'historique afin de faire démarrer la branch fusionné à la fin de la branche accuillant la fusion.

squash

Git workflows

Si on est nombreux sur un repo, il faut synchro son repo local souvent.

Minimal flow : quand on travail essentiellement seul (mon mien)

Git flow : exemple de workflow pour travailler à plusieurs sans se marcher sur les pieds

Une doc en français Une doc fr du plugin git-flow

Autres

TODO: Linker d'autres git flows

Pull requests

TODO

Trucs utiles

git config

Alias tiptop

git config --global alias.s "status"
git config --global alias.who "shortlog -sne"
git config --global alias.changes "diff --name-status"
git config --global alias.dic "diff --cached"
git config --global alias.d "diff --stat"
git config --global alias.hist "log --pretty=oneline --abbrev-commit --graph --decorate"
git config --global alias.lc \!"git hist ORIG_HEAD.. --stat --no-merges"
git config --global alias.amend "commit --amend"
git config --global alias.undo "git reset --soft HEAD^"
git config --global alias.spull \!"__git_spull() { git pull "$@" && git submodule sync --recursive && git submodule update --init --recursive --remote; }; __git_spull"
git config --global alias.spush "push --recurse-submodules=on-demand"

authent avec ssh

ssh keygen ?

git init --bare

TODO

Feedback 1er atelier