git
Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
git [2016/01/15 09:47] – luc | git [2023/11/08 21:12] (Version actuelle) – luc | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
+ | ====== GIT ====== | ||
+ | Ah, git... tout est dit, non ?\\ | ||
+ | \\ | ||
+ | C'est un bel outil, puissant parait-il, complexe, très complexe, trop complexe ?\\ | ||
+ | Enfin, ça semble plus qu' | ||
+ | \\ | ||
+ | On trouve pas mal de "super tutos", | ||
+ | La plupart des explications de cet article viennent de http:// | ||
+ | \\ | ||
+ | Outils pratiques : | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | * [[https:// | ||
+ | |||
+ | ===== CONCEPTS ===== | ||
+ | |||
+ | ==== Principes de base ==== | ||
+ | |||
+ | Git est un **gestionnaire de version**, il sert à conserver la version d'un fichier entre chaque changement, et permet de récupérer à tout moment l' | ||
+ | \\ | ||
+ | Git est **décentralisé**, | ||
+ | |||
+ | ==== Les 3 états, les 3 zones ==== | ||
+ | |||
+ | Git possède 3 états dans lesquels peuvent être les fichiers : | ||
+ | * modifié (modified), c'est à dire dans le système de fichier classique (working directory) | ||
+ | * indexé (staged), c'est à dire dans la zone d' | ||
+ | * validé (commited), c'est à dire bien au chaud, rangés dans le dossier .git (git directory / git database) | ||
+ | Un fichier doit passer par la case staged avant d' | ||
+ | On va voir par la suite comment fonctionner avec ces états et comment passer de l'un à l' | ||
+ | |||
+ | ==== Comprendre ==== | ||
+ | |||
+ | === Commit === | ||
+ | Un commit contient un index (liens vers les fichiers), un message de commit, et un lien vers l' | ||
+ | ça peut paraître obscur ou incomplet (ça l'est surement), mais ces histoires de pointeurs est à approfondir, | ||
+ | |||
+ | === Stockage des fichiers === | ||
+ | Git conserve chaque fichier intégralement. Si entre 2 commit un fichier ne change pas, le fichier n'est pas sauvegardé mais un lien vers le fichier du commit précédent est fait. Cela permet de ne pas consommer trop de place en gardant une vitesse de traitement convenable (contrairement aux autres systèmes qui ne conservent que des delta entre les différentes versions, certes utile pour optimiser l' | ||
+ | |||
+ | ==== Obtenir de l'aide ==== | ||
+ | < | ||
+ | # Par exemple sur la fonctionnalité config : | ||
+ | git help config | ||
+ | </ | ||
+ | |||
+ | ===== CONFIG ===== | ||
+ | |||
+ | < | ||
+ | # On peut voir la config avec | ||
+ | git config --list | ||
+ | |||
+ | |||
+ | ## A la première execution de git, il faut règler qques petits aspects de config : | ||
+ | |||
+ | # Identité | ||
+ | git config --global user.name "John Doe" | ||
+ | git config --global user.email johndoe@example.com | ||
+ | |||
+ | # Editeur par défaut | ||
+ | git config --global core.editor vim | ||
+ | |||
+ | # Pour ne pas retaper le mot de passé tout le temps : | ||
+ | # enregistre les infos creditential qques minutes | ||
+ | git config --global credential.helper cache | ||
+ | |||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ===== CREER UN DEPOT ===== | ||
+ | |||
+ | < | ||
+ | # Créer un dépôt git dans un dossier existant : | ||
+ | git init | ||
+ | |||
+ | # Cloner un dépôt existant : | ||
+ | git clone https:// | ||
+ | # cloner crée aussi un lien vers le dépôt distant nommé '' | ||
+ | # cloner crée en local une branche appelée '' | ||
+ | </ | ||
+ | |||
+ | |||
+ | ===== TENIR UN DEPÔT (en fait une branche) A JOUR ===== | ||
+ | |||
+ | Toutes les commandes qui suivent permettent de tenir à jour la branche actuelle. Voir le paragraphe suivant pour la gestion des branches. | ||
+ | |||
+ | < | ||
+ | |||
+ | # pour savoir où on en est : | ||
+ | git status | ||
+ | |||
+ | |||
+ | # Pour indexer (et suivre) des nouveaux fichiers : | ||
+ | git add FILE_NAME | ||
+ | |||
+ | |||
+ | # Si on a changé un fichier suivi et qu'on veut sauvegarder son état actuel | ||
+ | # dans la staging area (git status nous donne la commande à utiliser) : | ||
+ | git add FILE_NAME | ||
+ | # NOTE : le fichier sera ensuite gelé tel quel dans la staging area, | ||
+ | # si on le modifie de nouveau par la suite AVANT un commit, il faudra ré-utiliser | ||
+ | # la commande '' | ||
+ | # la nouvelle version du fichier | ||
+ | |||
+ | |||
+ | # Pour Unstage un fichier qu'on aurait ajouté par erreur avec '' | ||
+ | # (comme souvent la commande est suggérée par '' | ||
+ | git reset HEAD FILE_NAME | ||
+ | # NOTE : le fichier reste modifié dans le working directory, | ||
+ | # il est juste sorti du stage area (et donc du prochain commit) | ||
+ | |||
+ | |||
+ | # Pour archiver/ | ||
+ | # (et non celles dans le working directory) | ||
+ | git commit | ||
+ | # NOTE : Cela va ouvrir notre éditeur de texte par défaut pour | ||
+ | # qu'on puisse laisser un message décrivant le commit. | ||
+ | |||
+ | # Version courte : | ||
+ | git commit -m " | ||
+ | |||
+ | |||
+ | # pour rajouter un truc à un commit qu'on aurait fait trop vite : | ||
+ | git add FICHIER_OUBLIE | ||
+ | git commit --amend | ||
+ | |||
+ | |||
+ | # Pour enlever des fichiers, | ||
+ | # il faut les enlever de la staging area et faire un commit. | ||
+ | ... | ||
+ | # OU en 1 commande: | ||
+ | git rm FILE_NAME | ||
+ | # NOTE : '' | ||
+ | |||
+ | # permet de ne plus suivre un fichier mais de le laisser dans le working directory | ||
+ | git rm --cached FILE_NAME | ||
+ | |||
+ | |||
+ | # Pour déplacer des fichiers : | ||
+ | # de base, git ne suit pas les déplacements effectués via le système de fichier, | ||
+ | # il faut les lui signaler explicitement, | ||
+ | git mv FILE_FROM FILE_TO | ||
+ | # NOTE : git effectue aussi les actions dans le système de fichier ($> rm FILE_NAME) | ||
+ | |||
+ | |||
+ | # Pour annuler une modification d'un fichier du working directory, | ||
+ | # c'est à dire récupérer la version du dernier commit : | ||
+ | # (encore une fois '' | ||
+ | git checkout -- FILE_NAME | ||
+ | # NOTE : il est préférable de faire un commit dans une nouvelle branche | ||
+ | # puis de récupérer l' | ||
+ | # un fichier qui serait définitivement perdu ! | ||
+ | |||
+ | |||
+ | </ | ||
+ | |||
+ | ==== Astuces ==== | ||
+ | Pour ignorer des fichiers, il faut mettre leur nom dans le fichier '' | ||
+ | < | ||
+ | blabla --- A REMPLIR | ||
+ | </ | ||
+ | |||
+ | ==== Tag ==== | ||
+ | |||
+ | < | ||
+ | # liste des tag (filtrée ou non) | ||
+ | git tag [-l " | ||
+ | |||
+ | # créer un tag " | ||
+ | # (c'est un simple pointeur vers un commit particulier) | ||
+ | git tag TAG_NAME | ||
+ | |||
+ | # Transférer un tag vers un dépôt distant (par défaut, ils sont uniquement locaux) | ||
+ | git push REMOTE_NAME TAG_NAME | ||
+ | |||
+ | # faire un checkout sur un tag particulier | ||
+ | git checkout -b BRANCH_NAME TAG_NAME | ||
+ | |||
+ | # on peut faire d' | ||
+ | # - des tag annotés | ||
+ | # - des tag sur un commit particulier déjà dépassé | ||
+ | # ... | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ===== GESTION DES DEPÔTS DISTANTS ===== | ||
+ | |||
+ | La commande '' | ||
+ | |||
+ | < | ||
+ | # afficher la liste des dépôts distants et leur alias | ||
+ | git remote -v | ||
+ | |||
+ | # ajouter un nouveau dépôt distant | ||
+ | git remote add REMOTE_NAME URL | ||
+ | |||
+ | # pour link un dépot distant avec une branche distante (pour avoir que git push et git pull) | ||
+ | git push -u REMOTE_NAME BRANCH_NAME | ||
+ | |||
+ | # enlever un dépot distant | ||
+ | git remote remove REMOTE_NAME | ||
+ | |||
+ | # pour inspecter la config (et les branches) d'un dépôt distant | ||
+ | git remote show REMOTE_NAME | ||
+ | |||
+ | # pour plus d'info | ||
+ | git help remote | ||
+ | |||
+ | |||
+ | # récupère les données du dépôts distant | ||
+ | # mais ne bascule pas sur ces données ni n' | ||
+ | git fetch REMOTE | ||
+ | |||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ===== BRANCHES ===== | ||
+ | |||
+ | ==== Comprendre ==== | ||
+ | |||
+ | Une branche n'est en réalité qu'un pointeur vers un commit. | ||
+ | |||
+ | '' | ||
+ | |||
+ | ==== Gestion des branches ==== | ||
+ | |||
+ | < | ||
+ | # voir les branches ( | ||
+ | git branch | ||
+ | git branch [-v] # avec les messages des derniers commit | ||
+ | git branch [--merged] [--no-merged] | ||
+ | |||
+ | |||
+ | # créer une branche (donc un pointeur vers le dernier commit de la branche actuelle) | ||
+ | git branch | ||
+ | |||
+ | # basculer sur une autre branche | ||
+ | # !! ça change le working directory et charge les données de la branche !! | ||
+ | # !! normalement, | ||
+ | # (aka il y a des modifs non commit), git ne change pas de branche | ||
+ | git checkout BRANCH_NAME | ||
+ | |||
+ | # merge : | ||
+ | # on se place dans la branche de destination | ||
+ | # on appelle la commande merge avec le nom de la branche à ramener | ||
+ | # cela crée un commit dans la branche de destination et avance les pointeurs commit | ||
+ | git checkout BRANCH_DEST | ||
+ | git merge --no-ff BRANCH_NAME | ||
+ | # => utile : l' | ||
+ | # ne crée pas tous les commit intermédiaires de la branche à finir | ||
+ | # dans la branche de destination, | ||
+ | # Pratique si on considère qu'une branche sert une fonctionnalité | ||
+ | # et qu'on veut pas que les autres branches/ | ||
+ | # la branche de destination | ||
+ | |||
+ | # supprimer une branche | ||
+ | git branch -d BRANCH_NAME | ||
+ | |||
+ | # git switch et git restore | ||
+ | # Le but de ces 2 commandes est de différencier les 2 activités de `git checkout` | ||
+ | git switch < | ||
+ | git restore < | ||
+ | |||
+ | |||
+ | </ | ||
+ | |||
+ | ==== Conflits ==== | ||
+ | Lorsqu' | ||
+ | |||
+ | aller plus loin : '' | ||
+ | |||
+ | |||
+ | ==== Branches distantes ==== | ||
+ | Elles sont references sous la forme REMOTE/ | ||
+ | Elles ne bougent pas sans synchro extérieure ('' | ||
+ | Par exemple : master (local) | ||
+ | |||
+ | < | ||
+ | # Partager son travail avec le monde extérieur | ||
+ | # cela va mettre à jour la branche du depot distant avec la branche de notre dépôt | ||
+ | git push REMOTE_NAME BRANCH_NAME | ||
+ | |||
+ | # pour récupérer le travail d' | ||
+ | git fetch AUTRUI | ||
+ | git checkout BRANCH_NAME | ||
+ | git merge AUTRUI/ | ||
+ | |||
+ | |||
+ | # pour supprimer une branche distante | ||
+ | git push REMOTE --delete BRANCH | ||
+ | |||
+ | </ | ||
+ | |||
+ | |||
+ | ==== Branches suivies (tracking) ==== | ||
+ | Ce sont des branches qui ont un lien direct avec une branche d'un depot distant. Ce qui permet d' | ||
+ | |||
+ | < | ||
+ | ## creation d'une tracking branche | ||
+ | # tracking de REMOTE/ | ||
+ | git branch -u REMOTE/ | ||
+ | # OU | ||
+ | # crée master et origin, master suit origin/ | ||
+ | git clone ... | ||
+ | # OU | ||
+ | # créer une branche locale qui track remote/ | ||
+ | git checkout -b BRANCH_NAME REMOTE/ | ||
+ | |||
+ | |||
+ | # voir les branches qui sont suivies | ||
+ | git branch -vv | ||
+ | |||
+ | |||
+ | # recupère les changements depuis le depot distant | ||
+ | # mais NE modifie PAS le working directory | ||
+ | git fetch | ||
+ | |||
+ | |||
+ | |||
+ | </ | ||
+ | |||
+ | ===== RACCOURCIS ===== | ||
+ | |||
+ | En vrac, pour toutes les sections : | ||
+ | |||
+ | < | ||
+ | # créer une branche et basculer vers celle-ci | ||
+ | git checkout -b BRANCH_NAME | ||
+ | # = | ||
+ | git branch BRANCH_NAME | ||
+ | git checkout BRANCH_NAME | ||
+ | |||
+ | # récupérer le contenu distant et le mettre dans son working directory | ||
+ | git pull | ||
+ | # = | ||
+ | git fetch | ||
+ | git merge | ||
+ | |||
+ | # Si on a foutu le bazar dans le repertoire mais qu'on a pas commit, | ||
+ | # retrouve le répertoire à l' | ||
+ | git reset --hard HEAD | ||
+ | # Est-ce que ça touche aux fichiers non indexés ? Non | ||
+ | </ | ||
+ | |||
+ | ===== MODELE DE DEVELOPPEMENT ===== | ||
+ | |||
+ | C'est un condensé de cet [[http:// | ||
+ | En gros : | ||
+ | * la branche '' | ||
+ | * la branche '' | ||
+ | * au besoin, des branches temporaires : | ||
+ | * '' | ||
+ | * ou '' | ||
+ | |||
+ | !!! les merge se font avec l' | ||
+ | |||
+ | |||
+ | ===== PROTOCOLES ===== | ||
+ | |||
+ | On peut utiliser plusieurs protocoles selon ce qui est mis à dispo par le serveur pour synchroniser un dépôt git : | ||
+ | |||
+ | <code bash> | ||
+ | # il y a ssh | ||
+ | git clone ssh:// | ||
+ | # PATH peu être relatif ou absolu | ||
+ | |||
+ | # ssh + port spécifique | ||
+ | git clone ss:// | ||
+ | |||
+ | # il y a https (peut être utile pour mettre à jour un service de suiv comme github, gogs ou gitlab | ||
+ | git clone https://URL | ||
+ | </ |