Git
git est un système de gestion de version collaboratif qui permet de garder un historique des modifications effectuées sur un ensemble de fichiers à l'instar de TFS de Microsoft. L'une des particularités de Git est qu'il est possible de travailler en local en bénéficiant de la navigation à travers l'historique de nos fichiers.
Commandes de base
git status
: indique l'état de notre répo local ainsi que la branche sur la quelle nous travaillons. Il est intéressant de l'utiliser constamment pour voir où on en est dans le workflow
git log
: donne l'historique des opérations (se positionner dans un répertoire déjà initialisé) git log --oneline fourni un listing condensé.
git log -p
: donne l'historique + liste des fichiers modifiés dans chaque commit & diff
git add -A
: ajoute tous les fichiers modifiés listés dans la commande git status en zone de Staging. Cet ajout est local, et devra être suivi d'un git commit
git commit -m "message_de_commit"
: sauvegarde en local toutes les modifications présentes dans la zone de staging et y associe un message (ne pas négliger ce message)
git commit --amend
: permet d'ajouter des fichiers ou de modifier le message associé au dernier commit
git commit --no-verify
: permet de bypasser les checks de pre-commit déclenchés par les hooks
git push
: envoi sur le serveur git les modifications qui ont été commité en local. Attention pour que cette commande fonctionne, un repo distant doit avoir été préalablement ajouté (souvent nomé origin)
git pull
: récupère les modifications coté serveur (fichiers modifiés ou ajoutés). Cette commande est équivalent à un git fetch (récupère les fichiers distants) puis un git merge (ajouter les fichiers distant ajouté à notre branche)
git rebase -i HEAD~10
: permet de nettoyer un historique (ici les 10 derniers) de commits dégueux pas encore pushés en utilisant 'f' fixup pour fondre les commits (credit et aussi), voir aussi git rebase ici
git mv <source> <destination>
: commande souvent méconnue, permet de renommer un dossier/fichier sans perdre son historique (ce qui est le cas si on effectue la manip autrement)
git fetch origin && git reset --hard origin/master
: pour reset sa branche (ici master) avec celle dispo sur le serveur
Utilisation avancée
Pour l'inclusion d'un sous répo dans notre répo pour par exemple mutualiser des sources ou du contenu markdown, voir git subtree ou git submodule.
Git Branch
Les branches permettent de travailler de façon isolée sur une "copie" de l'ensemble du code du répo et il est alors possible de simplement passer d'une branche à l'autre avec des git checkout. C'est utile par exemple lorsqu'on veut implémenter une nouvelle fonctionnalité ou corriger un bug sans affecter le code existant. Pour info, la branche créée à l'initialisation du repo s'appelle "master".
git branch ma-nouvelle-branche
: création d'une nouvelle branche nommée "ma-nouvelle-branche"
git branch
: liste les branches ainsi que celle qui est sélectionnée
git checkout ma-nouvelle-branche
: permet de se positionner sur la branche "ma-nouvelle-branche"
git checkout -
: se positionner sur la branche précédente, permet de jongler entre 2 branches
git checkout -b ma-nouvelle-branche
: permet de créer une nouvelle branche ma-nouvelle-branche et se positionner dessus
git merge ma-nouvelle-branche
: merge les commits de la branche ma-nouvelle-branche sur la branche courante (se positionner sur Master pour redescendre ses devs)
Git config
Git comporte 3 niveaux de configuration, que l'on peut modifier avec la commande git config (git config --system|global|local
):
--system
: appliquée à tous les utilisateurs du système, ainsi qu'à tous leurs repos
modifie /etc/gitconfig
--global
: appliquée à 1 utilisateur ainsi qu'à tous ses repos,
modifie ~/.gitconfig
ou ~/.config/git/config
--local
: appliquée au répository
modifie le repo courant avec .git/config
Attention en cas de redéfinition de clés de config voici la priorité (la plus spécifique gagne): local > global > system
Exemples
configuration niveau utilisateur de l'éditeur utilisé dans les commandes git interactives :
git config --global core.editor vi
pour lister la config locale :
git config --local -l
pour supprimer une clé (ici pull.rebase
) :
git config --global --unset pull.rebase
Configuration / Setup
Initialisation local
Lorsqu'on veut qu'une arborescence puisse être gérée par le système Git, il faut initialiser le dossier "racine" c'est à dire que l'on crée un repository avec la commande git init. Pour cela on se positionne dans le dossier en question puis exécuter la commande : git init .
Cela va créer un dossier .git (caché) qui contient toutes les informations concernant le nouveau git repository.
Connexion au git server
Pour pouvoir travailler sur un repo distant il suffit :
- d'avoir un compte sur le site (Github, bitbucket etc.) ou serveur git distant (git server est disponible sur Linux mais aussi sur les NAS synology par ex)
- d'avoir un repository créé sur le serveur
- de disposer de l'URI de ce repo distant et des droits suffisant pour se connecter à distance sur le serveur
git remote add nom_de_notre_connexion uri
Workflow
Le workflow git de base est donc le suivant (en répétant les étapes suivantes 1 et 2) :
git checkout -b ma-nouvelle-branche
- ...travailler sur des fichiers
git add .
git commit -m "msg"
git push
On a ainsi une branche ma-nouvelle-branche qui contiendra des modifications qu'il faudra rebase
ou merge
sur la master
(ou main
qui est la branche de référence, clean).
Il existe des workflow git répendus utilisés sur les projets de grande envergure, faisant collaborer de nombreux développeurs :
Git et SSH sous Windows
Sous Windows faire attention au format de clés SSH (qu'il suffit de tester en essayant de se connecter avec le compte dédié au serveur git sur ce seveur, s'il l'autorise), à défaut utiliser PuTTY Key Generator pour convertir la clé privée:
Il est ensuite préférable d’utiliser un fichier de config SSH (qui va associer une clé donnée à un serveur), ce fichier a créer s'il n'existe pas : %USERPROFILE%\.ssh\config
va contenir un ensemble de blocs
Host monserveurgit
Hostname adresse.dsn.de.mon.server.git.com
IdentityFile ~/.ssh/ed25519.ppk
IdentitiesOnly yes
Outils
- Windows:
choco install git
ou git SCM - Linux:
sudo apt install git-core -y
- Outils graphiques : Git Kraken (multiplateforme) et le tout nouveau Sublime Merge
Liens
- la doc git en Francais
- ressources officiels et aide mémoire git
- demystifying git concepts
- Atlassian
- syntaxe Markdown pour les fichiers README
- comparatif des fournisseurs de service GIT