Git est un SGV puissant, qui nécessite de l’entraînement pour pouvoir être maîtrisé. Cette première activité traite de divers aspects de l’usage local de Git.
Il faut configurer Git pour définir à minima son identité (nom + mail), et
le nom de la branche principale (master → main) :
git config --global user.email "votre@email.org"
git config --global user.name "Votre Nom"
git config --global init.defaultBranch main
Cf Comprendre le mécanisme de Git ; notamment les trois états.
Expérimentation
Initialisation de Git :
- Créer un dossier :
mkdir nom_projet - Entrer dans le dossier :
cd nom_projet - Initialiser Git :
git init - Vérifier
ls -a→ présence du dossier.git
Premiers commit :
- Créer un ou deux fichiers.
- Les ajouter à l’index :
git add nom_fichier - Vérifier :
git status - Enregistrer une version :
git commit -m "Description de la version" - Vérifier :
git log - Faire des modifications, les ajouter à l’index et enregistrer une nouvelle version.
- Afficher les changements depuis la dernière version :
git diff [HEAD] - Afficher les changements entre l’avant-dernière et la dernière version :
git diff HEAD~1 HEAD
- Modifier un fichier, puis restaurer son état à celui du dernier commit :
git restore nom_fichier; vérifier (cfcat nom_fichier). - Modifier un fichier, l’indexer (cf
git add), puis le désindexer :git restore -S nom_fichier; v"rifier (cfgit statusetcat nom_fichier— le contenu est conservé). - Modifier un ou deux fichiers, puis restaurer l’état du dernier commit :
git reset --hard— attention : toutes les modifications dans le répertoire de travail sont perdues. - Annuler le dernier commit, en conservant l’état du répertoire de travail :
git reset HEAD~1; vérifier (cfgit logetcat nom_fichier). - Supprimer un fichier :
git rm nom_fichier(contrairement àrm,git rmmet à jour l’index des fichiers suivis). - Renommer un fichier :
git mv ancien_nom nouveau_nom
- Tutoriel interactif sur les branches —
Séquence d’introduction. Rappel, utiliser
git switchà la place degit checkout.
Les conflits apparaissent lors d’une fusion de branches, ou lors d’un rebasage (cette situation étant préférable lors d’un travail en équipe).
- Vérifier que la copie de travail est propre et faire le nécessaire si besoin.
- Créer (et basculer) sur une nouvelle branche (temporaire) “feature” (en
théorie, pour développer une fonctionnalité, corriger une erreur…) :
git switch -c feature - Modifier un des fichiers : ajout de lignes et modification d’une ligne.
- Indexer et valider les modifications.
- Basculer sur la branche “main”.
- Modifier la même ligne du même fichier que pour la branche “feature”.
- Indexer et valider les modifications.
- Basculer sur la branche “feature”.
- Effectuer un rebasage :
git rebase main— un conflit apparaît (c’était l’objectif). - Afficher l’arbre des commits :
git treeou application telle que “gitg”. - Résoudre le conflit (cf indications), puis
git add nom_fichieretgit rebase --continue. - Afficher l’arbre des commits : la divergence de la branche feature a disparu.
- La branche “feature” peut maintenant être fusionnée dans “main" :
- basculer sur la branche qui accueille la fusion :
git switch main - fusionner :
git merge feature - habituellement, on supprime la branche temporaire :
git branch -d feature
- basculer sur la branche qui accueille la fusion :
Indications pour la résolution d’un conflit
Le fichier en conflit est modifié et intègre les deux versions ; exemple :
if __name__ == "__main__":
print("Hello World !")
<<<<<<< HEAD
print("Auf Wierdersehen !")
=======
print("Bye bye !")
print("Nana !")
>>>>>>> 4f4b992 (say nana !)
La (ou les zones) conflictuelle(s) sont entre “<<<<<<<” et “>>>>>>>” et séparées par “=======”. Il “suffit d’éditer cette zone puis d’enlever les marqueurs de conflits (la solution peut être un mix des deux versions, ou autre chose) ; exemple :
if __name__ == "__main__":
print("Hello World !")
print("Auf Wierdersehen !")
print("Nana !")