Outils pour utilisateurs

Outils du site


informatique:git

Ceci est une ancienne révision du document !


Git

Séparer la page comme celle pour mysql

Configuration

Il est possible de modifier les préférences en utilisant soit git directement soit en modifiant son fichier de configuration.

En ligne de commande

git config --global user.name "Nom et prénom de l'utilisateur" # Nom de l'utilisateur
 
git config --global user.email "Adresse email de l'utilisateur" # Adresse email de l'utilisateur
 
git config --global color.ui "auto" # Colorisation des résultats
 
git config --global core.editor vim # Choix de l'éditeur par défaut
 
git config --global help.autocorrect 1 # Auto-correction des commandes
 
git config --global core.autocrlf false # Non conversion du caractère de fin de ligne
 
git config --global commit.template <filename> # Utilisation d'un modèle de message pour la validation
 
git config --global alias.st 'status' # Création d'un alias de la fonction "status"

Pour supprimer un élément de la configuration, il suffit d'ajouter l'option --unset lors de l'utilisation de la commande. Par exemple :

git config --global --unset user.name

En utilisant --global, la configuration s'applique à l'utilisateur courant. Il est possible de changer ce comportement en utilisant d'autres options :

  • Avec --system, la configuration s'applique à tous les utilisateurs de la machine.
  • Avec --local, la configuration s'applique au dépôt courant. Dans ce cas, il faut bien sur se trouver dans un répertoire géré par git.

Avec un fichier de configuration

Le fichier a modifier est le fichier .gitconfig à la racine du répertoire de l'utilisateur. Il est généré automatiquement lors de l'utilisation des commandes de configuration.

[user]
        email = Adresse email de l'utilisateur
        name = Nom et prénom de l'utilisateur
[core]
        editor = vim 
        autocrlf = false
[color]
        ui = auto
[help]
        autocorrect = 1
[alias]
        st = status
[commit]
        template = <filename>

Pour supprimer un élément de la configuration, il suffit de l'enlever du fichier de configuration.

En modifiant le fichier .gitconfig, la configuration s'applique à l'utilisateur courant. Il est possible de changer ce comportement en modifiant d'autres fichiers :

  • En modifiant le fichier /etc/gitconfig, la configuration s'applique à tous les utilisateurs de la machine.
  • En modifiant le fichier .git/config, la configuration s'applique au dépôt courant. Dans ce cas, il faut bien sur se trouver dans un répertoire géré par git.

Lorsque l'autocorrection des commandes est activée, git essaye de trouver une correspondance dans les commandes existantes. S'il existe plusieurs possibilités, elles seront affichées à l'utilisateur. S'il n'existe qu'une seule possibilité, elle sera exécutée automatiquement.

Lorsqu'un fichier modèle de message est utilisé pour la validation, celui-ci est affiché à chaque validation. Les lignes de commentaires 1) ne seront pas utilisées lors de la validation. Cela permet de :

  • donner des indications sur ce que doit contenir le message de validation,
  • faciliter la rédaction du message de validation en y intégrant les données obligatoires automatiquement.

Des alias pour gagner du temps

En plus de raccourcir certaines commandes, les alias permettent aussi de combiner des actions répétitives en une seule commande. Voici les alias que j'utilise actuellement.

.gitconfig
[alias]
        ; List aliases
        alias = !git config --get-regexp '^alias\\.' | sed --expression s/^alias\\.// --expression s/\\ /\\\\t\\ / | sort
        ; Amend content to the last commit
	amend = commit --amend --no-edit
        ; Check for whitespace errors
        check = diff --check HEAD
        ; Fixup a commit into another
        fixup = !sh -c 'git stash --keep-index && SHA=$(git rev-parse $1) && git commit --fixup $SHA && GIT_SEQUENCE_EDITOR=: git rebase --interactive --autosquash $SHA~ && git stash pop' -
	; Show branch ordered by last working time
	last-work = branch --sort='-committerdate' --format='%(color:green)%(committerdate:relative)%(color:reset) %(refname:short) --color=always'
        ; Show log on oneline
        oneline = log --oneline --abbrev-commit --graph
        ; Retrieve a PR locally
        pr = !sh -c 'git fetch ${2:-origin} pull/$1/head:pr/$1 && git checkout pr/$1' -
        ; Prune local tags that don't exist on remote
        pt = !git tag -l | xargs git tag -d && git fetch -t

La commande : fait partie des commandes incluses dans Bash. Voir ici pour plus d'informations.

FIXME Ajouter une section sur les préférences de l'utilisateur par dépot

# Ajouter un dépôt distant
git remote add <nom> <url>

Utilisation

Utiliser les logs

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

# Afficher les logs
git log
 
# Afficher les logs avec les statistiques
git log --stat
 
# Afficher les logs des n dernières révisions
git log -n
 
# Afficher les logs sur une ligne
git log --oneline
 
# Afficher les logs 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 tags par date
git log --date-order --graph --tags --simplify-by-decoration --pretty=format:'%ai %h %d'

