Outils pour utilisateurs

Outils du site


git

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
git [2016/01/15 12:17]
luc
git [2023/11/08 21:12] (Version actuelle)
luc
Ligne 1: Ligne 1:
-===== GIT ===== +====== GIT ======
- +
-[[gitManageWebsite|manager un site web via git]]+
  
 Ah, git... tout est dit, non ?\\ Ah, git... tout est dit, non ?\\
Ligne 9: Ligne 7:
 \\ \\
 On trouve pas mal de "super tutos", des cheat-list, etc... pour savoir comment utiliser git en ligne de commande : j'ai jamais rien compris et nombreux sont ceux qui peuvent témoigner du nombre de jurons que j'ai pu proférer contre git. Alors cette page n'a pas pour vocation d'être un autre de ces tutos, mais elle revient plutôt à l'essence même de ce site : être mon aide mémoire. C'est à dire exposer les commandes dont j'ai besoin et les qques concepts qu'il faut connaître pour les comprendre.\\ On trouve pas mal de "super tutos", des cheat-list, etc... pour savoir comment utiliser git en ligne de commande : j'ai jamais rien compris et nombreux sont ceux qui peuvent témoigner du nombre de jurons que j'ai pu proférer contre git. Alors cette page n'a pas pour vocation d'être un autre de ces tutos, mais elle revient plutôt à l'essence même de ce site : être mon aide mémoire. C'est à dire exposer les commandes dont j'ai besoin et les qques concepts qu'il faut connaître pour les comprendre.\\
 +La plupart des explications de cet article viennent de http://git-scm.com/doc \\
 \\ \\
 Outils pratiques : Outils pratiques :
   * [[http://gitlist.org|gitList]], une sorte de visionneuse web du dépôt git (fichiers, historiques des commit...)   * [[http://gitlist.org|gitList]], une sorte de visionneuse web du dépôt git (fichiers, historiques des commit...)
-  * [[http://gogs.io|gogs]] qui en plus des fonctions de visionneuse rajoute des métadonnées autour du projet (wiki, issue/milestone list..) et une dimension sociale si on code à plusieurs+  * [[http://gogs.io|gogs]] qui en plus des fonctions de visionneuse rajoute des métadonnées autour du projet (wiki, issue/milestone list..) et une dimension sociale si on code à plusieurs /!\ il faut passer par le protocole https:// et non ssh:// pour que gogs soit au courant des modifs dans le dépot git 
 +  * [[https://gitlab.com|gitlab]], self-hostable, open source, mais un peu lourd en besoin de ressources, je lui préfère gogs
  
-==== CONCEPTS ====+===== 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'état d'une version antérieure. \\ 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'état d'une version antérieure. \\
Ligne 20: Ligne 22:
 Git est **décentralisé**, ça signifie que chacun des clients possède l'intégralité de l'historique du dépot. Entre autres, on peut avoir plusieurs dépôts distants pour synchroniser son dépot local. Git est **décentralisé**, ça signifie que chacun des clients possède l'intégralité de l'historique du dépot. Entre autres, on peut avoir plusieurs dépôts distants pour synchroniser son dépot local.
  
-=== Principes de base ===+==== Les 3 états, les 3 zones ====
  
 Git possède 3 états dans lesquels peuvent être les fichiers : Git possède 3 états dans lesquels peuvent être les fichiers :
Ligne 28: Ligne 30:
 Un fichier doit passer par la case staged avant d'aller dans la case commit.\\ Un fichier doit passer par la case staged avant d'aller dans la case commit.\\
 On va voir par la suite comment fonctionner avec ces états et comment passer de l'un à l'autre. On va voir par la suite comment fonctionner avec ces états et comment passer de l'un à l'autre.
-\\ + 
-\\+==== Comprendre ==== 
 + 
 +=== Commit === 
 +Un commit contient un index (liens vers les fichiers), un message de commit, et un lien vers l'ancien commit. Il peut donc y avoir une succession de commit en remonttant de l'un à l'autre. \\ 
 +ça peut paraître obscur ou incomplet (ça l'est surement), mais ces histoires de pointeurs est à approfondir, elles permettent de vraiment comprendre comment git stocke les choses, et comment elles s'articulent entre elles, et donc de bien utiliser git (ce qui est quand même l'objectif). 
 + 
 +=== 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'espace, par contre pas rapide du tout). 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'espace, par contre pas rapide du tout).
  
-=== Obtenir de l'aide ===+==== Obtenir de l'aide ====
 <code|bash> <code|bash>
 # Par exemple sur la fonctionnalité config : # Par exemple sur la fonctionnalité config :
Ligne 38: Ligne 46:
 </code> </code>
  
-==== CONFIG ====+===== CONFIG =====
  
 <code|bash> <code|bash>
Ligne 63: Ligne 71:
  
  
-==== CREER UN DEPOT ====+===== CREER UN DEPOT =====
  
 <code|bash> <code|bash>
Ligne 76: Ligne 84:
  
  
-==== TENIR UN DEPÔT (en fait une branche) A JOUR ====+===== 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. Toutes les commandes qui suivent permettent de tenir à jour la branche actuelle. Voir le paragraphe suivant pour la gestion des branches.
Ligne 150: Ligne 158:
 </code> </code>
  
-=== Astuces ===+==== Astuces ====
 Pour ignorer des fichiers, il faut mettre leur nom dans le fichier ''.gitignore'' à la racine du dépôt. Différentes syntaxes (regex ?) peuvent être utilisées comme filtre : Pour ignorer des fichiers, il faut mettre leur nom dans le fichier ''.gitignore'' à la racine du dépôt. Différentes syntaxes (regex ?) peuvent être utilisées comme filtre :
 <code> <code>
Ligne 156: Ligne 164:
 </code> </code>
  
-=== Tag ===+==== Tag ====
  
 <code|bash> <code|bash>
Ligne 179: Ligne 187:
  
  
-=== Comprendre === 
- 
-Un commit contient un index (liens vers les fichiers), un message de commit, et un lien vers l'ancien commit. Il peut donc y avoir une succession de commit en remonttant de l'un à l'autre. \\ 
-ça peut paraître obscur ou incomplet (ça l'est surement), mais ces histoires de pointeurs est à approfondir, elles permettent de vraiment comprendre comment git stocke les choses, et comment elles s'articulent entre elles, et donc de bien utiliser git (ce qui est quand même l'objectif). 
  
  
  
  
-==== GESTION DES DEPÔTS DISTANTS ====+===== GESTION DES DEPÔTS DISTANTS =====
  
 La commande ''git remote'' permet de lister les dépôts distants, d'en ajouter ou d'en retirer : La commande ''git remote'' permet de lister les dépôts distants, d'en ajouter ou d'en retirer :
Ligne 197: Ligne 201:
 # ajouter un nouveau dépôt distant  # ajouter un nouveau dépôt distant 
 git remote add REMOTE_NAME URL 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 # enlever un dépot distant
Ligne 218: Ligne 225:
  
  
-==== BRANCHES ====+===== BRANCHES =====
  
-=== Comprendre ===+==== Comprendre ====
  
 Une branche n'est en réalité qu'un pointeur vers un commit. Une branche n'est en réalité qu'un pointeur vers un commit.
Ligne 226: Ligne 233:
 ''HEAD'' fait référence à la branche actuelle, soit au dernier commit de cette branche. ''HEAD'' fait référence à la branche actuelle, soit au dernier commit de cette branche.
  
-=== Gestion des branches ===+==== Gestion des branches ====
  
 <code|bash> <code|bash>
Ligne 250: Ligne 257:
 git checkout BRANCH_DEST git checkout BRANCH_DEST
 git merge --no-ff BRANCH_NAME git merge --no-ff BRANCH_NAME
-# utile : l'option --no-ff+=> utile : l'option --no-ff
 # ne crée pas tous les commit intermédiaires de la branche à finir  # ne crée pas tous les commit intermédiaires de la branche à finir 
 # dans la branche de destination, juste le commit du merge. # dans la branche de destination, juste le commit du merge.
-pratique si on considère qu'une branche sert une fonctionnalité  +Pratique si on considère qu'une branche sert une fonctionnalité  
-# et qu'on veut pas que les autres branches/fonctionnalités parasitent la branche de destination+# et qu'on veut pas que les autres branches/fonctionnalités parasitent 
 +la branche de destination
  
 # supprimer une branche # supprimer une branche
 git branch -d BRANCH_NAME 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 <branch_name> # can now be used to change branches, as git checkout <branchname> does
 +git restore <file_path>  # can be used to reset files to certain revisions, as git checkout -- <path_to_file> does
  
  
 </code> </code>
  
-=== Conflits ===+==== Conflits ====
 Lorsqu'il y a conflit, le merge n'aboutit pas et git annote les fichiers pour resolution manuelle du conflit, il faut ensuite marquer le conflit comme résolu à l'aide d'un ''git add FILE_NAME'' Lorsqu'il y a conflit, le merge n'aboutit pas et git annote les fichiers pour resolution manuelle du conflit, il faut ensuite marquer le conflit comme résolu à l'aide d'un ''git add FILE_NAME''
  
Ligne 268: Ligne 281:
  
  
-=== BRANCHES DISTANTES ===+==== Branches distantes ====
 Elles sont references sous la forme REMOTE/BRANCH. Elles sont references sous la forme REMOTE/BRANCH.
 Elles ne bougent pas sans synchro extérieure (''git fetch BRANCH_NAME'' <- met à jour la database locale de git) Elles ne bougent pas sans synchro extérieure (''git fetch BRANCH_NAME'' <- met à jour la database locale de git)
Ligne 290: Ligne 303:
  
  
-=== tracking branch === +==== Branches suivies (tracking) ====
 Ce sont des branches qui ont un lien direct avec une branche d'un depot distant. Ce qui permet d'utiliser ''git pull''. Ce sont des branches qui ont un lien direct avec une branche d'un depot distant. Ce qui permet d'utiliser ''git pull''.
- 
  
 <code|bash> <code|bash>
-# creation d'une tracking branche +## creation d'une tracking branche 
-git branch -u REMOTE/BRANCH #tracking de REMOTE/BRANCH depuis la branche actuelle+# tracking de REMOTE/BRANCH depuis la branche actuelle 
 +git branch -u REMOTE/BRANCH 
 # OU # OU
-git clone ... # crée automatiquement une branche master et un depot distant origin, master tracks origin/master+# crée master et origin, master suit origin/master 
 +git clone ...
 # OU # OU
-git checkout -b BRANCH_NAME REMOTE/BRANCH # créer une branche locale qui track remote/origin, et bascule sur cette branche+# créer une branche locale qui track remote/origin, et bascule sur cette branche 
 +git checkout -b BRANCH_NAME REMOTE/BRANCH 
  
-# voir les branches qui sont tracked+ 
 +# voir les branches qui sont suivies
 git branch -vv git branch -vv
  
  
-# recupère les changements depuis le depot distant mais NE modifie PAS le working directory+# recupère les changements depuis le depot distant  
 +mais NE modifie PAS le working directory
 git fetch  git fetch 
  
  
-git pull 
-# équivaut à : 
-git fetch 
-git merge 
  
 </code> </code>
  
-=== RACCOURCIS ===+===== RACCOURCIS ===== 
 + 
 +En vrac, pour toutes les sections : 
 <code|bash> <code|bash>
 # créer une branche et basculer vers celle-ci # créer une branche et basculer vers celle-ci
 git checkout -b BRANCH_NAME git checkout -b BRANCH_NAME
-=+=
 git branch BRANCH_NAME git branch BRANCH_NAME
 git checkout 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'état du dernier commit
 +git reset --hard HEAD
 +# Est-ce que ça touche aux fichiers non indexés ? Non
 +</code>
 +
 +===== MODELE DE DEVELOPPEMENT =====
 +
 +C'est un condensé de cet [[http://nvie.com/posts/a-successful-git-branching-model/|article]], que je trouve bien fait.\\
 +En gros :
 +  * la branche ''master'' représente l'état production du projet, c'est sensé tourner en permanence
 +  * la branche ''dev'' contient les nouvelles fonctionnalités, encore à l'état instable. Lorsque l'état est suffisamment stable, le contenu peut etre placé dans la branche ''master''
 +  * au besoin, des branches temporaires :
 +    * ''feature'', pour le developpement de fonctionnalités particulières dont l'avenir est incertain ou particulièrement instable, 
 +    * ou ''hotfix'' pour ajouter un bugfix à la branche ''master'' sans ajouter de nouvelles fonctionnalités (potentiellement instables)
 +
 +!!! les merge se font avec l'option ''--no-ff'', pour éviter de reporter les commit de développement d'une fonctionnalité particulière dans les branches principales (''master'', ''dev'')
 +
 +
 +===== 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://ID@HOTE:PATH
 +# PATH peu être relatif ou absolu
 +
 +# ssh + port spécifique 
 +git clone ss://ID@HOTE:PORT/ABS_PATH
 +
 +# il y a https (peut être utile pour mettre à jour un service de suiv comme github, gogs ou gitlab
 +git clone https://URL
 </code> </code>
git.1452860263.txt.gz · Dernière modification: 2018/10/13 20:32 (modification externe)