Cours 3 Git
Cours 3 Git
Cours 3 Git
Git est un outil de versionnage de fichiers mais il a été conçu en ayant la collaboration à l'esprit.
Essentiellement, un dépôt distant Git est un autre "endroit" qui possède le même dépôt que celui que
vous avez sur votre ordinateur. Comme le montre l'image suivante, vous pouvez le considérer comme
différentes copies du même dépôt qui peuvent échanger des données entre elles.
Créez un nouveau dossier sur votre disque pour cloner notre dépôt "grocery", puis, clonez le dépôt
"grocery" en utilisant la commande "git clone" :
L’origine
Git utilise "origin" comme nom par défaut pour un dépôt distant.
Une branche locale sur laquelle travailler peut être créée en la vérifiant simplement :
Git indique qu'une branche locale a été configurée pour suivre la branche distante ; cela signifie que,
à partir de maintenant, Git suivra activement les différences entre la branche locale et la branche
distante, en vous notifiant les différences tout en vous fournissant des messages de sortie (par
exemple, lorsque vous utilisez la commande "git status").
Donc si vous effectuez un commit dans cette branche, vous pouvez l'envoyer au dépôt distant et il fera
partie de la branche distante "origin/berries".
Cela semble évident, mais dans Git, vous pouvez associer des branches comme vous le souhaitez ; par
exemple, vous pouvez suivre une branche distante "origin/foo" avec une branche locale "bar", si vous
le souhaitez. Alternativement, vous pouvez avoir des branches locales qui n'existent tout simplement
pas sur le dépôt distant. Plus tard, nous verrons comment travailler avec les branches distantes.
Maintenant, une branche verte "berries" apparaît juste à côté de la branche rouge "origin/berries".
Cela nous indique que la branche locale "berries" et la branche distante "origin/berries" pointent vers
le même commit.
Lorsque vous effectuez un commit, il est disponible uniquement localement ; si vous souhaitez le
partager avec une branche distante, vous devez l'envoyer en faisant un "push" (pousser).
Maintenant, nous allons essayer de pousser les modifications de la branche "berries" vers "origin" ; la
commande est "git push", suivie du nom du dépôt distant et de la branche cible :
Git nous indique où il envoie les objets, la destination, qui dans ce cas est simplement un autre dossier
sur mon ordinateur : vers C:/Repos/grocery. Il nous indique ensuite le hash du commit distant où se
trouvait origin/berries à l'origine, ainsi que le hash du nouveau commit, qui est le même que celui de
la branche locale berries, ca5b2c0..63a325c. Enfin, il donne le nom des deux branches, la branche
locale et la branche distante, berries -> berries.
Maintenant, nous voulons évidemment vérifier s'il y a un nouveau commit dans la branche berries du
dépôt distant ; donc, ouvrez le dossier "grocery" dans une nouvelle console et faites "git log" :
Nous allons faire l'expérience inverse : récupérer les mises à jour du dépôt distant et les appliquer à
notre copie locale.
Donc, effectuez un nouveau commit dans le dépôt "grocery", puis nous le téléchargerons dans la copie
"grocery-cloned" :
Nous pouvons récupérer des objets à partir d'un dépôt distant avec la commande "git pull".
En réalité, "git pull" est une commande composée ; en fait, c'est essentiellement la combinaison de
deux autres commandes Git, "git fetch" et "git merge".
Essayons d'abord "git pull", puis nous essaierons d'utiliser "git fetch" et "git merge" séparément.
Git dit que notre branche est à jour avec 'origin/master', mais ce n'est pas le cas. Cela est dû au fait
que, pour Git, la seule façon de savoir si nous sommes à jour par rapport à un dépôt distant est
d'effectuer un "git fetch".
Pour l'instant, utilisons "git pull" : la commande vous demande de spécifier le nom du dépôt distant à
partir duquel vous souhaitez effectuer la récupération, qui est "origin" dans ce cas, puis la branche que
vous souhaitez fusionner avec votre branche locale, qui est "master" :
Maintenant, essayons de faire ces étapes séparément ; créez un nouveau commit dans le dépôt
"grocery", sur la branche "master".
NB : Vous pouvez effectuer un "git fetch" dans n'importe quelle branche, car cela télécharge
simplement les objets distants ; il ne les fusionnera pas. En revanche, lors d'un "git pull", vous devez
vous assurer d'être dans la bonne branche cible locale.
Maintenant, synchronisons-nous avec un "git merge" ; pour fusionner une branche distante, nous
devons spécifier, en plus du nom de la branche, le nom du dépôt distant, comme nous l'avons fait dans
la commande "git pull" précédente :
Nous allons utiliser Github. Commencez par créer un nouveau compte Github : www.github.com.
Allez dans l'onglet "Repositories", cliquez sur le bouton vert "New" et choisissez un nom pour votre
dépôt, comme vous pouvez le voir dans la capture d'écran suivante :
Cloner le dépôt
Maintenant que nous avons un dépôt distant, il est temps de le relier localement. Pour cela, Git fournit
la commande git clone, comme nous l'avons déjà vu.
L'utilisation de cette commande est assez simple ; dans ce cas, tout ce que nous devons savoir est
l'URL du dépôt à cloner. L'URL est fournie par GitHub dans la partie inférieure droite de la page
d'accueil du dépôt :
Alors, essayons de modifier le fichier README.md et d’uploader les modifications vers GitHub :
3. Envoyez votre commit vers le dépôt distant en utilisant la commande git push.
Il s'agit du Gestionnaire d'informations d'identification Git ; il vous permet de définir des informations
d'identification sur votre machine Windows. Si vous êtes sur Linux ou macOS, la situation peut être
différente, mais le concept est le même : nous devons fournir à Git les informations d'identification
afin d'accéder au dépôt distant GitHub ; elles seront ensuite stockées sur notre système.
Saisissez vos informations d'identification, puis appuyez sur le bouton Connexion ; après cela, Git
continue avec :
La commande "git push" vous permet d’uploader le travail local vers un emplacement distant
configuré ; dans ce cas, un dépôt distant GitHub :
Évidemment, nous pouvons créer et pousser une nouvelle branche vers le dépôt distant pour rendre
notre travail public et visible aux autres collaborateurs ; par exemple, je vais créer une nouvelle
branche pour une nouvelle recette, puis je la pousserai vers le serveur distant GitHub. Suivez ces
étapes simples :
Créez une nouvelle branche, par exemple Mafe. Ajoutez-y un nouveau fichier, par exemple mafe-
senegal.md, et effectuez un commit.
Effectuez un push de la branche vers le dépôt distant en utilisant la commande git push -u origin Mafe.
Nous savons que "origin" est le nom par défaut du remote d'un dépôt, tout comme "master" ou "main"
est le nom par défaut de la branche. Lorsque vous clonez un dépôt à partir d'un remote, ce remote
devient votre alias "origin". Lorsque vous demandez à Git d'envoyer ou de récupérer quelque chose,
vous devez souvent lui indiquer le remote que vous souhaitez utiliser. En utilisant l'alias "origin", vous
indiquez à Git que vous souhaitez utiliser votre remote par défaut.
Si vous souhaitez voir les remotes réellement configurés dans votre dépôt, vous pouvez taper
simplement la commande "git remote", suivie de "-v" ("--verbose") pour obtenir plus de détails.
Dans les détails, vous verrez l'URL complète du remote et vous découvrirez que Git stocke deux URL
différentes :
• L'URL de récupération (Fetch URL), d'où nous obtenons les mises à jour des autres.
• L'URL de publication (Push URL), où nous envoyons nos mises à jour aux autres.
Vous pouvez ajouter, mettre à jour et supprimer des remotes en utilisant la commande "git remote".
En utilisant l'option -u, nous avons indiqué à Git de suivre la branche distante. Le suivi d'une branche
distante permet de lier votre branche locale avec la branche distante ; veuillez noter que ce
comportement n'est pas automatique, vous devez le configurer si vous le souhaitez. Lorsqu'une
branche locale suit une branche distante, vous avez en réalité une branche locale et une branche
distante qui peuvent être facilement synchronisées (veuillez noter qu'une branche locale ne peut
suivre qu'une seule branche distante). C'est très utile lorsque vous devez collaborer avec des collègues
distants sur la même branche, permettant à chacun de maintenir son travail synchronisé avec les
modifications des autres.
Pour mieux comprendre la configuration actuelle de notre dépôt, essayez de saisir "git remote show
origin".
Comme vous pouvez le voir, les branches Mafe et main sont toutes suivies. Vous voyez également que
vos branches locales sont configurées pour pusher et récupérer les branches distantes portant le
même nom. Cependant, il n'est pas obligatoire d'avoir des branches locales et distantes avec le même
nom. Une branche locale "foo" peut suivre la branche distante "bar", et vice versa, sans aucune
restriction.
Il peut arriver que vous ayez besoin de mettre votre dépôt local dans un endroit partagé où d'autres
personnes pourront consulter votre travail. Nous allons essayer de mettre en œuvre ce mécanisme.
Pour publier notre dépôt HelloWorld, il nous suffit d'ajouter son premier remote. Ajouter un remote
est assez simple : `git remote add origin <URL-du-dépôt-distant>`.
L'ajout du remote "origin" permet à votre dépôt local de communiquer avec le dépôt distant spécifié,
facilitant ainsi le partage et la synchronisation des commits et des branches entre les deux. Vous
pouvez ensuite utiliser des commandes telles que git push pour envoyer vos modifications vers le
remote "origin" et git pull pour récupérer les dernières mises à jour du dépôt distant.
Après cela, pushez vos modifications locales vers le dépôt distant en utilisant la commande `git push
-u origin master`.
GitHub a facilité le partage de code, le suivi du travail d'autres personnes et la collaboration en utilisant
deux concepts fondamentaux : les forks (dérivations) et les pull requests (demandes de fusion).
Dériver un fork
Lorsque vous effectuez un fork sur GitHub, vous obtenez essentiellement un clone côté serveur du
dépôt sur votre compte GitHub ; si vous clonez votre dépôt forké localement, dans la liste des remotes,
vous trouverez un "origin" qui pointe vers votre dépôt de compte, tandis que le dépôt d'origine
prendra l'alias "upstream" (vous devez l'ajouter manuellement) :
Allez sur votre compte GitHub et essayez de fork un dépôt GitHub courant appelé Spoon-Knife, créé
par l'utilisateur mascotte de GitHub, octocat. Voici les étapes à suivre :
Comme vous pouvez le voir, le remote "upstream" n'est pas présent, vous devez l'ajouter
manuellement ; pour l'ajouter, utilisez la commande `git remote add` :
Maintenant, vous pouvez maintenir votre dépôt local synchronisé avec les modifications de votre
remote, "origin", et vous pouvez également récupérer celles provenant du remote "upstream", le
dépôt original que vous avez forké. À ce stade, vous vous demandez probablement comment gérer
deux remotes différents ; eh bien, c'est facile : il suffit de récupérer les modifications du remote
Si vous avez créé un fork d'un dépôt, c'est parce que vous n'êtes pas directement contributeur du
projet original, ou simplement parce que vous ne voulez pas perturber le travail des autres avant de
vous familiariser avec le code.
Cependant, à un certain moment, vous réalisez que votre travail peut être utile même pour le projet
original : vous avez réalisé une meilleure implémentation d'une partie de code existante, ajouté une
fonctionnalité manquante, etc.
Ainsi, vous vous retrouvez dans la situation où vous devez informer l'auteur original que vous avez
réalisé quelque chose d'intéressant, lui demandant s'il souhaite jeter un coup d'œil et éventuellement
intégrer votre travail. C'est à ce moment-là que les pull requests sont utiles.
Une pull request est une manière de dire à l'auteur original : "J'ai réalisé quelque chose d'intéressant
en utilisant votre code original, voulez-vous jeter un coup d'œil et intégrer mon travail ?". Cela ne
représente pas seulement une manière technique d'intégrer le travail, mais c'est également une
pratique puissante pour favoriser les révisions de code comme le recommandent les adeptes de l'XP.
Une autre raison d'utiliser une pull request est que vous ne pouvez pas pusher directement vers le
dépôt "upstream" si vous n'êtes pas contributeur du projet original : les pull requests sont le seul
moyen. Dans de petits scénarios (comme une équipe de deux ou trois développeurs travaillant dans
la même pièce), le modèle de fork et de fusion peut représenter une surcharge, il est donc plus courant
de partager directement le dépôt original avec tous les contributeurs.
Pour créer une demande de fusion, vous devez vous rendre sur votre compte GitHub et la créer
directement à partir de votre compte fork ; mais avant cela, vous devez savoir que les demandes de
fusion ne peuvent être créées que à partir de branches distinctes.
Pour faire une tentative, créons une nouvelle branche locale "TeaSpoon" dans notre dépôt, ajoutons
un nouveau fichier, et poussons-le vers notre compte GitHub :
Avec les collaborateurs du projet, pouvez commencer à discuter de votre travail. Vous pouvez modifier
le code, jusqu'à ce qu'un collaborateur du référentiel d'origine décide d'accepter votre demande ou de
la rejeter, en fermant la pull request.
Résumé
Dans ce lab, nous avons exploré la capacité de Git à gérer plusieurs copies distantes de référentiels.
Cela vous offre une large gamme de possibilités pour mieux organiser votre flux de travail collaboratif
au sein de votre équipe.