Un système de gestion de version (« version control system » en anglais) est un programme permettant à plusieurs personnes de travailler en commun sur un projet. Il permet surtout de maintenir un historique complet des changements dans le projet ainsi que différentes versions vers lesquelles il est possible de revenir. Ainsi, il est utile d'y avoir recours même si l'on travaille seul.e.
Pour pouvoir travailler avec git, il faut que l'outil git soit installé sur la machine utilisée. C'est le cas des VMs de L'EPFL (en connexion à distance) ou sur les machines des salles de TP. Sinon, voir : https://git-scm.com/book/en/v2/Getting-Started-Installing-Git.
Nous supposons dans ce qui suit qu'Alice et Bob travaillent sur un projet commun et qu'Alice possède quelque part chez elle un répertoire, par exemple [chemin_vers_le_projet]/MP1-2023/, contenant déjà du code du projet.
Voici les manipulations que doit faire Alice (seulement elle et une seule fois) pour initialiser le projet avec git:
Dans les messages qui apparaîssent en haut de la fenêtre : "You won't be able to pull or push project code via HTTPS until you set a password on your account" Cliquer sur "set a password" et introduire un mot de passe de votre choix
Alice doit ensuite importer le contenu de [chemin_vers_le_projet]/MP1-2023/ dans ce dépôt. Pour cela, elle doit taper les commandes suivantes dans une invite de commande/terminal :
cd [chemin_vers_le_projet]/MP1-2023/ git init git add . git config --global user.email "‹your mail>" git config --global user.name "‹your name>" git commit -m "Initial import" git remote add origin https://gitlab.epfl.ch/alice/cs107-2023-alice-et-bob.git git push -u origin master
Taper ces commandes dans un terminal ou une invite de commande en remplaçant https://...cs107i-2023-bob-et-alice.git par l'adresse exacte associée à votre dépôt, et ne pas oublier le point à la fin de git add .
La dernière commande exigera de vous de taper le mot de passe que vous avez précédemment créé (utilisez votre user name gaspar).
Pour vérifier que tout est en ordre, Alice peut taper dans le terminal :
git status .et devrait obtenir :
On branch master Your branch is up to date with 'origin/master'. nothing to commit, working tree clean
Le projet est alors configuré avec git.
Alice doit finalement donner le droit de contribution à Bob.
Dans la page https://gitlab.epfl.ch/.../cs107-2023-alice-et-bob/, sur le bandeau de gauche, cliquer sur Settings > General > Manage > members, puis:
Le partenaire de travail d'Alice peut maintenant récupérer une copie du projet git chez lui. Pour cela, il lui suffit de se placer dans un répertoire choisi sur sa machine et récupérer le contenu du dépôt en tapant les commandes suivantes dans un terminal ou une invite de commande :
cd chemin_vers_le_repertoire_choisi git clone https://gitlab.gnugen.ch/.../cs107-2023-alice-et-bob.git(ne pas oublier de remplacer par l'adresse exacte chez vous)
À faire SYSTÉMATIQUEMENT à chaque fois que vous décidez de recommencer à travailler sur le projet :
git pullqui récupère les modifications faites par l'autre. Supposons que vous ayez ensuite modifié un fichier existant Main.java et que vous avez terminé et relu vos modifications:
git pull git add Main.java git commit -m "commentaire explicatif sur la modification\ (par exemple : ajouté un test sur la méthode getXthBit)" Main.java(on peut omettre le nom du fichier si on a modifié plusieurs fichiers pour un patch) puis
git pushqui permet de pousser/publier les modifications sur le dépôt commun. L'autre personne peut à ce moment récupérer les modifications au moyen d'un git pull)
Si on veut supprimer un fichier
git rm nom_de fichierou si on veut déplacer un fichier ou un dossier:
git mv nom_de_fichier_ou_dossier nouveau_nom_ou_repertoire_destination.
Si l'on a fait des modifications dans un fichier que l'on n'a pas encore ajouté au moyen de la commande git add, il est possible de les annuler avec :
git checkout nomDuFichierou
git checkoutqui annule toutes les modifications (non ajoutées) sur tous les fichiers.
Le dernier point est particulièrement important. Afin d'éviter des conflits sur les fichiers exécutables ou issus de la compilation, il est préférable de les exclure de git. Pour ce faire, il suffit d'ajouter au projet, un fichier .gitignore qui indique tout ce qu'il faut exclure.
Pour pouvoir tirer le meilleur parti de Git et du travail collaboratif, il est recommandé d'adhérer à la discipline suivante:
git status(ou git status . pour connaitre le status du répertoire courant)
On branch master Your branch is up-to-date with 'origin/master'. Untracked files: (use "git add ‹file>..." to include in what will be committed) crypto-stegano/MyNewFile.java nothing added to commit but untracked files present (use "git add" to track)veut dire que :
On branch master Your branch is up-to-date with 'origin/master'. Changes to be committed: (use "git reset HEAD ‹file>..." to unstage) new file: crypto-stegano/myNewFile.javaune fois git commit fait (après avoir fait un `pull` comme conseillé plus haut) , git status donne:
On branch master Your branch is ahead of 'origin/master' by 1 commit. (use "git push" to publish your local commits) nothing to commit, working directory clean(et l'on termine par un push). Dans IntelliJ, le status est donné par des couleurs (rouge pour fichier non recensé, bleu pour fichier recensé et localement modifié, etc.), donc il n'y a pas directement besoin de cette commande. L'autre commande utile est :
git log (ou git log .)elle permet de voir tous les `commit` effectués et leur message. C'est-à-dire tout l'historique des modifications. Un synopsis des commandes usuelles est disponible ici (il s'agit d'une documentation de l'hébergeur GitHub, mais les commandes git sont partout les mêmes).
L'accès aux données de votre dépôt par https (comme nous l'avons fait plus haut) est un peu pénible, car il exige d'entrer un mot de passe à chaque push. Pour simplifier cela, il faut ajouter à GitLab une clé ssh publique qu'il faut générer en suivant ces instructions: https://docs.gitlab.com/ee/user/ssh.htm. Une fois une clé ssh publique générée, il faut la fournir à GitLab :