Développeur FullStack & Devops

Notes et mémos techniques

Git

git scm logo|100 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):

  1. --system  : appliquée à tous les utilisateurs du système, ainsi qu'à tous leurs repos

modifie /etc/gitconfig

  1. --global : appliquée à 1 utilisateur ainsi qu'à tous ses repos,

modifie ~/.gitconfig ou ~/.config/git/config

  1. --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 :

  1. 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)
  2. d'avoir un repository créé sur le serveur
  3. 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) :

  1. git checkout -b ma-nouvelle-branche
  2. ...travailler sur des fichiers
  3. git add .
  4. git commit -m "msg"
  5. 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:

PuTTY-Key-Generator

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

devops
git
rédigé le 28/05/18 , maj le 28/02/22 par Behrouze
A proposCheat SheetsOutilsVidéos