Table des matières

Utilisation

Aide

Il existe de nombreux outils fournis avec git. L'ensemble de ceux décrit ici ne représentent qu'une petite partie des possibilités de Git. Pour apprendre à connaître Git, la curiosité est de mise et quelques commandes existent pour l'aider :

# Afficher la liste et l'usage des commandes les plus communes
git help
 
# Afficher la liste et l'usage de l'ensemble des commandes
git help --all
 
# Afficher la liste des guides
git help --guides
 
# Afficher l'aide d'une commande ou un guide
git help <command>

Journal d'évènement

L'ensemble de ces commandes sont utilisables pour un fichier particulier en ajoutant -- <file_path> à la fin de la commande.

# Afficher le journal d'évènement
git log
 
# Afficher le journal d'évènement avec les statistiques
git log --stat
 
# Afficher le journal d'évènement des n dernières révisions
git log -n
 
# Afficher le journal d'évènement sur une ligne
git log --oneline
 
# Afficher le journal d'évènement entre 2 révisions
git log <commit>..<commit>
 
# Afficher l'historique condensé des révisions
git log --pretty=oneline --abbrev-commit --graph --decorate
 
# Afficher la liste des étiquettes par date
git log --date-order --graph --tags --simplify-by-decoration --pretty=format:'%ai %h %d'

Révisions

# Ajouter les fichiers à révisionner
git add <file1> <file2>
 
# Révisionner les modifications en saisissant un message dans l'éditeur de texte par défaut
git commit
# Révisionner les modifications en saisissant un titre uniquement sans ouvrir l'éditeur de texte par défaut
git commit -m <title>
# Révisionner les modifications en saisissant un titre et un message sans ouvrir l'éditeur de texte par défaut
git commit -m <title> -m <message>
 
# Il est aussi possible de faire tout ça automatiquement (ce n'est pas recommandé)
git commit -a -m <title> -m <message>
git reset HEAD <file>
# Attention, l'utilisation de cette commande est déconseillée si le code a été partagé.
git commit --amend --reset-author
# Attention, l'utilisation de cette commande est déconseillée si le code a été partagé.
git commit --amend
# Pour modifier la révision bbc643cd
git rebase --interactive bbc643cd^
# À ce moment, l'éditeur de texte par défaut va s'ouvrir pour sélectionner les révisions à modifier.
# Changer pick pour edit en face des révisions à modifier.
 
# Faire les changements nécessaire et ajouter les fichiers.
git add <file1> <file2>
 
# Appliquer les changements
git commit --amend
 
# Poursuivre l'application des changements
git rebase --continue
# Si la révision n'a pas été partagée et que l'on veut conserver les modifications
git reset --soft HEAD~1
 
# Si la révision n'a pas été partagée et que l'on veut supprimer les modifications
git reset --hard HEAD~1
 
# Si la révision a été partagée
git revert HEAD

Branches

# Locales
git branch
# Distantes
git branch -r
# Toutes
git branch -a
# Déjà disponibles dans la branche courante
git branch --merged
# Pas encore disponibles dans la branche courante
git branch --no-merged
# La manière rapide
git checkout -b <branch>
 
# La manière détaillée
git branch <branch>
git checkout <branch>
# Récupérer la liste des branches distantes disponibles
git fetch origin
# Récupérer la liste des branches distantes disponibles en supprimant les branches supprimées - version longue
git fetch --prune origin
# Récupérer la liste des branches distantes disponibles en supprimant les branches supprimées - version courte
git fetch -p origin
 
# Création d'une branche locale à partir de la branche distante
git checkout -b <branch> origin/<branch>
git branch -m <old-branch> <new-branch>
# Supprimer une branche qui a été fusionnée
git branch -d <branch>
# Forcer la suppression d'une branche
git branch -D <branch>
# La manière compréhensible
git push --delete origin <branch>
# La manière moins compréhensible au premier abord
git push origin :refs/remote/origin/<branch>
# et son raccourci
git push origin :<branch>
# Syntaxe courte
git branch -u <remote_branch> <local_branch>
 
# Syntaxe longue
git branch --set-upstream-to <remote_branch> <local_branch>
git remote prune origin
git diff <branch_1> <branch_2> -- <fichier>
 
