-
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
10.5 Les tripes de Git - La refspec
La refspec
Tout au long de ce livre, nous avons utilisĂ© des associations simples entre les branches distantes et les rĂ©fĂ©rences locales. Elles peuvent ĂȘtre plus complexes. Supposons que vous ajoutiez un dĂ©pĂŽt distant comme ceci :
$ git remote add origin https://github.com/schacon/simplegit-progit
Cela ajoute une section au fichier .git/config
, contenant le nom du dépÎt distant (origin
), lâURL de ce dĂ©pĂŽt et la refspec pour la rĂ©cupĂ©ration :
[remote "origin"]
url = https://github.com/schacon/simplegit-progit
fetch = +refs/heads/*:refs/remotes/origin/*
Le format de la refspec est un +
facultatif, suivi de <src>:<dst>
, oĂč <src>
est le motif des références du cÎté distant et <dst>
est lâemplacement local oĂč les rĂ©fĂ©rences seront enregistrĂ©es.
Le +
prĂ©cise Ă Git de mettre Ă jour la rĂ©fĂ©rence mĂȘme si ce nâest pas une avance rapide.
Dans le cas par dĂ©faut, qui est celui dâun enregistrement automatique par la commande git remote add origin
, Git récupÚre toutes les références de refs/heads/
sur le serveur et les enregistre localement dans refs/remotes/origin/
.
Ainsi, sâil y a une branche master
sur le serveur, vous pouvez accĂ©der localement Ă lâhistorique de cette branche via :
$ git log origin/master
$ git log remotes/origin/master
$ git log refs/remotes/origin/master
Ces syntaxes sont toutes équivalentes, car Git les développe en refs/remotes/origin/master
.
Si vous préférez que Git récupÚre seulement la branche master
et non chacune des branches du serveur distant, vous pouvez remplacer la ligne fetch par :
fetch = +refs/heads/master:refs/remotes/origin/master
Câest la refspec par dĂ©faut de git fetch
pour ce dépÎt distant.
Si lâon veut effectuer une action particuliĂšre une seule fois, la refspec peut aussi ĂȘtre prĂ©cisĂ©e en ligne de commande.
Pour tirer la branche master
du dépÎt distant vers la branche locale origin/mymaster
, vous pouvez exécuter :
$ git fetch origin master:refs/remotes/origin/mymaster
Vous pouvez indiquer plusieurs refspecs. En ligne de commande, vous pouvez tirer plusieurs branches de cette façon :
$ git fetch origin master:refs/remotes/origin/mymaster \
topic:refs/remotes/origin/topic
From git@github.com:schacon/simplegit
! [rejected] master -> origin/mymaster (non fast forward)
* [new branch] topic -> origin/topic
Dans ce cas, la récupération (pull) de la branche master
a Ă©tĂ© refusĂ©e car ce nâĂ©tait pas une avance rapide.
On peut surcharger ce comportement en précisant un +
devant la refspec.
On peut aussi indiquer plusieurs refspecs pour la récupération, dans le fichier de configuration.
Si vous voulez toujours récupérer les branches master
et experiment
, ajoutez ces deux lignes :
[remote "origin"]
url = https://github.com/schacon/simplegit-progit
fetch = +refs/heads/master:refs/remotes/origin/master
fetch = +refs/heads/experiment:refs/remotes/origin/experiment
Vous ne pouvez pas utiliser des jokers partiels, ce qui suit est donc invalide :
fetch = +refs/heads/qa*:refs/remotes/origin/qa*
On peut toutefois utiliser des espaces de noms (namespaces) ou des répertoires pour accomplir cela.
Sâil existe une Ă©quipe qualitĂ© (QA) qui publie une sĂ©rie de branches et que lâon veut la branche master
, les branches de lâĂ©quipe qualitĂ© et rien dâautre, on peut utiliser la configuration suivante :
[remote "origin"]
url = https://github.com/schacon/simplegit-progit
fetch = +refs/heads/master:refs/remotes/origin/master
fetch = +refs/heads/qa/*:refs/remotes/origin/qa/*
Si vous utilisez des processus complexes impliquant une équipe qualité, des développeurs et des intégrateurs qui publient des branches et qui collaborent sur des branches distantes, vous pouvez facilement utiliser des espaces de noms de cette façon.
Pousser des refspecs
Il est pratique de pouvoir rĂ©cupĂ©rer des rĂ©fĂ©rences issues dâespace de nom de cette façon, mais comment lâĂ©quipe qualitĂ© insĂšre-t-elle ces branches dans lâespace de nom qa/
en premier lieu ?
On peut accomplir cela en utilisant les spécifications de références pour la publication.
Si lâĂ©quipe qualitĂ© veut publier sa branche master
vers qa/master
sur le serveur distant, elle peut exécuter :
$ git push origin master:refs/heads/qa/master
Si elle veut que Git le fasse automatiquement à chaque exécution de git push origin
, elle peut ajouter une entrée push
au fichier de configuration :
[remote "origin"]
url = https://github.com/schacon/simplegit-progit
fetch = +refs/heads/*:refs/remotes/origin/*
push = refs/heads/master:refs/heads/qa/master
De mĂȘme, cela fera que, par dĂ©faut, git push origin
publiera la branche locale master
sur la branche distante qa/master
.
Note
|
Vous ne pouvez pas utiliser la refspec pour récupérer les modifications depuis un dépÎt et pousser sur un autre. Pour voir un exemple de comment faire cela, référez-vous à Garder votre dépÎt GitHub public à jour. |
Supprimer des références
Vous pouvez aussi utiliser les refspecs pour supprimer des références sur le serveur distant en exécutant une commande comme :
$ git push origin :topic
La refspec ressemble Ă <src>:<dst>
, mais en laissant vide la partie <src>
, cela signifie une création de la branche à partir de rien et donc sa suppression.
Ou vous pouvez utiliser la nouvelle syntaxe (disponible depuis Git v1.7.0)Â :
$ git push origin --delete topic