====== Git et GitHub : versions, branches et collaboration ======
**Formation :** BTS SIO — Option SISR
{{ :wiki:logo.png?120 |Logo PLC-SIO}}
===== 1. Rôle et fonctionnement =====
Git conserve l'historique local d'un projet. GitHub héberge des dépôts et fournit des outils de collaboration. Le répertoire de travail contient les fichiers modifiés ; l'index prépare le prochain commit ; le dépôt conserve les versions enregistrées.
===== 2. Cycle de travail =====
git status
git diff
git switch -c documentation/dns
git add docs/documentation/services/dns.md
git diff --staged
git commit -m "Documenter le fonctionnement du DNS"
L'identité se configure avec ''git config user.name'' et ''git config user.email'', au niveau du dépôt ou avec ''--global''. Un commit reste local jusqu'à sa publication.
===== 3. Dépôt distant et Pull Request =====
git remote -v
git fetch origin
git log --oneline --graph --all
git push -u origin documentation/dns
Une Pull Request permet de comparer une branche, discuter les changements et les fusionner après validation. ''fetch'' récupère l'historique distant sans fusionner ; ''pull'' récupère puis intègre selon la configuration. Une divergence n'entraîne pas systématiquement un conflit : celui-ci dépend des modifications concurrentes.
===== 4. Annulation et conflits =====
''git restore --staged fichier'' retire un fichier de l'index sans effacer son contenu de travail. ''git restore fichier'' rétablit le fichier depuis l'index et peut faire perdre les modifications non enregistrées : examiner ''git diff'' avant utilisation.
En cas de conflit, comprendre les deux versions, éditer le résultat, supprimer les marqueurs, tester puis enregistrer la résolution. ''git revert'' crée un commit inverse et convient souvent mieux qu'une réécriture de l'historique partagé.
===== 5. Vérification =====
Avant publication, vérifier le statut, les différences préparées, la branche et le dépôt distant. Ne jamais versionner de secret, même dans un fichier supprimé au commit suivant : il resterait dans l'historique.
Le dépôt utilisé dans la situation est ''Azuneer/CUB-Scripts-Administration''. Les commandes ci-dessus sont des exemples, pas une publication automatique du travail.
===== 6. Exemple : versionner un script PowerShell =====
Dans un nouveau répertoire de travail :
git init
git status
git add diagnostic-reseau.ps1
git diff --cached
git commit -m "Ajouter le diagnostic réseau"
git log --oneline
''git init'' crée un dépôt local. ''git add'' prépare le contenu du prochain commit ; ''git commit'' l'enregistre dans l'historique local. Aucun de ces deux appels ne publie le travail sur GitHub.
Sans argument, ''git diff'' compare le répertoire de travail à l'index. ''git diff --cached'' compare l'index au dernier commit.
{{:devops:git:git-log-trois-commits.png?800|Historique de trois versions du script.}}
//Historique de trois versions du script.//
===== 7. Travailler dans une branche =====
git switch -c feature-diagnostic-dns
# Modifier le script puis vérifier les différences
git diff
git add diagnostic-reseau.ps1
git commit -m "Ajouter le diagnostic DNS"
git push -u origin feature-diagnostic-dns
La dernière commande suppose qu'un dépôt distant ''origin'' a déjà été configuré. La publication de la branche permet ensuite d'ouvrir une pull request.
{{:devops:git:github-pull-request.png?800|Proposition de fusion de la branche sur GitHub.}}
//Proposition de fusion de la branche sur GitHub.//
===== 8. Fusion et conflits =====
Pour une fusion locale, partir d'un répertoire de travail propre et se placer sur la branche qui doit recevoir les changements :
git switch main
git merge feature-diagnostic-dns
En cas de conflit, lire les deux variantes, choisir le contenu cohérent avec les auteurs concernés puis supprimer les marqueurs de conflit. Tester le résultat avant d'enregistrer la résolution :
git add diagnostic-reseau.ps1
git commit
La résolution n'appartient pas automatiquement au dernier auteur ayant publié. La personne réalisant la fusion doit comprendre les modifications et, si nécessaire, échanger avec leurs auteurs.
===== 9. Annuler une modification locale =====
git diff -- diagnostic-reseau.ps1
# Après vérification : abandonner les modifications non indexées de ce fichier
git restore -- diagnostic-reseau.ps1
Cette commande supprime les changements non indexés du fichier. ''git revert'' répond à un autre besoin : enregistrer un nouveau commit qui inverse un commit existant.
===== 10. Références =====
* [[https://git-scm.com/book/en/v2/Git-Branching-Basic-Branching-and-Merging|Git — branches et fusion]]
* [[https://git-scm.com/docs/git-restore|Git — restore]]
* [[https://docs.github.com/en/pull-requests/reference/pull-requests|GitHub — Pull Requests]]