Git est un système de contrôle de version distribué. Contrairement aux systèmes centralisés comme SVN, Git stocke l'historique complet des versions localement pour chaque dépôt. Cela permet de travailler hors ligne, de consulter l'historique et de recréer un dépôt central rapidement en cas de problème.
Configuration de Git Pour configurer votre nom d'utilisateur et votre adresse e-mail globaux, utilisez les commandes suivantes :
git config --global user.name "Votre Nom"
git config --global user.email "votre.email@example.com"
Le paramètre --global s'applique à tous les dépôts Git sur votre machine. Vous pouvez également spécifier une configuration différente pour un dépôt spécifique.
Gestion du Dépôt
Initialisation d'un dépôt Pour initialiser un nouveau dépôt Git dans le répertoire courant :
git init
Ajout de fichiers et validation des changements Pour ajouter des fichiers à l'index (zone de staging) et valider les changements :
git add <nom_du_fichier>
git commit -m "Message de description du commit"
git add peut être utilisé plusieurs fois pour ajouter plusieurs fichiers. git commit -m enregistre les changements avec un message descriptif.
Vérification de l'état du dépôt Pour afficher l'état de votre répertoire de travail et de la zone de staging :
git status
Visualisation des modifications Pour comparer les différences entre les versions :
git diff: Affiche les modifications dans le répertoire de travail non encore ajoutées à la zone de staging.git diff --cached: Affiche les modifications dans la zone de staging par rapport à la dernière validation.git diff HEAD -- <nom_du_fichier></nom_du_fichier>: Affiche les modifications dans le répertoire de travail par rapport à la dernière validation.
Historique des commits Pour afficher l'historique complet des commits :
git log
Pour un affichage simplifié sur une seule ligne :
git log --pretty=oneline
Historique des commandes Pour consulter l'historique des commandes Git exécutées :
git reflog
Retour aux versions précédentes Pour revenir à la version précédente :
git reset --hard HEAD^
HEAD représente la version actuelle. HEAD^ est la version précédente, HEAD^^ est l'avant-dernière, et HEAD~N représente N versions précédentes. Pour revenir à une version spécifique par son ID :
git reset --hard <identifiant_du_commit>
Zones de travail
- Répertoire de travail (Working Directory) : Les fichiers visibles dans votre dossier de projet.
- Zone de staging (Index) : Une zone intermédiaire où vous préparez les changements avant de les valider.
- Dépôt (Repository) : Le répertoire caché
.gitqui contient l'historique complet et les métadonnées du projet.git adddéplace les modifications vers la zone de staging.git commitenregistre le contenu de la zone de staging dans le dépôt.
Annulation des modifications Pour annuler les modifications dans le répertoire de travail :
git checkout -- <nom_du_fichier>
Cette commande restaure le fichier à son état lors de la dernière validation ou du dernier git add. Pour annuler les modifications dans la zone de staging (les ramener dans le répertoire de travail) :
git reset HEAD <nom_du_fichier>
Ensuite, vous pouvez utiliser git checkout -- <nom_du_fichier></nom_du_fichier> pour annuler les modifications dans le répertoire de travail si nécessaire.
Suppression de fichiers Pour supprimer un fichier et l'enregistrer dans le dépôt :
git rm <nom_du_fichier>
Cela équivaut à rm <nom_du_fichier></nom_du_fichier> suivi de git add <nom_du_fichier></nom_du_fichier>. Si vous avez supprimé un fichier par erreur avec rm, vous pouvez le restaurer depuis le dépôt avec git checkout -- <nom_du_fichier></nom_du_fichier>. Si vous avez utilisé git rm et souhaitez annuler la supprestion (la ramener dans le répertoire de travail), utilisez d'abord git reset HEAD <nom_du_fichier></nom_du_fichier> puis git checkout -- <nom_du_fichier></nom_du_fichier>. Pour confirmer la suppression définitive d'un fichier du dépôt, validez les changements avec git commit -m "Suppression de <nom_du_fichier>"</nom_du_fichier>.
Dépôts Distants
Configuration des clés SSH Générez une paire de clés SSH :
ssh-keygen -t rsa -C "votre.email@example.com"
Association d'un dépôt distant Ajoutez un dépôt distant (par exemple, sur GitHub) :
git remote add origin https://github.com/votre_nom_utilisateur/nom_du_depot.git
Pousser vers le dépôt distant Pour pousser la branche actuelle vers le dépôt distant :
git push -u origin master
L'option -u établit la liaison entre la branche locale et la branche distante pour les futures commandes git push et git pull.
Clonage d'un dépôt Pour cloner un dépôt distant sur votre machine :
git clone https://github.com/nom_utilisateur/nom_du_depot.git
Branches
Création d'une branche
git branch <nom_de_la_branche>
Affichage des branches
git branch
La branche actuelle est marquée d'un astérisque (*).
Commutation de branche
git checkout <nom_de_la_branche>
Création et commutation Pour créer une nouvelle branche et s'y déplacer immédiatement :
git checkout -b <nom_de_la_branche>
Fusion de branches Pour fusionner une branche dans la branche actuelle :
git merge <nom_de_la_branche>
En cas de conflits, vous devrez les résoudre manuellement avant de valider la fusion.
Suppression d'une branche
git branch -d <nom_de_la_branche>
Visualisation de l'historique des branches
git log --graph
Fusion en mode "no-ff" Pour forcer la création d'un commit de fusion, même si un fast-forward est possible :
git merge --no-ff -m "Message de fusion" <nom_de_la_branche>
Sauvegarde de l'état de travail Pour sauvegarder temporairement les modifications non validées :
git stash
Affichage des états sauvegardés
git stash list
Restauration d'un état sauvegardé
git stash pop
Suppression d'une branche non fusionnée Pour supprimer une branche qui n'a pas encore été fusionnée :
git branch -D <nom_de_la_branche>
Informations sur les dépôts distants
git remote -v
Création d'une branche locale correspondant à une branche distante
git checkout -b nom-branche-locale origin/nom-branche-distante
Pousser une branche locale vers le distant
git push origin nom-branche-locale
Si la poussée échoue, effectuez d'abord un git pull pour récupérer les modifications distantes.
Récupérer les modifications distantes
git pull
Cela effectue un fetch suivi d'un merge. Résolvez les conflits si nécessaire.
Étiquettes (Tags) Les étiquettes sont des pointeurs vers des commits spécifiques, souvent utilisées pour marquer des versions de publication.
Création d'une étiquette
git tag <nom_de_l_etiquette>
Vous pouvez aussi spécifier un commit ID.
Ajout d'informations à une étiquette
git tag -a <nom_de_l_etiquette> -m "Description de l'étiquette" [<identifiant_du_commit>]
Étiquettes signées PGP
git tag -s <nom_de_l_etiquette> -m "Description de l'étiquette" [<identifiant_du_commit>]
Affichage de toutes les étiquettes
git tag
Pousser une étiquette vers le dépôt distant
git push origin <nom_de_l_etiquette>
Pousser toutes les étiquettes locales non poussées
git push origin --tags
Suppression d'une étiquette locale
git tag -d <nom_de_l_etiquette>
Suppression d'une étiquette distante
git push origin :refs/tags/<nom_de_l_etiquette>
Rebase
Réécriture de l'historique des commits Utilisez git rebase -i pour interagir avec une séquence de commits, par exemple pour les fusionner ou les modifier.
git rebase -i <commit_de_début>^
Les commandes disponibles dans l'éditeur interactif incluent :
pick(p) : Conserevr le commit.reword(r) : Conserver le commit mais modifier son message.edit(e) : Conserver le commit mais s'arrêter pour le modifier.squash(s) : Fusionner le commit avec le précédent.fixup(f) : Fusionner le commit avec le précédent sans conserver son message.exec(x) : Exécuter une commande shell.drop(d) : Supprimer le commit.
Appliquer des commits sur une autre branche Pour copier une séquence de commits d'une branche à une autre :
git rebase <commit_de_début>^ <commit_de_fin> --onto <nom_de_la_branche_cible>
Si vous souhaitez copier un seul commit, git cherry-pick est souvent plus simple. Après un rebase de ce type, il peut être nécessaire de faire pointer la branche cible vers le nouveau HEAD.
Personnalisation de Git
Couleurs dans le terminal
git config --global color.ui true
Ignorer des fichiers Créez un fichier .gitignore à la racine de votre projet pour spécifier les fichiers et répertoires que Git doit ignorer. Exemple de contenu pour .gitignore :
# Ignorer les fichiers temporaires
*.tmp
# Ignorer un répertoire spécifique
build/
Alias de commandes Créez des alias pour raccourcir les commandes Git courantes :
git config --global alias.st status
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.last 'log -1 HEAD'
Ces configurations sont stockées dans le fichier ~/.gitconfig.