Exercices
Les exercices sont à faire dans l'ordre et uniquement via le terminal.
Les commandes Git à utiliser sont rappelées:
- la première fois où elles apparaissent
- lors de l'ajout d'une option
Note
Le texte des modifications à faire dans le fichier README.md
est donné à titre d'exemple, l'essentiel est que chaque modification soit unique. Vous pouvez par exemple vous simplifier la vie en ajoutant la date et heure à la fin du fichier, au lieu de l'éditer:
Avant de commencer, si ce n'est déjà fait, modifier votre configuration Git en renseignant votre nom, email et éditeur préféré.
# Votre prénom et nom
git config --global user.name "votre nom"
# Votre email
git config --global user.email "vous@telecom-paris.fr"
# Par exemple nano comme éditeur pour rédiger les messages de commit
git config --global core.editor nano
Votre premier dépôt Git
- Ouvrez un terminal et allez dans
projets/1A/ue_outils
- Créez un répertoire
tpgit
et accédez-y - Initier le dépôt Git via
git init
- Faites
git status
et observez qu'il n'y a aucune modification en cours - Créez un fichier
.gitignore
contenant la ligne*.txt
- Faites
git status
et observez que ce fichier est non suivi - Ajoutez le fichier
.gitignore
viagit add
- Faites
git status
et observez que ce fichier est prêt à être validé - Validez vos changements
git commit -m "oui"
- Faites
git status
et observez - Changer le message avec
git commit --amend
- Créez un fichier
README.txt
contenant le texte# Mon Premier Git
- Faites
git status
et observez qu'il n'y a aucune modification en cours - Renommez ce fichier en
README.md
et observezgit status
- Ajoutez le fichier
README.md
et validez les changements (nouveau commit) - Regardez les logs avec
git log
- Comparer avec
git log --oneline
- Comparer avec
Votre première branche, fusion et conflit
Placez-vous dans le dépôt tpgit
.
- Créez une branche de test
montest
et basculez dessus avecgit switch -c montest
- Ajoutez la ligne
Première branche
au fichierREADME.md
- Regardez les différences avec
git diff
- Ajoutez et valider ce changement avec le message "Branche 1"
- Basculez sur la branche main avec
git switch main
- Ajoutez la ligne
Première étape
au fichierREADME.md
- Ajoutez et valider ce changement avec le message "Changement 1"
- Fusionnez la branche
montest
dansmain
avecgit merge montest
- observez l'état avec
git status
, les différences avecgit diff
- observez l'état avec
- Annulez ce merge avec
git merge --abort
- observez l'état avec
git status
- observez l'état avec
- Fusionnez à nouveau la branche
montest
dansmain
- éditez les conflits via
nano
par exemple - essayez de terminer le merge avec
git commit
et observez - ajoutez le fichier une fois les conflits résolus
- terminez le merge
- éditez les conflits via
- Détruisez la branche inutile avec
git branch -D
- Regardez les logs et le graph avec
git log --graph
Un peu d'histoire
Placez-vous dans le dépôt tpgit
.
- Regardez les différences pour le fichier
README.md
entre la version courante et précédente avecgit diff HEAD~1 README.md
- Avec la version
n-2
?n-3
?n-4
? - Entre la version
n-1
etn-2
viagit diff COMMIT_ID1..COMMIT_ID2
?n-1
etn-3
? - Revenez à la version du premier commit
git checkout COMMIT_ID
- lisez attentivement les messages de git
- Regardez les fichiers présents via
ls
, que remarquez-vous ? - Revenir à la dernière version sur la branche principale
git switch main
- Regardez les différentes sources de modification du fichier
README.md
avecgit blame README.md
Un brouillon
Placez-vous dans le dépôt tpgit
.
- Ajoutez la ligne
En cours
au fichierREADME.md
- Placez vos changements dans le brouillon avec
git stash
- Créez une nouvelle branche
test2
Note
Scénario typique: vous commencez des modifications et réalisez qu'une nouvelle branche serait utile. Pour partir sur une branche propre, vous feriez git stash
puis git pull
avant de créer votre branche
- Récupérez votre brouillon avec
git stash pop
et regardez l'état - Ajoutez et validez le changement
- Vérifiez l'état de vos brouillons avec
git stash list
(à priori vide) - Ajoutez la ligne
Test
au fichierREADME.md
et regardez l'état - Placez vos changements dans le brouillon en ajoutant un message avec l'option
--message
- Vérifiez l'état de vos brouillons
- Affichez le premier brouillon avec
git stash show 0
, utilisez-p
pour voir les différences par fichier - Supprimez le brouillon avec
git stash drop
Un dépôt distant
- Ouvrez un terminal et allez dans
projets/1A/ue_outils
. - Faites un clone de votre dépôt
tpgit
viagit clone tpgit tpclone
ce qui indiquera de cloner le dépôt dans le répertoiretpclone
- Entrez dans
tpclone
, vérifiez état et logs
Placez-vous dans le répertoiretpgit
- Fusionnez la branche
test2
dans main - Tapez la commande
git config --bool core.bare true
(option assez obscure de Git dont vous n'aurez pas besoin en passant via Gitlab/Github)
Placez-vous dans le répertoiretpclone
- Ajouter la ligne
Test2
auREADME.md
, ajoutez le fichier et valider - Poussez vos modifications via
git push
- vérifiez que cela est impossible
- Récupérez les modifications distantes via
git pull
- Git vous demandera normalement de spécifier comment appliquer les changements, choisissez
fusion
(merge
) et refaitegit pull
- Git vous demandera normalement de spécifier comment appliquer les changements, choisissez
- Vérifiez l'état
- Réglez le conflit et validez la fusion
- Poussez vos modifications via
git push
Placez-vous dans le répertoiretpgit
- Regardez l'état et les logs
Placez-vous dans le répertoiretpclone
- Supprimer la branche
test2
- vous devrez fairegit push origin -d test2
- Regardez la liste des branches sur
tpclone
et surtpgit
Une étiquette pour votre première version
Placez-vous dans le dépôt tpclone
- Configurez Git pour suivre les étiquettes lors des
push
git config push.followTags true
- Ajoutez une étiquette "1.0" avec comme nom "Première version"
git tag -a "1.0" -m "Première version"
- Regardez les tags avec
git tag
etgit tag -n
- Pousser vos modifications
- Regardez les tags dans le dépôt
tpgit
Quelques incertitudes
Placez-vous dans le dépôt tpclone
- Modifiez le fichier
README.md
comme bon vous semble, ajoutez et validez - Vous avez changé d'avis, revenez d'un commit en arrière via
git reset HEAD~1
- Regardez l'état
- Revenez à la dernière version du fichier
README.md
viagit restore README.md
- Revenez d'un commit en arrière via
git reset HEAD~1
- Revenez à la dernière version du fichier
README.md
- Poussez vos modifications - que se passe-t-il ?
- Revenez à la dernière version sur la branche
- Modifiez le fichier
README.md
comme bon vous semble, ajoutez et validez - Poussez vos modifications et regardez les logs sur le dépôt
tpgit
- Annulez l'avant-dernier commit poussé avec
git revert
- vous avez des conflits, ne les corrigez pas
- annulez l'opération de revert avec
git revert --abort
- Annulez le dernier commit poussé
- Poussez vos modifications et regardez les logs sur les dépôts
tpclone
ettpgit
- Modifiez le fichier
README.md
comme bon vous semble, ajoutez et validez (faite cela deux ou trois fois)- ne pousser pas vos modifications
- regardez les logs et identifiez le dernier commit poussé sur le dépôt d'origine
- Vous décidez que vos modifications n'en valaient pas la peine. Revenez à l'état courant du dépôt
origin
viagit reset --hard COMMIT_ID
- dans ce cas précis, on pourrait utiliser
git reset --hard origin/main
puisqueCOMMIT_ID
correspond à la dernière modification surorigin/main
- Vérifiez via les logs
- dans ce cas précis, on pourrait utiliser
Ajout d'une branche
Placez-vous dans le dépôt tpclone
.
- Créez une nouvelle branche
mabranche
, modifiez le fichierREADME.md
, ajoutez et validez - Poussez vos changements
- lisez attentivement les messages
- poussez votre branche en indiquant le dépôt cible
- vérifiez les branches sur le dépôt
tpgit
Ajout d'un dépôt
- Ouvrez un terminal et allez dans
projets/1A/ue_outils
. - Faites un clone de votre dépôt
tpgit
sous le nom detpfork
- Allez dans le répertoire
tpclone
- Ajoutez le dépôt de fork via
git remote add fork ../tpfork
- Vérifiez que vous avez maintenant deux dépôts distants via
git remote
- Créez une nouvelle branche
monpatch
et poussez-la sur votre fork - Vérifiez que cette branche est bien dans le dépôt
tpfork
mais pas dans le dépôttpgit
A ce stade, si votre dépôt tpfork
n'était pas en local, comme ici, mais sur un serveur Gitlab/Github, en vous connectant sur le serveur du fork vous verriez un bouton vous proposant de créer une Merge Request ou Pull Request.
Pour aller plus loin
Vous êtes arrivés au bout de ces manipulations Git, félicitations ! Vous avez maintenant assez de connaissances Git pour aborder sereinement la majeure partie de vos futurs TPs, TDs, projets et usage de Git dans la vie professionnelle.
Info
Pour les plus à l'aise et avancés, il est recommandé de regarder le fonctionnement de git rebase
, car c'est une option très utile pour:
- garder un historique de commit le plus linéaire possible,
- éviter de nombreux commits uniquement dédiés à la fusion de code et qui ajoutent du "bruit" dans l'historique
- mettre à jour des Merge/Pull Request lorsque des nouvelles modifications sont ajoutées au code avant l'intégration de la demande.
Il existe de nombreux sites pour vous entraîner encore plus sur Git:
-
- Faire les 4 niveaux de main (séquence d'introduction) et les 8 niveaux de remote (push et pull)
-
Git Immersion (en anglais)
- Git HowTo (en anglais)