Plan de la séance:
Démo (par le prof dans un terminal)
La boucle de travail de base est:
Commit
= créez une copie dans le dépôt GIT avec un message de documentationEn anglais: repository.
Ce sont les données du système de contrôle de version, c'est à dire au moins toutes les versions de tous les fichiers (ou un moyen de les reconstituer). C'est aussi toutes les informations d'auteur, de temps, de dépendance, de branches...
Un dépôt GIT peut être assez gros.
Un commit
décrit une version comme un ensemble de changements sur au moins un fichier. Un commit peut contenir beaucoup de changements sur beaucoup de fichiers, des changements de texte, de permission, de nom, de dossier... Un commit est identifié avec un code de hashage (SHA-1).
Un commit a aussi un message le décrivant, et il est important de mettre un message le plus clair et simple et cohérent possible.
La copie de travail, c'est une copie de la version courante du dépôt que vous pouvez éditer et modifier. La version courante est celle marquée "HEAD".
Vous ne pouvez pas changer la version de travail si votre copie de travail est modifiée
Si votre copie de travail est modifiée, c'est à dire différente de la version courante dans git, alors vous pouvez:
commit
stash
sauver vos changements dans la pile de stash et revenir à la version courante dans gitSi votre copie de travail n'est pas modifiée, alors vous pouvez:
L'état de la copie de travail est affiché par git status
Pour vous faciliter la vie, faites, dans un terminal:
git config --global core.pager ''
git config --global core.editor nano
git config --global user.name "votre nom"
git config --global user.email "votre@email"
La première ligne concerne git log
. git log
utilise par défaut un éditeur simplifié nommé "less", et cela force à taper q
pour sortir de l'affichage d'une liste de commits.
La deuxième ligne concerne git commit
. Si vous n'utilisez pas l'option -m
, alors git commit
lance l'antique éditeur de texte vi
. nano
est un peu plus moderne et facile à utiliser.
Les deux dernières lignes simplifient les messages affichés par commit.
Cette commande crée un dépot local dans le dossier courant.
Si tout va bien, il n'y a pas de message. Tout message signale une erreur et doit être lu.
Cette commande donne des informations sur l'état du dépot git dans le dossier courant:
Cette commande permet d'ajouter un fichier ou tous les fichiers d'un dossier dans l'index.
git add src/tp01/Main.java
ajoute src/tp01/Main.java à l'index, c'est à dire au prochain commit.
git add src
ajoute tous les fichiers dans le dossier src à l'index.
Si tout va bien, il n'y a pas de message. Tout message signale une erreur et doit être lu.
Cette commande crée un commit à partir de tous les fichiers placés dans l'index.
git commit
crée un commit et ouvre un éditeur de texte pour vous forcer à écrire un message de commit.
git commit -m "message"
crée un commit avec le message donné.
Si tout va bien, il n'y a pas de message. Tout message signale une erreur et doit être lu.
Cette commande affiche des informations sur les précédents commits.
git log
affiche tous les commits
git log --stat
affiche tous les commits y compris les informations sur les fichiers inclus dans chaque commit.
Créer un nouveau dépôt:
|
![]() |
git init
git status
git add file
git add file
git log
git commit -m "message"
git status
et les fichiers du stage sont en vert=> demo de comment tout ça marche en pratique
Pour échanger avec d'autres personnes/machines, you avez besoin d'accéder à leur dépôt et eux ont besoin d'accéder au vôtre (ou à une copie).
GIT vous permet de transférer tout ou partie d'un dépôt vers un autre dépôt.
Un dépôt Git peut être placé dans un serveur Git: il a alors une URL d'accès.
Télécharger un logiciel libre et l'adapter:
git clone URL
pour créer un dépôt local depuis le dépôt distant dans URLgit checkout BRANCH
pour mettre dans la copie de travail la branche qui vous concernegit add
, git commit
git push
pour envoyer les changements sur le dépôt distantLa boucle de travail plus large est:
Pull
récupérez les changements du dépôt distant (par ex: de vos collègues)commit
, etc... (c'est la boucle initiale)Push
envoyez les nouveaux commits dans le dépôt distantgit remote add distant URL
pour ajouter URL comme dépôt distantgit push --set-upstream distant master
pour connecter la branche locale master avec la branche distante master et envoyer l'informationgit clone URL
git push
git pull
récupère ce qui a été poussé et fait la fusion si nécessairegit commit
git init
, il n'a pas de "remote"
git remote add distant URL
git push --set-upstream distant master
git clone
, un lien vers le dépôt distant existe avec le nom "origin"git push
envoie l'état de la branche courante vers le premier dépôt distantgit push remoteName
envoie l'état de la branche courante vers le dépôt distant nommé remoteNamegit fetch
est l'opposé de git push, il recopie l'information de la branche distante dans la branche locale; la copie de travail n'est pas modifiéegit pull
est la combinaison de git fetch
et git merge
Prenons un exemple:
public class Toto {
public Toto() {}
}
Ce fichier est dans la copie de travail chez vous et au travail.
Vous ajoutez un paramètre au constructeur chez vous :
public class Toto {
public Toto(int i) {}
}
Vous faites commit, puis push, puis vous travaillez sur autre chose pendant une semaine.
Vous êtes maintenant au travail. Vous refaites la même chose, mais un peu différemment:
public class Toto {
public Toto(int var) {}
}
Vous faites commit et push. GIT répond que votre dépôt local est en retard sur le dépôt distant. Ce retard est du à la modification poussée la semaine dernière. Comme le suggère GIT, vous faites git pull
. Conflit!
Voici le contenu de votre fichier:
public class Toto {
<<<<<<< HEAD
public Toto(int var) {}
=======
public Toto(int i) {}
>>>>>>> other
}
GIT a reconnu les parties identiques, et vous montre les deux versions des parties différentes.
Pour résoudre les conflits, vous devez:
git add
et git commit
git clone URL
*.class
= ne pas suivre les fichiers avec extension .classbin/
= ne pas suivre le dossier binfile.txt
= ne pas suivre le fichier file.txt, même si c'est du texteCette ressource en anglais est une référence, très complète et d'accès ardu: git-scm.org
.ssh
, créez le s'il n'existe passsh-keygen -t ed25519
et répondez aux questions.ssh
, créez ou éditez le fichier config
et ajoutez les lignes indiquées plus basAjout dans le fichier config:
Host gitlab.enst.fr
PreferredAuthentications publickey
IdentityFile ~/.ssh/<le nom de votre clef privée>
IdentitiesOnly yes
Testez la connexion sécurisée à Gitlab en faisant une opération git clone ou push ou pull sur un dépôt non public depuis la ligne de commande : il ne vous demandera plus votre mot de passe pour vous connecter à Gitlab
Si vous devez travailler avec plusieurs ordinateurs, il peut falloir faire cette operation sur chacun. Les ordinateurs de l'école partagent tous votre dossier racine, donc le faire sur un seul suffit. Par contre, il faudra le refaire sur votre ordinateur portable.
Il vaut mieux avoir une paire de clefs SSH différente sur chaque ordinateur. Si vous voulez utiliser la même clef, recopiez la clef privée et le fichier config, dans le dossier .ssh
du nouvel ordinateur.
Demo
Clonez le dépôt: git@gitlab.enst.fr:slr201-git-adv/learning-merge.git
Il y a deux branches à merger dans master. Aucune des deux branches ne permet un merge automatique.
Demo
Gitlab, dans sa version Telecom Paris, ne vous permet pas de créer des dépôts sauf dans des groupes qu'un enseignant a créé. Pour créer un dépôt en dehors de tout groupe, faites un ticket.
Vous pouvez créer un dépôt dans le groupe Gitlab correspondant à votre groupe de TP INF103: https://gitlab.telecom-paris.fr/2021INF103/gr5tp
Demo
J'utilise des images CC3 BY-NC-SA de:
Les autres cours de cette série sont:
Ce cours a été conçu par Jean-Claude Dufourd et James Eagan, et mis à disposition en Creative Commons 3, BY-NC-SA (attribution, non commercial, partage à l'identique)