Utiliser les commits

  • Révisionner du code
# Ajouter les fichiers à révisionner
git add <file1> <file2>
# Révisionner les modifications
git commit
# À ce moment, l'éditeur de texte par défaut va s'ouvrir pour ajouter un message à la révision
 
# Il est aussi possible de faire tout ça automatiquement
git commit -a -m <message>
  • Annuler l'ajout d'un fichier dans l'index
git reset HEAD <file>
  • Modifier le nom de l'utilisateur de la dernière révision
# Attention, l'utilisation de cette commande est déconseillée si le code a été partagé.
git commit --amend --reset-author
  • Modifier la dernière révision 2)
# Attention, l'utilisation de cette commande est déconseillée si le code a été partagé.
git commit --amend
  • Modifier une ancienne révision 3)
# 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
  • Supprimer la dernière révision
# 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

Utiliser les branches

  • Afficher les 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
  • Créer une branche locale
# La manière rapide
git checkout -b <branch>
 
# La manière détaillée
git branch <branch>
git checkout <branch>
  • Récupérer une branche distante
# 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>
  • Changer le nom d'une branche locale
git branch -m <old-branch> <new-branch>
  • Supprimer une branche locale
# Supprimer une branche qui a été fusionnée
git branch -d <branch>
# Forcer la suppression d'une branche
git branch -D <branch>
  • Supprimer une branche distante
# 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>
  • Lier une branche existante à une branche distante
# Syntaxe courte
git branch -u <remote_branch> <local_branch>
 
# Syntaxe longue
git branch --set-upstream-to <remote_branch> <local_branch>
  • Supprimer les branches locales obsolètes
git remote prune origin
  • Comparer un fichier entre 2 branches
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>
  • Pousser une branche
# 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>
  • Afficher le point d'origine d'une branche
git merge-base HEAD <branch>
  • Revenir à la branche précédente
git checkout -

Utiliser les tags

  • Lister les tags
git tag
  • Créer un tag à usage privé ou temporaire (tag léger)
git tag <tagname>
  • Créer un tag à usage public (tag annoté)
git tag -a <tagname>
  • Créer un tag distant

Il faut que le tag existe déjà localement pour pouvoir le créer sur un repository distant.

# Pour créer un seul tag
git push origin <tagname>
# Pour créer tous les tags
git push --tags
  • Supprimer un tag distant 4)
# 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>
  • Remplacer un tag léger par un tag annoté 5)
# Récupérer le code associé au tag
git checkout <tagname>
 
# Supprimer le tag local
git tag -d <tagname>
 
# Créer le tag annoté antidaté à la date de la révision
GIT_COMMITTER_DATE="$(git show --format=%aD | head -1)" git tag -a <tagname>
 
# Supprimer le tag distant
git push origin :refs/tags/<tagname>
 
# Créer le tag distant
git push --tags

Utiliser les notes

  • Ajouter une note sur un commit
# Sans espace de nom
git notes add -m <message> <commit>
 
# Avec espace de nom
git notes --ref=<namespace> add -m <message> <commit>
  • Voir une note
# Sans espace de nom
git log
 
# Avec espace de nom (les caractères de remplacement sont supportés)
git log --show-notes=<namespace>
  • Éditer une note
# Sans espace de nom
git notes edit <commit>
 
# Avec espace de nom
git notes --ref=<namespace> edit <commit>

Divers

  • Créer et appliquer un patch 6)
# 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>
  • Modifier l'historique
git rebase -i <commit>
  • Ajouter des fichiers à l'index
git add -i
  • Récupérer un fichier d'un révision particulière
git checkout <treeish> -- <path>
  • Afficher un fichier d'un révision particulière
git show <treeish>:<file>
  • Voir les modifications effectuées
# 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>
# 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}
  • Afficher la liste des fichiers d'un commit
git diff-tree --no-commit-id --name-only -r <treeish>
  • Dupliquer un projet
# 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>
  • Créer une archive d'un projet
git archive --format=tar.gz <treeish> > <file>
  • Dupliquer un repository 7)
# 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
  • Afficher la liste des branches actives
# 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\*

Pour aller plus loin

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>

Liens utiles

Aide mémoire

Pour commencer

Pour aller plus loin

Humour

Divers

FIXME → Vérifier ce que j'ai fait à la maison

  • Modifier son prompt pour qu'il soit plus utile
export GIT_PS1_SHOWDIRTYSTATE=1
export GIT_PS1_SHOWSTASHSTATE=1
export GIT_PS1_SHOWUNTRACKEDFILES=1
export GIT_PS1_SHOWUPSTREAM=verbose
export GIT_PS1_DESCRIBE_STYLE=branch
export GIT_PS1_SHOWCOLORHINTS=1
export PROMPT_COMMAND='__git_ps1 "\[\033[1;32m\]\u@\h:\[\033[1;34m\]\w\[\033[1;m\]" " \\\$ "'
informatique/git.1592490422.txt.gz · Dernière modification : 2020/06/18 07:27 de alexis