-
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
3.1 Les branches avec Git - Les branches en bref
Presque tous les VCS proposent une certaine forme de gestion de branches. CrĂ©er une branche signifie diverger de la ligne principale de dĂ©veloppement et continuer Ă travailler sans impacter cette ligne. Pour de nombreux VCS, il sâagit dâun processus coĂ»teux qui nĂ©cessite souvent la crĂ©ation dâune nouvelle copie du rĂ©pertoire de travail, ce qui peut prendre longtemps dans le cas de gros projets.
Certaines personnes considĂšrent le modĂšle de gestion de branches de Git comme ce quâil a de plus remarquable et il offre sĂ»rement Ă Git une place Ă part au sein de la communautĂ© des VCS. En quoi est-il si spĂ©cial ? La maniĂšre dont Git gĂšre les branches est incroyablement lĂ©gĂšre et permet de rĂ©aliser les opĂ©rations sur les branches de maniĂšre quasi instantanĂ©e et, gĂ©nĂ©ralement, de basculer entre les branches aussi rapidement. Ă la diffĂ©rence de nombreux autres VCS, Git encourage des mĂ©thodes qui privilĂ©gient la crĂ©ation et la fusion frĂ©quentes de branches, jusquâĂ plusieurs fois par jour. Bien comprendre et maĂźtriser cette fonctionnalitĂ© vous permettra de faire de Git un outil puissant et unique et peut totalement changer votre maniĂšre de dĂ©velopper.
Les branches en bref
Pour réellement comprendre la maniÚre dont Git gÚre les branches, nous devons revenir en arriÚre et examiner de plus prÚs comment Git stocke ses données.
Si vous vous souvenez bien du chapitre DĂ©marrage rapide, Git ne stocke pas ses donnĂ©es comme une sĂ©rie de modifications ou de diffĂ©rences successives mais plutĂŽt comme une sĂ©rie dâinstantanĂ©s (appelĂ©s snapshots).
Lorsque vous faites un commit, Git stocke un objet commit qui contient un pointeur vers lâinstantanĂ© (snapshot) du contenu que vous avez indexĂ©. Cet objet contient Ă©galement les noms et prĂ©noms de lâauteur, le message que vous avez renseignĂ© ainsi que des pointeurs vers le ou les commits qui prĂ©cĂšdent directement ce commit : aucun parent pour le commit initial, un parent pour un commit normal et de multiples parents pour un commit qui rĂ©sulte de la fusion dâune ou plusieurs branches.
Pour visualiser ce concept, supposons que vous avez un rĂ©pertoire contenant trois fichiers que vous indexez puis validez. Lâindexation des fichiers calcule une empreinte (checksum) pour chacun (via la fonction de hachage SHA-1 mentionnĂ©e au chapitre DĂ©marrage rapide), stocke cette version du fichier dans le dĂ©pĂŽt Git (Git les nomme blobs) et ajoute cette empreinte Ă la zone dâindex (staging area) :
$ git add README test.rb LICENSE
$ git commit -m 'initial commit of my project'
Lorsque vous créez le commit en lançant la commande git commit
, Git calcule lâempreinte de chaque sous-rĂ©pertoire (ici, seulement pour le rĂ©pertoire racine) et stocke ces objets de type arbre dans le dĂ©pĂŽt Git.
Git crĂ©e alors un objet commit qui contient les mĂ©ta-donnĂ©es et un pointeur vers lâarbre de la racine du projet de maniĂšre Ă pouvoir recrĂ©er lâinstantanĂ© Ă tout moment.
Votre dĂ©pĂŽt Git contient Ă prĂ©sent cinq objets : un blob pour le contenu de chacun de vos trois fichiers, un arbre (tree) qui liste le contenu du rĂ©pertoire et spĂ©cifie quels noms de fichiers sont attachĂ©s Ă quels blobs et enfin un objet commit portant le pointeur vers lâarbre de la racine ainsi que toutes les mĂ©ta-donnĂ©es attachĂ©es au commit.
Si vous faites des modifications et validez à nouveau, le prochain commit stocke un pointeur vers le commit le précédant immédiatement.
Une branche dans Git est simplement un pointeur léger et déplaçable vers un de ces commits.
La branche par dĂ©faut dans Git sâappelle master
.
Au fur et Ă mesure des validations, la branche master
pointe vers le dernier des commits réalisés.
Ă chaque validation, le pointeur de la branche master
avance automatiquement.
Note
|
La branche |
Créer une nouvelle branche
Que se passe-t-il si vous créez une nouvelle branche ?
Eh bien, cela crée un nouveau pointeur pour vous.
Supposons que vous créez une nouvelle branche nommée test
.
Vous utilisez pour cela la commande git branch
 :
$ git branch testing
Cela crée un nouveau pointeur vers le commit courant.
Comment Git connaßt-il alors la branche sur laquelle vous vous trouvez ?
Il conserve à cet effet un pointeur spécial appelé HEAD
.
Vous remarquez que sous cette appellation se cache un concept trÚs différent de celui utilisé dans les autres VCS tels que Subversion ou CVS.
Dans Git, il sâagit simplement dâun pointeur sur la branche locale oĂč vous vous trouvez.
Dans ce cas, vous vous trouvez toujours sur master
.
En effet, la commande git branch
nâa fait que crĂ©er une nouvelle branche â elle nâa pas fait basculer la copie de travail vers cette branche.
Vous pouvez vérifier cela facilement grùce à la commande git log
qui vous montre vers quoi les branches pointent.
Il sâagit de lâoption --decorate
.
$ git log --oneline --decorate
f30ab (HEAD, master, test) add feature #32 - ability to add new
34ac2 fixed bug #ch1328 - stack overflow under certain conditions
98ca9 initial commit of my project
Vous pouvez voir les branches master
et test
qui se situent au niveau du commit f30ab
.
Basculer entre les branches
Pour basculer sur une branche existante, il suffit de lancer la commande git checkout
.
Basculons sur la nouvelle branche testing
 :
