-
-
Save tdd/470582 to your computer and use it in GitHub Desktop.
# Put this in your ~/.gitconfig or ~/.config/git/config | |
# Windows users: "~" is your profile's home directory, e.g. C:\Users\<YourName> | |
[user] | |
name = Your Full Name | |
email = [email protected] | |
[color] | |
# Enable colors in color-supporting terminals | |
ui = auto | |
[alias] | |
# List available aliases | |
aliases = !git config --get-regexp alias | sed -re 's/alias\\.(\\S*)\\s(.*)$/\\1 = \\2/g' | |
# Command shortcuts | |
ci = commit | |
co = checkout | |
st = status | |
# Display tree-like log, because default log is a pain… | |
lg = log --graph --date=relative --pretty=tformat:'%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%an %ad)%Creset' | |
# Useful when you have to update your last commit | |
# with staged files without editing the commit message. | |
oops = commit --amend --no-edit | |
# Ensure that force-pushing won't lose someone else's work (only mine). | |
push-with-lease = push --force-with-lease | |
# Rebase won’t trigger hooks on each "replayed" commit. | |
# This is an ugly hack that will replay each commit during rebase with the | |
# standard `commit` command which will trigger hooks. | |
rebase-with-hooks = rebase -x 'git reset --soft HEAD~1 && git commit -C HEAD@{1}' | |
# List local commits that were not pushed to remote repository | |
review-local = "!git lg @{push}.." | |
# Edit last commit message | |
reword = commit --amend | |
# Undo last commit but keep changed files in stage | |
uncommit = reset --soft HEAD~1 | |
# Remove file(s) from Git but not from disk | |
untrack = rm --cache -- | |
[core] | |
# Don't paginate output by default | |
pager = cat | |
# Global ignore file (not shared) | |
excludesfile = ~/.gitignore_global | |
# Global shared hooks directory | |
# hooksPath = ~/.githooks | |
# | |
# Out of luck: on Windows w/o msysGit? You may have Notepad++… | |
# editor = 'C:/Program Files (x86)/Notepad++/notepad++.exe' -multiInst -notabbar -nosession -noPlugin | |
# | |
# If you want to use Sublime Text 2's subl wrapper: | |
# editor = subl -w | |
# | |
# Sublime Text 3 on Windows: | |
# editor = 'c:/Program Files/Sublime Text 3/subl.exe' -w | |
# | |
# VSCode | |
editor = code --wait | |
# Don't consider trailing space change as a cause for merge conflicts | |
whitespace = -trailing-space | |
[diff] | |
# Use better, descriptive initials (c, i, w) instead of a/b. | |
mnemonicPrefix = true | |
# Show renames/moves as such | |
renames = true | |
# When using --word-diff, assume --word-diff-regex=. | |
wordRegex = . | |
# Display submodule-related information (commit listings) | |
submodule = log | |
# Use VSCode as default diff tool when running `git diff-tool` | |
tool = vscode | |
[difftool "vscode"] | |
cmd = code --wait --diff $LOCAL $REMOTE | |
[fetch] | |
# Auto-fetch submodule changes (sadly, won't auto-update) | |
recurseSubmodules = on-demand | |
[grep] | |
break = true | |
heading = true | |
lineNumber = true | |
# Consider most regexes to be ERE | |
extendedRegexp = true | |
[log] | |
# Use abbrev SHAs whenever possible/relevant instead of full 40 chars | |
abbrevCommit = true | |
# Automatically --follow when given a single path | |
follow = true | |
# Disable decorate for reflog | |
# (because there is no dedicated `reflog` section available) | |
decorate = false | |
[merge] | |
# Display common-ancestor blocks in conflict hunks | |
# conflictStyle = diff3 | |
# Disable fast-forward merges as default merge strategy. | |
# Force explicit call of `git merge --ff …`. | |
ff = false | |
# Custom/dedicated merge drive for npm lock files (`package-lock.json`). | |
# Also works with Yarn. | |
# Use Git attributes to set targeted files (located at `~/.config/git/attributes`` | |
# when installed with npm). | |
# See https://www.npmjs.com/package/npm-merge-driver | |
# [merge "npm-merge-driver"] | |
# name = automatically merge npm lockfiles | |
# driver = npx npm-merge-driver merge %A %O %B %P | |
[mergetool] | |
# Clean up backup files created by merge tools on tool exit | |
keepBackup = false | |
# Clean up temp files created by merge tools on tool exit | |
keepTemporaries = false | |
# Put the temp files in a dedicated dir anyway | |
writeToTemp = true | |
# Auto-accept file prompts when launching merge tools | |
prompt = false | |
# [page] | |
# Use custom pager to get an better log on terminal. | |
# As this is an external tool it has to be installed. | |
# See https://github.com/so-fancy/diff-so-fancy | |
# show = diff-so-fancy | less --tabs=4 -RFX | |
[pull] | |
# This is GREAT… when you know what you're doing and are careful | |
# not to pull --no-rebase over a local line containing a true merge. | |
# rebase = true | |
# This option, which does away with the one gotcha of | |
# auto-rebasing on pulls, is only available from 1.8.5 onwards. | |
# rebase = preserve | |
# WARNING! This option, which is the latest variation, is only | |
# available from 2.18 onwards. | |
rebase = merges | |
[push] | |
# Default push should only push the current branch to its push target, regardless of its remote name | |
default = upstream | |
# When pushing, also push tags whose commit-ishs are now reachable upstream | |
followTags = true | |
# [rebase] | |
# Rebase advanced usage. | |
# Automagically reorder and prefix your commands while doing an interactive | |
# rebase. This has to be used with `--fixup` and/or `--squash` options for | |
# `git commit`. | |
# autoSquash = true | |
# Automatically stash current WD and stage when running rebase | |
# then you won't have to manually `git stash push` and `git stash pop` | |
# after and before your rebase. | |
# autoStash = true | |
# [rerere] | |
# If, like me, you like rerere, uncomment these | |
# autoupdate = true | |
# enabled = true | |
[status] | |
# Display submodule rev change summaries in status | |
submoduleSummary = true | |
# Recursively traverse untracked directories to display all contents | |
showUntrackedFiles = all | |
[color "branch"] | |
# Blue on black is hard to read in git branch -vv: use cyan instead | |
upstream = cyan | |
[tag] | |
# Sort tags as version numbers whenever applicable, so 1.10.2 is AFTER 1.2.0. | |
sort = version:refname | |
[versionsort] | |
prereleaseSuffix = -pre | |
prereleaseSuffix = .pre | |
prereleaseSuffix = -beta | |
prereleaseSuffix = .beta | |
prereleaseSuffix = -rc | |
prereleaseSuffix = .rc |
Il y a une option qui n'est pas commentée, c'est git.core.whitespace
Si j'en crois la doc c'est pour désactiver l'auto suppression des espaces en fin de ligne. C'est ça ?
Bonjour Charles,
(désolé pour le lag, je n'avais apparemment pas été notifié par e-mail de ton commentaire)
Pas exactement… Git ne retire pas ces trucs-là pour toi via cette option : il faudrait un filtre textuel. C'est généralement plutôt le boulot, en amont, de ton éditeur (tous les éditeurs valables savent le faire).
L'option core.whitespace
liste les « problèmes » d'espacement à considérer/signaler lors d'un git diff
(et par extension un git add -p
) ou d'un git apply --whitespace=errors
, et à tenter de corriger lors d'un git apply
ou git rebase
en --whitespace=fix
.
La valeur trailing-space
est un raccourci pour blank-at-eol,blank-at-eof
, qui cible donc les espacements en fin de ligne et les lignes en fin de fichier (ce dernier souci est très courant). Indiquée ici en négatif (-trailing-space
), elle désactive ces détections / ne considère pas ces aspects comme problématiques.
Un grand merci pour la config
Just added the %ad
variant in git lg
, defaulting to --date=relative
, to let you override the date format in git lg
using --date=…
. Neat trick by Erwann Leblanc 🎉
Merci pour ces précieuses informations !
L'option pull.rebase est presque géniale ; elle ne me montre plus ce que je pull, y a t il moyen de revoir tout ça ?
Merci
Heeeeu en fait pull.rebase ne change rien au fonctionnement du fetch, c'est après que ça change (rebase au lieu de merge). Du coup si tu ne vois rien avant la partie rebase, c'est qu'en fait tu étais, sur ton essai, à jour côté fetch.
Dernière mise à jour à l'instant, suite aux suggestions de @mbrehin
@bgondy on utilise diff-so-fancy même si ça n’est pas retranscrit ici (on ne veut pas forcer la main et imposer un outil externe aux gens qui souhaitent récupérer cette conf).
En pratique notre conf contient ça : pager = diff-so-fancy | less --tabs=4 -RFX
(basé sur Git 1.8.1.2 ; certains réglages peuvent ne pas être disponibles sur de plus anciennes versions)
J'ai volontairement laissé de côté les aspects rerere, qui sont plus du domaine de la conf locale… Quelques explications sur les réglages (
git help config
pour la totale) :user.name
etuser.email
sont indispensables à une bonne identification de l'auteur de vos commits.color.ui
règle de façon générale les exploitations de la couleur pour les différents contextes (diff, branch, interactive, etc.).auto
indique qu'on y aura recours si le contexte (terminal, pipes, etc.) le gère.sont mes aliases indispensables. La complétion pour
statusexige de saisir
statà cause des commandes proches, et
ciest un raccourci ultra-fréquent pour
commit, qui exige lui 3 caractères pour lever l'ambiguïté à la base.
lg` est mon log "graphique" sur-mesure, mais disponible en mode texte dans un shell. Je n'ai jamais recours aux visualiseurs de logs graphiques, du coup…core.pager
est exploité pour tout affichage plus long que la hauteur de terminal. Je préfère paginer explicitement, donc en indiquantcat
je ne pagine plus par défautcore.editor
gouverne l'éditeur employé par Git. À défaut, celui défini par le système (variable d'environnementEDITOR
, etc.) sera employé. J'utilise SublimeText moi-même avec son wrappersubl
installé dans mon PATH, donc j'emploiesubl -w
comme valeur.diff.mnemonicPrefix
permet à diff, au lieu de préfixer les fichiers comparés para/
etb/
, d'utiliser comme lettresc
(commit),i
(index, c'est-à-dire stage) etw
(working directory), ce qui est parfois utile pour y voir clair…diff.wordRegex
est la regex employée par défaut pargit diff --word-diff
. En la réglant à.
je réduis la détection de diff au plus court contenu possible, ce qui m'évite d'avoir à le faire manuellement avecgit diff --word-diff-regex=.
.fetch.recurseSubmodules
détecte automatiquement lors d'un fetch/pull si les références des submodules ont bougé, et propose de les récupérer automatiquement si c'est le cas. Attention, ça ne fait pas lesubmodule update
pour autant.grep.extendedRegexp
me permet d'employer des regexp étendues (caractères du genre(
,+
, etc.) sans avoir à préciser-E
dans ma ligne de commandelog.abbrevCommit
s'assure que tous mes appels àgit log
afficheront les commits au format abrégé.merge.conflictStyle
me permet de bénéficier du format diff3 sur mes conflits au sein des fichiers ; ce format affiche non seulement les versions locale et distante (ou récipiendaire et source, si vous préférez), mais aussi la version de l'ancêtre commun.mergetool.keepBackup
etmergetool.keepTemporaries
s'assurent que mes outils de fusion, quels qu'ils soient, ne laissent pas traîner des fichiers artefacts après leur exécution (vous savez, du genretruc.orig
ettruc.rej
en traitant le fichiertruc
).mergetool.prompt
m'évite d'avoir à confirmer avec Entrée lorsque je fais ungit mergetool
(ou ungit difftool
, soit dit en passant).pull.rebase
garantit que tous mes pulls feront un rebase plutôt qu'un merge. J'expliquerai en détail pourquoi je préfère ça dans un futur billet Git Attitude, mais en 3 mots : propreté de l'historique.push.default
m'évite de me faire gronder pargit push
, sous prétexte que j'ai encore une branche locale trackée dans un coin dont je ne m'occupe plus et qui est en retard sur le remote, lorsque je pushe depuis une autre.status.submoduleSummary
prend soin de signaler les submodules dont la référence a bougé dansgit status
, en listant les deltas de commits concernés.