Git

De WikiOpenTruc
Aller à : navigation, rechercher


Warning : la présente page traite surtout de la commande git.

Github est traité à part.

La présente page se base principalement sur la doc "officielle" : https://git-scm.com/book/fr/v2

Toutes les commandes git listées ici sont à appeler depuis un terminal, en étant positionné dans le répertoire du projet que l'on souhaite bidouiller.


m.c. : VCS , CVS ,

  • git = programme de versioning écrit par Linus Torvalds
  • git procède en créant un répertoire (caché) qui va contenir toutes les informations additionnelles de versions/changements/etc
  • git est le nom du programme principal, mais de fait git se matérialise sous la forme d'une vingtaine de commandes relatives au versioning
  • git peut être utilisé par un développeur unique, mais de fait, c'est surtout pour les projets à plusieurs développeurs, désynchronisés et éparpillés, que ça vaut le coup et que c'est même de fait indispensable. 10 devs dispersés et désynchronisés, c'est juste ingérable sans un outil fait pour et standardisé. Chacun des 10 devs peut avoir une bonne méthode bien à lui pour le job, mais si les 10 méthodes sont différentes, c'est évidemment un bronx ingérable.
  • à la base, git a été conçu pour une utilisation non anonyme


git checkout

Pour cloner une branche (car git clone ne clone que la branche master)


git clone

C'est une commande importante pour les projets open-source, puisqu'elle permet à la fois le travail dispersé/décentralisé sur le projet cloné, mais aussi la diffusion et la sauvegarde.

On peut très bien cloner un projet, sans jamais en modifier une ligne. Mais cela réalise de facto une sauvegarde (de plus) de ce projet.

Sur github.com, un projet qui a réellement du succès est cloné des dizaines de fois et plus.

La commande git clone permet de se créer son répertoire de travail personnel, à l'écart du répertoire maître (qui peut eg être un dépôt github), de travailler dans son répertoire personnel, puis, si les modifications sont jugées pertinentes, de proposer (pull request) au mainteneur du dépôt principal de rapatrier les modifications.

La commande git clone ne se contente (évidemment) pas simplement d'effectuer une copie de fichiers. En plus de cela elle importe également bien sûr toutes les infos de gestion de version. Et parmi les infos de VS importées, il y a bien sûr l'url du dépôt cloné ainsi que sa branche. Ces infos sont mémorisées par défaut. Par la suite il sera donc en général inutile de les retaper, elles sont connues de git.

Attention : par défaut git clone clone uniquement la branche master d'un projet. Les autres branches ne sont pas clonées. (Certains projets ont beaucoup de branches, donc ça s'explique).

Pas de souci pour cloner la branche master :

# git clone https://github.com/ProjetMachin/PyMachin .
Cloning into '.'...
remote: Counting objects: 14020, done.
remote: Compressing objects: 100% (11/11), done.
remote: Total 14020 (delta 4), reused 5 (delta 2), pack-reused 14007
Receiving objects: 100% (14020/14020), 8.71 MiB | 6.87 MiB/s, done.
Resolving deltas: 100% (10281/10281), done.

Attention :

  • le point final est pour cloner dans le répertoire courant
  • pour un compte github incluant plusieurs répertoires, il faut cloner chaque répertoire individuellement. A priori, il n'est pas possible de cloner un compte en entier.
  • pour cloner un compte en entier, il faut utiliser une commande hors git comme brew

Syntaxes toutes fausses :
git clone https://github.com/Bitmessage/PyBitmessage/tree/v0.6 .
git clone https://github.com/Bitmessage/PyBitmessage/v0.6 .

Branche développement (v0.6) ... ça coince pareil sur machine distante qu'en local :

$ git clone -b v0.6 git@github.com:Bitmessage/PyBitmessage.git .
Cloning into '.'...
The authenticity of host 'github.com (192.30.253.113)' can't be established.
RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'github.com,192.30.253.113' (RSA) to the list of known hosts.
Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

En fait, c'est le préfixe git@github.com qui doit déclencher une authentification.

Syntaxe qui fonctionne :

$ git clone -b v0.6 https://github.com/Bitmessage/PyBitmessage.git .
Clonage dans '.'...
remote: Counting objects: 14020, done.
remote: Compressing objects: 100% (11/11), done.
remote: Total 14020 (delta 4), reused 5 (delta 2), pack-reused 14007
Réception d'objets: 100% (14020/14020), 8.71 MiB | 1.32 MiB/s, fait.
Résolution des deltas: 100% (10281/10281), fait.

On pourrait croire qu'on a cloné la branche master, car 99% du contenu est identique, mais l'examen des fichiers via diff -r montre que c'est bien la branche v0.6. (Et il est parfaitement normal qu'un commit ne change qu'une petite fraction du code total).


git commit

C'est un peu la commande centrale de git. C'est la commande qui prend un cliché/sauvegarde instantané du projet.

Il est recommandé de documenter un minimum chaque commit. Même succinctement. Tout comme on légende une photo.

git commit -m "blabla"

à noter que git commit requiert de s'être identifié au préalable via git config


git config

C'est la commande qui permet d'enregistrer le nom et le mail de l'utilisateur et d'autres informations.

Ces informations sont obligatoires pour pouvoir utiliser certaines autres commandes, eg git commit

Pour un projet vraiment partagé, ces informations peuvent avoir leur utilité.

à noter que :

  • les informations entrées peuvent être globales, ie concerneront tous les projets sous git, ou locales/spécifiques à un projet particulier
  • les informations entrées peuvent être changées

git config --list pour voir ce qui est stocké


git log

