-
1. DĂ©marrage rapide
-
2. Les bases de Git
-
3. Les branches avec Git
-
4. Git sur le serveur
- 4.1 Protocoles
- 4.2 Installation de Git sur un serveur
- 4.3 Génération des clés publiques SSH
- 4.4 Mise en place du serveur
- 4.5 DĂ©mon (Daemon) Git
- 4.6 HTTP intelligent
- 4.7 GitWeb
- 4.8 GitLab
- 4.9 Git hébergé
- 4.10 Résumé
-
5. Git distribué
-
6. GitHub
-
7. Utilitaires Git
- 7.1 SĂ©lection des versions
- 7.2 Indexation interactive
- 7.3 Remisage et nettoyage
- 7.4 Signer votre travail
- 7.5 Recherche
- 7.6 RĂ©Ă©crire lâhistorique
- 7.7 Reset démystifié
- 7.8 Fusion avancée
- 7.9 Rerere
- 7.10 DĂ©boguer avec Git
- 7.11 Sous-modules
- 7.12 Empaquetage (bundling)
- 7.13 Replace
- 7.14 Stockage des identifiants
- 7.15 Résumé
-
8. Personnalisation de Git
- 8.1 Configuration de Git
- 8.2 Attributs Git
- 8.3 Crochets Git
- 8.4 Exemple de politique gérée par Git
- 8.5 Résumé
-
9. Git et les autres systĂšmes
- 9.1 Git comme client
- 9.2 Migration vers Git
- 9.3 Résumé
-
10. Les tripes de Git
- 10.1 Plomberie et porcelaine
- 10.2 Les objets de Git
- 10.3 Références Git
- 10.4 Fichiers groupés
- 10.5 La refspec
- 10.6 Les protocoles de transfert
- 10.7 Maintenance et récupération de données
- 10.8 Les variables dâenvironnement
- 10.9 Résumé
-
A1. Annexe A: Git dans dâautres environnements
- A1.1 Interfaces graphiques
- A1.2 Git dans Visual Studio
- A1.3 Git dans Visual Studio Code
- A1.4 Git dans IntelliJ / PyCharm / WebStorm / PhpStorm / RubyMine
- A1.5 Git dans Sublime Text
- A1.6 Git dans Bash
- A1.7 Git dans Zsh
- A1.8 Git dans PowerShell
- A1.9 Résumé
-
A2. Annexe B: Embarquer Git dans vos applications
- A2.1 Git en ligne de commande
- A2.2 Libgit2
- A2.3 JGit
- A2.4 go-git
- A2.5 Dulwich
-
A3. Commandes Git
- A3.1 Installation et configuration
- A3.2 Obtention et création des projets
- A3.3 Capture dâinstantanĂ© basique
- A3.4 Création de branches et fusion
- A3.5 Partage et mise Ă jour de projets
- A3.6 Inspection et comparaison
- A3.7 DĂ©bogage
- A3.8 Patchs
- A3.9 Courriel
- A3.10 SystĂšmes externes
- A3.11 Administration
- A3.12 Commandes de plomberie
7.1 Utilitaires Git - SĂ©lection des versions
Ă prĂ©sent, vous avez appris les commandes et modes de fonctionnement usuels requis pour gĂ©rer et maintenir un dĂ©pĂŽt Git pour la gestion de votre code source. Vous avez dĂ©roulĂ© les routines de suivi et de validation de fichiers, vous avez exploitĂ© la puissance de lâindex, de la crĂ©ation et de la fusion de branches locales de travail.
Maintenant, vous allez explorer un certain nombre de fonctionnalitĂ©s particuliĂšrement efficaces, fonctionnalitĂ©s que vous utiliserez moins souvent mais dont vous pourriez avoir lâusage Ă un moment ou Ă un autre.
SĂ©lection des versions
Git vous permet de faire référence à certains commits ou un ensemble de commits de différentes façons. Si elles ne sont pas toutes évidentes, il est bon de les connaßtre.
RĂ©visions ponctuelles
Naturellement, vous pouvez référencer un commit par sa signature SHA-1, mais il existe des méthodes plus confortables pour les humains. Cette section présente les méthodes pour référencer un commit simple.
Empreinte SHA courte
Git est capable de deviner de quel commit vous parlez si vous ne fournissez que quelques caractÚres du début de la signature, tant que votre SHA-1 partiel comporte au moins 4 caractÚres et ne correspond pas à plusieurs commits. Dans ces conditions, un seul objet correspondra à ce SHA-1 partiel.
Par exemple, pour afficher un commit précis, supposons que vous exécutiez git log
et que vous identifiiez le commit oĂč vous avez introduit une fonctionnalitĂ© prĂ©cise.
$ git log
commit 734713bc047d87bf7eac9674765ae793478c50d3
Author: Scott Chacon <schacon@gmail.com>
Date: Fri Jan 2 18:32:33 2009 -0800
fixed refs handling, added gc auto, updated tests
commit d921970aadf03b3cf0e71becdaab3147ba71cdef
Merge: 1c002dd... 35cfb2b...
Author: Scott Chacon <schacon@gmail.com>
Date: Thu Dec 11 15:08:43 2008 -0800
Merge commit 'phedders/rdocs'
commit 1c002dd4b536e7479fe34593e72e6c6c1819e53b
Author: Scott Chacon <schacon@gmail.com>
Date: Thu Dec 11 14:58:32 2008 -0800
added some blame and merge stuff
Pour cet exemple, choisissons 1c002ddâŠâ
.
Si vous affichez le contenu de ce commit via git show
, les commandes suivantes sont Ă©quivalentes (en partant du principe que les SHA-1 courts ne sont pas ambigus).
$ git show 1c002dd4b536e7479fe34593e72e6c6c1819e53b
$ git show 1c002dd4b536e7479f
$ git show 1c002d
Git peut dĂ©terminer une rĂ©fĂ©rence SHA-1 tout Ă la fois la plus courte possible et non ambigĂŒe.
Ajoutez lâoption --abbrev-commit
Ă la commande git log
et le résultat affiché utilisera des valeurs plus courtes mais uniques ; par défaut Git retiendra 7 caractÚres et augmentera au besoin :
$ git log --abbrev-commit --pretty=oneline
ca82a6d changed the version number
085bb3b removed unnecessary test code
a11bef0 first commit
En rĂšgle gĂ©nĂ©rale, entre 8 et 10 caractĂšres sont largement suffisants pour assurer lâunicitĂ© dans un projet. Par exemple, en fĂ©vrier 2019, le noyau Linux (qui est un projet plutĂŽt imposant) avait de plus de 875 000 commits et presque sept millions dâobjets dont les empreintes SHA sont uniques Ă partir des 12 premiers caractĂšres.
Note
|
Quelques mots sur SHA-1
Beaucoup de gens sâinquiĂštent quâĂ un moment donnĂ© ils auront, par des circonstances hasardeuses, deux objets dans leur rĂ©fĂ©rentiel de hachage de mĂȘme empreinte SHA-1. Quâen est-il rĂ©ellement ? Sâil vous arrivait de valider un objet qui se hache Ă la mĂȘme empreinte SHA-1 quâun objet existant dans votre rĂ©fĂ©rentiel, Git verrait lâobjet existant dĂ©jĂ dans votre base de donnĂ©es et prĂ©sumerait quâil Ă©tait dĂ©jĂ enregistrĂ©. Si vous essayez de rĂ©cupĂ©rer lâobjet de nouveau Ă un moment donnĂ©, vous auriez toujours les donnĂ©es du premier objet. Quoi quâil en soit, vous devriez ĂȘtre conscient Ă quel point ce scĂ©nario est ridiculement improbable.
Une empreinte SHA-1 porte sur 20 octets soit 160 bits.
Le nombre dâobjets alĂ©atoires Ă hacher requis pour assurer une probabilitĂ© de collision de 50 % vaut environ 280 (la formule pour calculer la probabilitĂ© de collision est Voici un exemple pour vous donner une idĂ©e de ce qui pourrait provoquer une collision du SHA-1. Si tous les 6,5 milliards dâhumains sur Terre programmaient et que chaque seconde, chacun produisait du code Ă©quivalent Ă lâhistorique entier du noyau Linux (6,5 millions dâobjets Git) et le poussait sur un Ă©norme dĂ©pĂŽt Git, cela prendrait 2 ans pour que ce dĂ©pĂŽt contienne assez dâobjets pour avoir une probabilitĂ© de 50 % quâune seule collision SHA-1 existe. Ainsi, une collision organique de SHA-1 est moins probable que tous les membres de votre Ă©quipe de programmeurs soient attaquĂ©s et tuĂ©s par des loups dans des incidents sans relation la mĂȘme nuit. Si vous y dĂ©diiez plusieurs milliers de dollars de puissance de calcul, il searit possible de synthĂ©tiser deux fichiers avec la mĂȘme empreinte, comme prouvĂ© par https://shattered.io/ en fĂ©vrier 2017. Git Ă©volue vers lâutilisation de SHA256 comme algorithme par dĂ©faut dâempreinte, qui est beaucoup plus rĂ©silient aux attaques par collision, et a dĂ©jĂ du code en place pour amenuiser cette attaque (bien quâil ne puisse pas totalement Ă©liminer cette faiblesse) |
Références de branches
La méthode la plus commune pour désigner un commit est une branche y pointant.
DĂšs lors, vous pouvez utiliser le nom de la branche dans toute commande utilisant un objet de type commit ou un SHA-1.
Par exemple, si vous souhaitez afficher le dernier commit dâune branche, les commandes suivantes sont Ă©quivalentes, en supposant que la branche sujet1
pointe sur ca82a6d
 :
$ git show ca82a6dff817ec66f44342007202690a93763949
$ git show sujet1
Pour connaĂźtre lâempreinte SHA sur laquelle pointe une branche ou pour savoir parmi tous les exemples prĂ©cĂ©dents ce que cela donne en terme de SHA, vous pouvez utiliser la commande de plomberie nommĂ©e rev-parse
.
RĂ©fĂ©rez-vous Ă Les tripes de Git pour plus dâinformations sur les commandes de plomberie ; rev-parse
sert aux opĂ©rations de bas niveau et nâest pas conçue pour ĂȘtre utilisĂ©e quotidiennement.
Quoi quâil en soit, elle se rĂ©vĂšle utile pour comprendre ce qui se passe.
Je vous invite Ă tester rev-parse
sur votre propre branche.
$ git rev-parse topic1
ca82a6dff817ec66f44342007202690a93763949
Raccourcis RefLog
Git maintient en arriĂšre-plan un historique des rĂ©fĂ©rences oĂč sont passĂ©s HEAD et vos branches sur les derniers mois â ceci sâappelle le reflog.
Vous pouvez le consulter avec la commande git reflog
 :
$ git reflog
734713b... HEAD@{0}: commit: fixed refs handling, added gc auto, updated
d921970... HEAD@{1}: merge phedders/rdocs: Merge made by recursive.
1c002dd... HEAD@{2}: commit: added some blame and merge stuff
1c36188... HEAD@{3}: rebase -i (squash): updating HEAD
95df984... HEAD@{4}: commit: # This is a combination of two commits.
1c36188... HEAD@{5}: rebase -i (squash): updating HEAD
7e05da5... HEAD@{6}: rebase -i (pick): updating HEAD
Ă chaque fois que lâextrĂ©mitĂ© de votre branche est modifiĂ©e, Git enregistre cette information pour vous dans son historique temporaire.
Vous pouvez rĂ©fĂ©rencer dâanciens commits avec cette donnĂ©e.
Si vous souhaitez consulter le n-iÚme antécédent de votre HEAD, vous pouvez utiliser la référence @{n}
du reflog, 5 dans cet exemple :
$ git show HEAD@{5}
Vous pouvez Ă©galement remonter le temps et savoir oĂč en Ă©tait une branche Ă une date donnĂ©e.
Par exemple, pour savoir oĂč en Ă©tait la branche master
hier (yesterday en anglais), tapez :
$ git show master@{yesterday}
Cette technique fonctionne uniquement si lâinformation est encore prĂ©sente dans le reflog et vous ne pourrez donc pas le consulter sur des commits plus vieux que quelques mois.
Pour consulter le reflog au format git log
, exécutez: git log -g
 :
$ git log -g master
commit 734713bc047d87bf7eac9674765ae793478c50d3
Reflog: master@{0} (Scott Chacon <schacon@gmail.com>)
Reflog message: commit: fixed refs handling, added gc auto, updated
Author: Scott Chacon <schacon@gmail.com>
Date: Fri Jan 2 18:32:33 2009 -0800
fixed refs handling, added gc auto, updated tests
commit d921970aadf03b3cf0e71becdaab3147ba71cdef
Reflog: master@{1} (Scott Chacon <schacon@gmail.com>)
Reflog message: merge phedders/rdocs: Merge made by recursive.
Author: Scott Chacon <schacon@gmail.com>
Date: Thu Dec 11 15:08:43 2008 -0800
Merge commit 'phedders/rdocs'
Veuillez noter que le reflog ne stocke que des informations locales, câest un historique de ce que vous avez fait dans votre dĂ©pĂŽt.
Les rĂ©fĂ©rences sont diffĂ©rentes pour un autre dĂ©pĂŽt et juste aprĂšs le clone dâun dĂ©pĂŽt, votre reflog sera vide puisque quâaucune activitĂ© nâaura Ă©tĂ© produite.
Exécuter git show HEAD@{2.months.ago}
ne fonctionnera que si vous avez dupliquĂ© ce projet depuis au moins 2 mois â si vous lâavez dupliquĂ© il y a 5 minutes, vous nâobtiendrez aucun rĂ©sultat.
Astuce
|
Pensez le reflog comme la version Git dâun historique shell
Si vous avez une culture UNIX ou Linux, vous pouvez penser le reflog comme la version Git dâun historique shell, ce qui implique que ce qui y est nâest clairement pertinent que pour vous et votre « session », et nâa rien Ă voir avec nâimporte qui dâautre qui pourrait travailler sur la mĂȘme machine. |
Note
|
Ăchapper les accolades dans PowerShell
Avec PowerShell, les accolades telles que
|
RĂ©fĂ©rences ancĂȘtres
Une solution frĂ©quente pour rĂ©fĂ©rencer un commit est dâutiliser son ascendance.
Si vous suffixez une référence par ^
, Git la résoudra comme étant le parent de cette référence.
Supposons que vous consultiez votre historique :
$ git log --pretty=format:'%h %s' --graph
* 734713b fixed refs handling, added gc auto, updated tests
* d921970 Merge commit 'phedders/rdocs'
|\
| * 35cfb2b Some rdoc changes
* | 1c002dd added some blame and merge stuff
|/
* 1c36188 ignore *.gem
* 9b29157 add open3_detach to gemspec file list
Alors, vous pouvez consulter le commit précédent en spécifiant HEAD^
, ce qui signifie « le parent de HEAD » :
$ git show HEAD^
commit d921970aadf03b3cf0e71becdaab3147ba71cdef
Merge: 1c002dd... 35cfb2b...
Author: Scott Chacon <schacon@gmail.com>
Date: Thu Dec 11 15:08:43 2008 -0800
Merge commit 'phedders/rdocs'
Note
|
Ăchapper l''accent circonflexe sous Windows
Sous Windows dans
|
Vous pouvez également spécifier un nombre aprÚs ^
â par exemple, d921970^2
signifie « le second parent de d921970 ».
Cette syntaxe ne sert que pour les commits de fusion, qui ont plus dâun parent.
Le premier parent est la branche depuis laquelle vous avez fusionné, et le second est le commit de la branche que vous avez fusionnée :
$ git show d921970^
commit 1c002dd4b536e7479fe34593e72e6c6c1819e53b
Author: Scott Chacon <schacon@gmail.com>
Date: Thu Dec 11 14:58:32 2008 -0800
added some blame and merge stuff
$ git show d921970^2
commit 35cfb2b795a55793d7cc56a6cc2060b4bb732548
Author: Paul Hedderly <paul+git@mjr.org>
Date: Wed Dec 10 22:22:03 2008 +0000
Some rdoc changes
Une autre solution courante pour spĂ©cifier une rĂ©fĂ©rence ancĂȘtre est le ~
.
Il fait également référence au premier parent, donc HEAD~
et HEAD^
sont Ă©quivalents.
La différence apparaßt si vous spécifiez un nombre.
HEAD~2
signifie « le premier parent du premier parent », ou bien « le grand-parent » ; on remonte les premiers parents autant de fois que demandé.
Par exemple, dans lâhistorique prĂ©cĂ©demment prĂ©sentĂ©, HEAD~3
serait :
$ git show HEAD~3
commit 1c3618887afb5fbcbea25b7c013f4e2114448b8d
Author: Tom Preston-Werner <tom@mojombo.com>
Date: Fri Nov 7 13:47:59 2008 -0500
ignore *.gem
Cela peut aussi sâĂ©crire HEAD^
, qui là encore est le premier parent du premier parent du premier parent :
$ git show HEAD^^^
commit 1c3618887afb5fbcbea25b7c013f4e2114448b8d
Author: Tom Preston-Werner <tom@mojombo.com>
Date: Fri Nov 7 13:47:59 2008 -0500
ignore *.gem
Vous pouvez Ă©galement combiner ces syntaxes â vous pouvez obtenir le second parent de la rĂ©fĂ©rence prĂ©cĂ©dente (en supposant que câĂ©tait un commit de fusion) en utilisant HEAD~3^2
, et ainsi de suite.
Plages de commits
Ă prĂ©sent que vous pouvez spĂ©cifier des commits individuels, voyons comment spĂ©cifier des plages de commits. Ceci est particuliĂšrement pratique pour la gestion des branches â si vous avez beaucoup de branches, vous pouvez utiliser les plages pour rĂ©pondre Ă des questions telles que « Quel travail sur cette branche nâai-je pas encore fusionnĂ© sur ma branche principale ? ».
Double point
La spĂ©cification de plage de commits la plus frĂ©quente est la syntaxe double-point. En gros, cela demande Ă Git de rĂ©soudre la plage des commits qui sont accessibles depuis un commit mais ne le sont pas depuis un autre. Par exemple, disons que votre historique ressemble Ă Exemple dâhistorique pour la sĂ©lection de plage..
Si vous voulez savoir ce qui nâa pas encore Ă©tĂ© fusionnĂ© sur votre branche master
depuis votre branche experiment
, vous pouvez demander Ă Git de vous montrer un journal des commits avec master..experiment
â ce qui signifie « tous les commits accessibles par experiment
qui ne le sont pas par master
 ».
Dans un souci de briĂšvetĂ© et de clartĂ© de ces exemples, je vais utiliser les lettres des commits issus du diagramme Ă la place de la vraie liste dans lâordre oĂč ils auraient dĂ» ĂȘtre affichĂ©s :
$ git log master..experiment
D
C
Si, par contre, vous souhaitez voir lâopposĂ© â tous les commits dans master
mais pas encore dans experiment
â vous pouvez inverser les noms de branches, experiment..master
vous montre tout ce que master
accÚde mais qu'`experiment` ne voit pas :
$ git log experiment..master
F
E
Câest pratique si vous souhaitez maintenir experiment
Ă jour et anticiper les fusions.
Un autre cas dâutilisation frĂ©quent consiste Ă voir ce que vous vous apprĂȘtez Ă pousser sur une branche distante :
$ git log origin/master..HEAD
Cette commande vous affiche tous les commits de votre branche courante qui ne sont pas sur la branche master
du dépÎt distant origin
.
Si vous exécutez git push
et que votre branche courante suit origin/master
, les commits listés par git log origin/master..HEAD
sont les commits qui seront transférés sur le serveur.
Vous pouvez Ă©galement laisser tomber une borne de la syntaxe pour faire comprendre Ă Git que vous parlez de HEAD.
Par exemple, vous pouvez obtenir les mĂȘmes rĂ©sultats que prĂ©cĂ©demment en tapant git log origin/master..
â Git utilise HEAD si une des bornes est manquante.
Emplacements multiples
La syntaxe double-point est pratique comme raccourci ; mais peut-ĂȘtre souhaitez-vous utiliser plus dâune branche pour spĂ©cifier une rĂ©vision, comme pour voir quels commits sont dans plusieurs branches mais sont absents de la branche courante.
Git vous permet cela avec ^
ou --not
en préfixe de toute référence de laquelle vous ne souhaitez pas voir les commits.
Les 3 commandes ci-aprÚs sont équivalentes :
$ git log refA..refB
$ git log ^refA refB
$ git log refB --not refA
Câest utile car cela vous permet de spĂ©cifier plus de 2 rĂ©fĂ©rences dans votre requĂȘte, ce que vous ne pouvez accomplir avec la syntaxe double-point.
Par exemple, si vous souhaitez voir les commits qui sont accessibles depuis refA
et refB
mais pas depuis refC
, vous pouvez taper ces 2 commandes :
$ git log refA refB ^refC
$ git log refA refB --not refC
Ceci vous fournit un systĂšme de requĂȘtage des rĂ©visions trĂšs puissant, pour vous aider Ă saisir ce qui se trouve sur vos branches.
Triple point
La derniĂšre syntaxe majeure de sĂ©lection de plage de commits est la syntaxe triple-point qui spĂ©cifie tous les commits accessibles par lâune des deux rĂ©fĂ©rences, exclusivement.
Toujours avec lâexemple dâhistorique de Exemple dâhistorique pour la sĂ©lection de plage., si vous voulez voir ce qui se trouve sur master
ou experiment
mais pas sur les deux, exécutez :
$ git log master...experiment
F
E
D
C
Encore une fois, cela vous donne un log
normal mais ne vous montre les informations que pour ces quatre commits, dans lâordre naturel des dates de validation.
Une option courante Ă utiliser avec la commande log
dans ce cas est --left-right
qui vous montre la borne de la plage Ă laquelle ce commit appartient.
Cela rend les données plus utiles :
$ git log --left-right master...experiment
< F
< E
> D
> C
Avec ces outils, vous pourrez spécifier à Git les commits que vous souhaitez inspecter.