Récupérer le code: LearnGit.txt
Git est un logiciel de contrôle de versions distribué et un système de gestion du code source.
Il effectue sa tâche via des séries d'instantanés (snapshots) du projet, et travaille avec ces instantanés afin de fournir les fonctionnalités de gestion de version et de code source.
Le contrôle de version est un système qui enregistre les changements faits sur un ou plusieurs fichiers au fil du temps.
Un ensemble de fichiers, dossiers, historiques de modifications, commits (validations de changements) et de heads (état courant, "tête"). Représentez-vous ceci comme une structure de données de code source, avec la particularité que chaque "élement" vous donne, entre autres, accès à son historique des révisions.
Un dépôt Git comprend un répertoire .git et "l'arbre de travail" (working tree).
Le répertoire .git contient toutes les configurations, logs (journaux), branches, HEAD et plus. Liste détaillée (EN)
Il s'agit de l'ensemble des répertoires et fichiers de votre dépôt. Il est souvent qualifié de répertoire de travail ("working directory").
L'index est la zone de transit ("staging area") dans Git. Il s'agit d'une couche séparant votre arbre de travail de votre dépôt Git. Ceci donne aux développeurs plus de pouvoir sur ce qu'ils envoient au dépôt.
Un "commit" (validation de changements) est un instantané d'un ensemble de modifications de votre arbre de travail. Par exemple, si vous avez rajouté 5 fichiers et enlevé 2 autres, ces changements seront contenus dans un commit (ou "snapshot", instantané). Ce commit peut ensuite être poussé ("pushed") dans d'autres dépôts, ou non !
Une branche consiste essentiellement en un pointeur vers le dernier commit que vous avez fait. Au fur et à mesure de vos commits, ce pointeur se mettra automatiquement à jour pour pointer vers le dernier commit.
Une étiquette est une marque sur un point spécifique de l'historique. Typiquement, on utilise cette fonctionnalité pour marquer les états de publication (v1.0, et ainsi de suite).
HEAD est un pointeur pointant vers la branche courante. Un dépôt ne peut avoir qu'un seul HEAD actif. head est un pointeur pouvant pointer sur n'importe quel commit. Un dépôt peut avoir un nombre illimité de heads.
Créé un dépôt Git vide. Les paramètres du dépôt Git, les informations stockées et plus sont dans un répertoire (un dossier) nommé ".git".
$ git init
Configuration des paramètres. Que ce soit pour le dépôt, le système lui-même,
ou la configuration globale (le fichier de configuration globale
est ~/.gitconfig
).
# Lit et assigne quelques variables (globales) de configuration de base
$ git config --global user.email "[email protected]"
$ git config --global user.name "Mon nom"
Apprenez-en plus à propos de git config.
Vous donne un accès rapide à un guide extrêmement détaillé de chaque commande. Ou juste vous donner un rappel rapide de la sémantique.
# Vérifie rapidement les commandes disponibles
$ git help
# Vérifie toutes les commandes disponibles
$ git help -a
# Aide pour une commande spécifique - manuel utilisateur
# git help <command_here>
$ git help add
$ git help commit
$ git help init
# ou git <command_here> --help
$ git add --help
$ git commit --help
$ git init --help
Ne plus suivre certains fichiers et dossiers de Git. Habituellement fait pour les fichiers privés et temporaires qui seraient, autrement, partagés dans le dépôt.
$ echo "temp/" >> .gitignore
$ echo "cle_privee" >> .gitignore
Montre les différences entre le fichier indexé (typiquement votre copie/dépôt de travail) et le HEAD actuel.
# Affiche la branche, les fichiers non suivis, les changements et autres
différences
$ git status
# Pour en apprendre plus sur git status
$ git help status
Rajoute des fichiers à la zone d'index. Si vous ne faites pas git add
sur les
nouveaux fichiers, ils ne seront pas inclus dans les commits !
# rajoute un fichier dans votre répertoire de travail actuel
$ git add HelloWorld.java
# rajoute un fichier dans un répertoire imbriqué
$ git add /path/to/file/HelloWorld.c
# Gestion des expressions régulières !
$ git add ./*.java
On ne fait que rajouter des fichiers dans la zone d'index, on ne valide pas les changements au répertoire/dépôt de travail.
Gère vos branches. Vous pouvez voir, éditer, créer et supprimer des branches en utilisant cette commande.
# Liste les branches existantes et distantes
$ git branch -a
# Créé une nouvelle branche
$ git branch maNouvelleBranche
# Supprime une branche
$ git branch -d maBranche
# Renomme une branche
# git branch -m <anciennom> <nouveaunom>
$ git branch -m nomDeMaBranche nouveauNomDeMaBranche
# Edite la description d'une branche
$ git branch nomDeMaBranche --edit-description
Gère vos étiquettes
# Liste les étiquettes
$ git tag
# Créé une étiquette annotée
# L'option -m spécifie un message qui sera stockée dans l'étiquette.
# Si vous ne spécifiez pas de message pour une étiquette annotée,
# Git lance votre éditeur pour que vous puissiez le saisir.
$ git tag -a v2.0 -m 'ma version 2.0'
# Affiche des informations à propos de l'étiquette
# comprenant des informations sur l'auteur, la date du commit correspondant,
# et le message d'annotation avant d'afficher les informations du commit.
$ git show v2.0
# Pousse une seule étiquette dans le dépôt distant
$ git push origin v2.0
# Pousse beaucoup d'étiquettes dans le dépôt distant
$ git push origin --tags
Met à jour tous les fichiers dans l'arbre de travail afin de correspondre à la version de la zone d'index ou de l'arbre spécifié.
# Obtenir une copie de travail du dépôt - par défaut on prend la branche master
$ git checkout
# Bascule vers une branche spéficiée
$ git checkout nomDeLaBranche
# Créé une nouvelle branche et bascule sur celle-ci
# Revient à faire "git branch <name>; git checkout <name>"
$ git checkout -b nouvelleBranche
Clone (ou copie) un dépôt existant dans un nouveau répertoire. Rajoute également les branches distantes pour chaque branche du dépôt clôné, ce qui vous permet de pousser vers une branche distante.
# Clone learnxinyminutes-docs
$ git clone https://github.com/adambard/learnxinyminutes-docs.git
# Clone superficiel ("shallow clone") - clone plus rapide qui récupère
seulement le dernier instantané ("snapshot")
$ git clone --depth 1 https://github.com/adambard/learnxinyminutes-docs.git
# Clone seulement une branche spécifique
$ git clone -b master-cn https://github.com/adambard/learnxinyminutes-docs.git --single-branch
Conserve le contenu actuel de la zone d'index dans un nouveau "commit." Ce commit contient les changements faits, accompagnés d'un message écrit par son auteur.
# Commit avec un message
$ git commit -m "Ajout de la fonction multiplierNombres() dans HelloWorld.c"
# Rajoute automatiquement dans l'index les fichiers modifiés ou supprimés,
# à l'exception des nouveaux fichiers, puis commit
$ git commit -a -m "Modification de foo.php et suppression de bar.php"
# Change le dernier commit (ceci supprime le commit précédent avec un
# nouveau commit)
$ git commit --amend -m "Message corrigé"
Montre les différences entre un fichier dans le répertoire de travail, la zone d'index and les commits.
# Affiche les différences entre votre répertoire de travail et l'index
$ git diff
# Affiche les différences entre l'index et le plus récent commit.
$ git diff --cached
# Affiche les différences entre votre répertoire de travail et le plus récent
# commit
$ git diff HEAD
Permet de faire une recherche rapide dans le dépôt.
Configurations optionnelles :
# Merci à Travis Jeffery pour ce qui suit
# Affiche les numéros des lignes dans les résultats de la recherche grep
$ git config --global grep.lineNumber true
# Rend les résultats de recherche plus lisibles, en incluant les groupements
$ git config --global alias.g "grep --break --heading --line-number"
# Recherche de "nomDeVariable" dans tous les fichiers java
$ git grep 'nomDeVariable' -- '*.java'
# Recherche une ligne contenant "nomDeTableau", et "rajouter" ou "enlever"
$ git grep -e 'nomDeTableau' --and \( -e rajouter -e enlever \)
Google est votre ami; pour plus d'exemples : Git Grep Ninja
Affiche les commits d'un dépôt.
# Montre tous les commits
$ git log
# Montre seulement les messages de commits et leur référence
$ git log --oneline
# Montre seulement les commits commits des merges (fusions)
$ git log --merges
Fusionne les changements provenant de commits externes dans la branche courante.
# Fusionne la branche spécifiée dans la branche courante.
$ git merge nomDeBranche
# Génère toujours un commit quand on fusionne
$ git merge --no-ff branchName
Renomme ou déplace un fichier
# Renomme un fichier
$ git mv HelloWorld.c HelloNewWorld.c
# Déplace un fichier
$ git mv HelloWorld.c ./new/path/HelloWorld.c
# Force le renommage ou le déplacement
# Si "fichierExistant" existe déjà dans le répertoire, il sera écrasé
$ git mv -f monFichier fichierExistant
Récupère la version d'un dépôt et la fusionne avec une autre branche.
# Met à jour votre dépôt local en y intégrant les changements
# depuis la branche "master" du dépôt distant "origin".
# git pull <remote> <branch>
$ git pull origin master
# Par défaut, git pull mettra à jour votre branche actuelle
# en y intégrant les nouveaux changements venant de sa branche distante suivie
$ git pull
# Intègre les changements de la branche distante et "rebase"
# les commits de la branche dans votre dépôt local, comme ceci:
#"git pull <remote> <branch>, git rebase <branch>"
$ git pull origin master --rebase
Pousse et fusionne les changements d'une dépôt local vers une branche distante.
# Pousse et fusionne les changements d'un dépôt local vers la branche
# appelée "master" du dépôt distant "master".
# git push <remote> <branch>
$ git push origin master
# Par défaut, git push poussera et fusionnera les changements de la branche
# courante vers sa branche distante suivie.
$ git push
# Pour faire le lien entre la branche locale courante et sa branche distante,
# rajouter l'option -u :
$ git push -u origin master
# Dorénavant, à chaque fois que vous voulez pousser depuis cette même branche
# locale, utilisez ce raccourci :
$ git push
Sauvegarde ("stash") l'état actuel de votre espace de travail et le garde dans pile de changements non finis que vous pouvez réappliquer n'importe quand.
Supposons que vous avez effectué du travail dans votre dépôt git, mais que vous
voulez récupérer la version de la branche distante. Depuis que vous avez des
changements "malpropres" (non commités) à quelques fichiers, vous ne pouvez pas
faire de git pull
. A la place, vous pouvez utiliser git stash
afin de
sauvegarder votre travail dans la pile !
$ git stash
Saved working directory and index state \
"WIP on master: 049d078 added the index file"
HEAD is now at 049d078 added the index file
(To restore them type "git stash apply")
Vous pouvez maintenant pull !
git pull
...changes apply...
Vérifiez maintenant que tout est OK
$ git status
# On branch master
nothing to commit, working directory clean
Vous pouvez constater quels "morceaux" vous avez stash jusque là en
utilisant git stash list
.
Puisque les changements sont gardés dans une pile Last-In-First-Out, notre
changement le plus récent sera en premier.
$ git stash list
stash@{0}: WIP on master: 049d078 rajout du fichier index
stash@{1}: WIP on master: c264051 annulation de "rajout de la taille_fichier"
stash@{2}: WIP on master: 21d80a5 ajout des chiffres aux logs
Appliquons maintenant les changements en les enlevant de notre pile.
$ git stash pop
# On branch master
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
#
# modified: index.html
# modified: lib/simplegit.rb
#
git stash apply
effectue le même travail
Vous êtes maintenant prêt à retourner sur vos tâches de travail !
Prend tous les changements qui ont été commités sur une branche, et les ré-applique sur une autre branche. Ne rebasez pas les commits que vous avez poussés sur un dépôt publique.
# Expérimentation d'un rebase dans la branche "master"
# git rebase <basebranch> <topicbranch>
$ git rebase master brancheExperience
Réinitialise le pointeur HEAD courant à l'état spécifié. Ceci vous permet d'annuler des fusions, des pulls, commits, ajouts et autres. C'est une commande puissante mais également dangereuse si vous ne savez pas ce que vous faites.
# Réinitialise la zone d'index afin de correspondre au dernier commit (laisse
# le répertoire inchangé).
$ git reset
# Réinitialise la zone d'index afin de correspondre au dernier commit et
# réécrit le répertoire de travail.
$ git reset --hard
# Déplace le pointeur de la branche courante au commit spécifié (laisse
# le répertoire inchangé). Tous les changements existents toujours dans
# le répertoire.
$ git reset 31f2bb1
# Déplace le pointeur de la branche courante en arrière, au commit spécifié
# et fait correspondre le répertoire de travail (supprime les changements
# non commités et tous les commits après le commit spécifié).
$ git reset --hard 31f2bb1
Le contraire de git add, git rm supprime les fichiers de l'arbre de travail courant.
# Supprime HelloWorld.c
$ git rm HelloWorld.c
# Enlève un fichier d'un répertoire imbriqué.
$ git rm /chemin/vers/le/fichier/HelloWorld.c
Vous avez une suggestion ? Peut-être une correction ? Ouvrez un ticket sur GitHub, ou faites vous-même une pull request !
Version originale par Jake Prather, mis à jour par 3 contributeur(s).