Renvoie l'historique des commits. Cette commande est très dense, avec plein d'options. Le man fait plusieurs pages. Donc je ne vais pas résumer cette commande ici

  • exemple : git log -1 va renvoyer les infos sur le dernier commit, l'identifiant de commit, qui l'a fait et les commentaires associés.


git pull

Cette commande importante permet de tirer à soi (vers son répertoire local) la dernière version de la branche master du dépôt originel.

La branche est entièrement rapatriée et fusionnée au mieux avec notre existant (ie normalement notre travail n'est pas écrasé sauvagement).

Cela revient à faire une màj.

On peut aussi utiliser git fetch mais c'est un poil plus sioux.

Etant donné qu'il s'agit d'un download, git pull ne requiert normalement pas de droits particuliers (du moins pour les projets open publics).

La commande duale git push requiert par contre les droits d'écriture.


git push

C'est la commande duale de git pull. Elle requiert évidemment les droits d'écriture sur le dépôt visé ainsi que pas de collision.

A priori, je pense que cette commande est réservée exclusivement aux mainteneurs du répertoire concerné. Ce sont eux qui prennent la responsabilité de faire, ou pas, évoluer le projet.

La procédure de travail normale est de déposer une PR (pull request) auprès des mainteneurs. Dans github, tout cela est très codifié.

Un schéma possible est :

  • forker de github/a vers github/perso
  • git pull le github/perso sur son PC
  • ... ce qui permet de faire du git push tranquillou vers son propre github/perso (puis éventuellement Pull Request etc)

... mais c'est quand même assez laborieux.

Pour tripoter eg de la doc, autant éditer directos dans github/a (même sans les droits), github se charge (assez bien) de tout piloter.

Le fork, suivi de pull/push permet aussi d'exposer son travail (ajouts/amendements) publiquement.

Un push vers github.com/machin demande :

  • username
  • password


git remote

git remote pour connaître l'alias associé au dépôt distant d'où on a tiré notre clone. Au minimum on récupère l'alias origin qui est l'alias par défaut du dépôt originel.

Noter que l'alias origin est bien pratique, puisqu'il permet d'éviter de retaper toute une url.

git remote -v pour avoir explicitement les urls correspondants aux alias existants

git remote add [nomcourt] [url]  : pour générer autant d'alias (en général courts) que l'on veut, pour désigner telle ou telle url distante. La doc désigne ça par le vocable "ajout de dépôt distant".

git remote show [nomcourt] : pour avoir des infos sur le dépôt

Sont aussi dispo : rename, rm, etc.


git status

Cette commande est à appeler depuis un répertoire sous git.

git status donne des infos sur l'état du répertoire comparativement à son état lors de son import initial.

Attention : git status ne va pas comparer votre répertoire local avec le répertoire original sur github ou autre. git status se contente juste de comparer votre répertoire local à l'instant avec son état lorsque vous l'avez cloné/importé ou créé.

git status -s pour la version non verbeuse (short)


.gitignore

Ce fichier caché permet d'indiquer à git de quels fichiers il ne doit pas se préoccuper.


Pratique

$ diff -r bm-v0.6/ master/ pour lister les différences entre 2 branches


Lexique

  • commit : modification(s) sur le code. On n'est pas obligé d'attendre d'avoir fait des modifications énormes pour générer un commit. Un commit, c'est un état/version/image du code mémorisé à l'instant où ce commit est effectué.
  • validé : Validé signifie que les données sont stockées en sécurité dans votre base de données locale. validé est synonyme de commit.


git --help

usage : git [--version] [--help] [-C <path>] [-c name=value]
           [--exec-path[=<path>]] [--html-path] [--man-path] [--info-path]
           [-p | --paginate | --no-pager] [--no-replace-objects] [--bare]
           [--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>]
           <command> [<args>]

Ci-dessous les commandes Git habituelles dans diverses situations :

démarrer une zone de travail (voir aussi : git help tutorial)
   clone      Cloner un dépôt dans un nouveau répertoire
   init       Créer un dépôt Git vide ou réinitialiser un existant

travailler sur la modification actuelle (voir aussi : git help revisions)
   add        Ajouter le contenu de fichiers dans l'index
   mv         Déplacer ou renommer un fichier, un répertoire, ou un lien symbolique
   reset      Réinitialiser la HEAD courante à l'état spécifié
   rm         Supprimer des fichiers de la copie de travail et de l'index

examiner l'historique et l'état (voir aussi : git help revisions)
   bisect     Trouver par recherche binaire la modification qui a introduit un bogue
   grep       Afficher les lignes correspondant à un motif
   log        Afficher l'historique des validations
   show       Afficher différents types d'objets
   status     Afficher le statut de la copie de travail

agrandir, marquer et modifier votre historique
   branch     Lister, créer ou supprimer des branches
   checkout   Basculer de branche ou restaurer la copie de travail
   commit     Enregistrer les modifications dans le dépôt
   diff       Afficher les changements entre les validations, entre validation et copie de travail, etc
   merge      Fusionner deux ou plusieurs historiques de développement ensemble
   rebase     Réapplication des commits sur le sommet de l'autre base
   tag        Créer, lister, supprimer ou vérifier un objet d'étiquette signé avec GPG

collaborer (voir aussi : git help workflows)
   fetch      Télécharger les objets et références depuis un autre dépôt
   pull       Rapatrier et intégrer un autre dépôt ou une branche locale
   push       Mettre à jour les références distantes ainsi que les objets associés

'git help -a' et 'git help -g' listent les sous-commandes disponibles et
quelques concepts. Voir 'git help <commande>' ou 'git help <concept>'
pour en lire plus à propos d'une commande spécifique ou d'un concept.


Pages connexes


Liens