$ git checkout testing
Cela déplace HEAD
pour le faire pointer vers la branche testing
.
Quâest-ce que cela signifie ? Et bien, faisons une autre validation :
$ vim test.rb
$ git commit -a -m 'made a change'
Câest intĂ©ressant parce quâĂ prĂ©sent, votre branche testing
a avancé tandis que la branche master
pointe toujours sur le commit sur lequel vous étiez lorsque vous avez lancé la commande git checkout
pour changer de branche.
Retournons sur la branche master
 :
$ git checkout master
Note
|
git log ne montre pas toutes les branches tout le tempsSi vous alliez lancer La branche nâa pas disparu ; Git ne sait juste pas que cette branche vous intĂ©resse et il essaie de vous montrer ce quâil pense ĂȘtre le plus pertinent.
Autrement dit, par dĂ©faut, Pour montrer lâhistorique des commites de la branche dĂ©sirĂ©e, vous devez la spĂ©cifier explicitement : |
Cette commande a réalisé deux actions.
Elle a remis le pointeur HEAD
sur la branche master
et elle a replacĂ© les fichiers de votre rĂ©pertoire de travail dans lâĂ©tat du snapshot pointĂ© par master
.
Cela signifie aussi que les modifications que vous rĂ©alisez Ă partir de ce point divergeront de lâancienne version du projet.
Cette commande annule les modifications réalisées dans la branche testing
pour vous permettre de repartir dans une autre direction.
Note
|
Changer de branche modifie les fichiers dans votre répertoire de travail
Il est important de noter que lorsque vous changez de branche avec Git, les fichiers de votre rĂ©pertoire de travail sont modifiĂ©s. Si vous basculez vers une branche plus ancienne, votre rĂ©pertoire de travail sera remis dans lâĂ©tat dans lequel il Ă©tait lors du dernier commit sur cette branche. Si git nâest pas en mesure dâeffectuer cette action proprement, il ne vous laissera pas changer de branche. |
Réalisons quelques autres modifications et validons à nouveau :
$ vim test.rb
$ git commit -a -m 'made other changes'
Maintenant, lâhistorique du projet a divergĂ© (voir Divergence dâhistorique).
Vous avez crĂ©Ă© une branche et basculĂ© dessus, y avez rĂ©alisĂ© des modifications, puis vous avez rebasculĂ© sur la branche principale et rĂ©alisĂ© dâautres modifications.
Ces deux modifications sont isolĂ©es dans des branches sĂ©parĂ©es : vous pouvez basculer dâune branche Ă lâautre et les fusionner quand vous ĂȘtes prĂȘt.
Et vous avez fait tout ceci avec de simples commandes : branch
, checkout
et commit
.
Vous pouvez Ă©galement voir ceci grĂące Ă la commande git log
.
La commande git log --oneline --decorate --graph --all
va afficher lâhistorique de vos commits, affichant les endroits oĂč sont positionnĂ©s vos pointeurs de branche ainsi que la maniĂšre dont votre historique a divergĂ©.
$ git log --oneline --decorate --graph --all
* c2b9e (HEAD, master) made other changes
| * 87ab2 (test) made a change
|/
* f30ab add feature #32 - ability to add new formats to the
* 34ac2 fixed bug #ch1328 - stack overflow under certain conditions
* 98ca9 initial commit of my project
Parce quâune branche Git nâest en fait quâun simple fichier contenant les 40 caractĂšres de lâempreinte SHA-1 du commit sur lequel elle pointe, les branches ne coĂ»tent quasiment rien Ă crĂ©er et Ă dĂ©truire. CrĂ©er une branche est aussi simple et rapide quâĂ©crire 41 caractĂšres dans un fichier (40 caractĂšres plus un retour chariot).
Câest une diffĂ©rence de taille avec la maniĂšre dont la plupart des VCS gĂšrent les branches, qui implique de copier tous les fichiers du projet dans un second rĂ©pertoire. Cela peut durer plusieurs secondes ou mĂȘme quelques minutes selon la taille du projet, alors que pour Git, le processus est toujours instantanĂ©. De plus, comme nous enregistrons les parents quand nous validons les modifications, la dĂ©termination de lâancĂȘtre commun appropriĂ© pour la fusion est rĂ©alisĂ©e automatiquement pour nous et est gĂ©nĂ©ralement une opĂ©ration trĂšs facile. Ces fonctionnalitĂ©s encouragent naturellement les dĂ©veloppeurs Ă crĂ©er et utiliser souvent des branches.
Voyons pourquoi vous devriez en faire autant.
Note
|
CrĂ©er une branche et basculer dessus en mĂȘme temps
Il est habituel de crĂ©er une nouvelle branche et de vouloir basculer sur cette nouvelle branche en mĂȘme tempsâââça peut ĂȘtre rĂ©alisĂ© en une seule opĂ©ration avec |
Note
|
Depuis Git version 2.23, on peut utiliser
|