-
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
|