# Avec cette syntaxe, la référence peut être une branche, un tag, un commit, ...
git diff <reference_1>..<reference_2> <fichier>
# Quand les références des branches sont identiques
git push <remote> <branch>
 
# Quand les références des branches sont différentes
git push <remote> <src/branch>:<dst/branch>
git merge-base HEAD <branch>
git checkout -

Étiquettes

git tag
git tag <tagname>
git tag -a <tagname>

Il faut que l'étiquette existe déjà localement pour pouvoir la créer sur un dépôt distant.

# Pour créer une seul étiquette
git push origin <tagname>
# Pour créer toutes les étiquettes
git push --tags
# La manière compréhensible
git push --delete origin <tagname>
# La manière moins compréhensible au premier abord
git push origin :refs/tags/<tagname>
# et son raccourci
git push origin :<tagname>
# Récupérer le code associé à l'étiquette
git checkout <tagname>
 
# Supprimer l'étiquette locale
git tag -d <tagname>
 
# Créer l'étiquette annotée antidatée à la date de la révision
GIT_COMMITTER_DATE="$(git show --format=%aD | head -1)" git tag -a <tagname>
 
# Supprimer l'étiquette distante
git push origin :refs/tags/<tagname>
 
# Créer l'étiquette distante
git push --tags

Notes

# Sans espace de nom
git notes add -m <message> <commit>
 
# Avec espace de nom
git notes --ref=<namespace> add -m <message> <commit>
# Sans espace de nom
git log
 
# Avec espace de nom (les caractères de remplacement sont supportés)
git log --show-notes=<namespace>
# Sans espace de nom
git notes edit <commit>
 
# Avec espace de nom
git notes --ref=<namespace> edit <commit>

Divers

# Création d'un fichier patch
git format-patch <commit.1>..<commit.2> --stdout > <file.patch>
 
# Création d'un fichier patch en changeant le chemin d'accès aux fichiers
git format-patch <commit.1>..<commit.2> --src-prefix="a/new/path/" --dst-prefix="b/new/path/" --stdout > <file.patch>
 
# Vérification du patch
git apply --check <file.patch>
 
# Application des modifications apportées par le patch
git apply <file.patch>
 
# Application des commits apportés par le patch
git am <file.patch>
git rebase -i <commit>
git add -i
git checkout <treeish> -- <path>
git show <treeish>:<file>
# Modifications des fichiers du répertoire de travail
git diff
# Modification des fichiers de la zone de transit
git diff --staged
git diff --cached
# Vérification des erreurs de caractères blancs
git diff --check
 
# Modification entre deux branches
git diff <branch>..<branch>
# Modification entre deux branches (nom et statut)
git diff --name-status <branch>..<branch>
# Modification entre deux branches (nom seulement)
git diff --name-only <branch>..<branch>

Il est possible de filtrer les résultats sur le type de changement en utilisant --diff-filter. Cette option prend une ou plusieurs valeurs dans la liste suivante :

  • A pour les fichiers ajoutés.
  • D pour les fichiers supprimés.
  • M pour les fichiers modifiés.
  • R pour les fichiers déplacés.
# Mettre de côté toutes les modifications
git stash
# Mettre de côté toutes les modifications à l'exception de celles présentent dans l'index
git stash --keep-index
# Lister les réserves de code
git stash list
# Appliquer la dernière réserve de code
git stash apply
# Supprimer la dernière réserve de code
git stash drop
# Afficher les modifications contenues dans le "stash"
git stash show -p stash@{0}
git diff-tree --no-commit-id --name-only -r <treeish>
# Duplique un projet dans un répertoire éponyme créé automatiquement
git clone <project>
 
# Duplique un projet dans un répertoire sélectionné
git clone <project> <folder>
git archive --format=tar.gz <treeish> > <file>
# Faire un clone brut du projet
git clone --bare <old-repository>
 
# Faire un miroir du projet
cd old-repository
git push --mirror <new-repository>
 
# Suppression du clone brut
cd -
rm -rf old-repository
# Sans filtre
git ls-remote --heads origin
 
# Avec un filtre simple
git ls-remote --heads origin master
 
# Avec un filtre complexe
git ls-remote --heads origin master develop release\*
git ls-tree -r master --name-only