Objectifs

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.

Étape n°1 - Configuration

Cf Configuration de Git.

Il faut configurer Git pour définir à minima son identité (nom + mail), et le nom de la branche principale (mastermain) :

git config --global user.email "votre@email.org"
git config --global user.name "Votre Nom"
git config --global init.defaultBranch main

Étape n°2 - Premières validations

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

Étape n°3 - Annulations

  • Modifier un fichier, puis restaurer son état à celui du dernier commit : git restore nom_fichier ; vérifier (cf cat nom_fichier).
  • Modifier un fichier, l’indexer (cf git add), puis le désindexer : git restore -S nom_fichier ; v"rifier (cf git status et cat 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 (cf git log et cat nom_fichier).
  • Supprimer un fichier : git rm nom_fichier (contrairement à rm, git rm met à jour l’index des fichiers suivis).
  • Renommer un fichier : git mv ancien_nom nouveau_nom

Étape n°4 - Les branches

Étape n°5 - Conflits

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 tree ou application telle que “gitg”.
  • Résoudre le conflit (cf indications), puis git add nom_fichier et git 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

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 !")