Configuration
Comprehensive guide to configuring Git for optimal workflow, including settings, aliases, hooks, and personalization.
Configuration Levels
Understanding Configuration Hierarchy
Git configuration works at three levels:
# System-wide configuration (all users)
git config --system
# User-specific configuration (your account)
git config --global
# Repository-specific configuration (current repo only)
git config --local
Configuration Files
# Configuration file locations
/etc/gitconfig # System-wide
~/.gitconfig # User global
~/.config/git/config # User global (alternative)
.git/config # Repository local
# View configuration files
git config --list --show-origin
# Edit configuration files
git config --global --edit # Edit global config
git config --local --edit # Edit local config
Essential Configuration
User Identity
# Set user name and email (required)
git config --global user.name "Your Full Name"
git config --global user.email "your.email@example.com"
# Set for specific repository
git config user.name "Work Name"
git config user.email "work.email@company.com"
# View current settings
git config user.name
git config user.email
Default Branch
# Set default branch name for new repositories
git config --global init.defaultBranch main
# Alternative names
git config --global init.defaultBranch master
git config --global init.defaultBranch develop
Core Settings
# Set default editor
git config --global core.editor nano
git config --global core.editor vim
git config --global core.editor "code --wait"
# Configure line ending handling
git config --global core.autocrlf input # Linux/Mac
git config --global core.autocrlf true # Windows
# Set default pager
git config --global core.pager less
git config --global core.pager "less -R"
# Disable pager for specific commands
git config --global pager.status false
git config --global pager.branch false
Useful Aliases
Basic Aliases
# Status shortcuts
git config --global alias.s status
git config --global alias.st status
# Branch shortcuts
git config --global alias.b branch
git config --global alias.br branch
# Checkout shortcuts
git config --global alias.co checkout
git config --global alias.sw switch
# Commit shortcuts
git config --global alias.c commit
git config --global alias.cm 'commit -m'
git config --global alias.ca 'commit -a'
git config --global alias.cam 'commit -a -m'
Advanced Aliases
# Improved log displays
git config --global alias.l 'log --oneline'
git config --global alias.ll 'log --oneline -10'
git config --global alias.lol 'log --oneline --graph'
git config --global alias.lola 'log --oneline --graph --all'
# Detailed log with stats
git config --global alias.ls 'log --stat'
git config --global alias.lp 'log --patch'
# Show log with decorations
git config --global alias.lg 'log --graph --pretty=format:"%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset" --abbrev-commit'
Diff and Show Aliases
# Diff shortcuts
git config --global alias.d diff
git config --global alias.dc 'diff --cached'
git config --global alias.ds 'diff --staged'
# Show aliases
git config --global alias.sh show
git config --global alias.sho 'show --oneline'
git config --global alias.last 'log -1 HEAD'
Branch and Remote Aliases
# Branch management
git config --global alias.bd 'branch -d'
git config --global alias.bD 'branch -D'
git config --global alias.ba 'branch -a'
git config --global alias.br 'branch -r'
# Remote operations
git config --global alias.f fetch
git config --global alias.fo 'fetch origin'
git config --global alias.p push
git config --global alias.po 'push origin'
git config --global alias.pom 'push origin main'
git config --global alias.pl pull
git config --global alias.plo 'pull origin'
git config --global alias.plom 'pull origin main'
Utility Aliases
# Undo operations
git config --global alias.unstage 'reset HEAD --'
git config --global alias.uncommit 'reset --soft HEAD~1'
git config --global alias.undo 'reset --hard HEAD~1'
# Stash shortcuts
git config --global alias.ss 'stash save'
git config --global alias.sp 'stash pop'
git config --global alias.sl 'stash list'
git config --global alias.sa 'stash apply'
git config --global alias.sd 'stash drop'
# Cleaning
git config --global alias.cleanup 'clean -fd'
git config --global alias.cleanx 'clean -fdx'
Complex Aliases
# Work in progress
git config --global alias.wip '!git add -A && git commit -m "WIP: Work in progress"'
git config --global alias.unwip '!git reset --soft HEAD~1 && git reset HEAD'
# Sync with remote
git config --global alias.sync '!git fetch origin && git rebase origin/main'
git config --global alias.update '!git pull --rebase && git push'
# Find files
git config --global alias.find '!git ls-files | grep -i'
# Show contributors
git config --global alias.who 'shortlog -s -n'
# Show remote URL
git config --global alias.url 'config --get remote.origin.url'
Merge and Diff Tools
Configuring Merge Tools
# Set merge tool
git config --global merge.tool vimdiff
git config --global merge.tool kdiff3
git config --global merge.tool meld
git config --global merge.tool vscode
# Visual Studio Code as merge tool
git config --global merge.tool vscode
git config --global mergetool.vscode.cmd 'code --wait $MERGED'
# Configure merge tool options
git config --global mergetool.keepBackup false
git config --global mergetool.prompt false
Configuring Diff Tools
# Set diff tool
git config --global diff.tool vimdiff
git config --global diff.tool kdiff3
git config --global diff.tool meld
git config --global diff.tool vscode
# Visual Studio Code as diff tool
git config --global diff.tool vscode
git config --global difftool.vscode.cmd 'code --wait --diff $LOCAL $REMOTE'
# Configure diff tool options
git config --global difftool.prompt false
Custom Diff Tools
# Configure custom diff for specific file types
git config --global diff.json.textconv 'python -m json.tool'
git config --global diff.xlsx.textconv 'excel2csv'
# Configure word diff
git config --global diff.wordRegex '[[:alnum:]]+|[^[:space:]]'
Push and Pull Configuration
Push Configuration
# Configure default push behavior
git config --global push.default simple
git config --global push.default current
git config --global push.default upstream
# Automatically set upstream
git config --global push.autoSetupRemote true
# Push all branches
git config --global push.default matching
Pull Configuration
# Configure pull behavior
git config --global pull.rebase true
git config --global pull.ff only
# Configure merge strategy
git config --global merge.ff false
git config --global merge.commit false
Advanced Configuration
Credential Management
# Configure credential helper
git config --global credential.helper cache
git config --global credential.helper 'cache --timeout=3600'
# Platform-specific helpers
git config --global credential.helper osxkeychain # macOS
git config --global credential.helper wincred # Windows
git config --global credential.helper store # Linux
# Configure for specific URLs
git config --global credential.https://github.com.username your-username
SSH Configuration
# Configure SSH for Git
git config --global url."git@github.com:".insteadOf "https://github.com/"
# SSH key configuration in ~/.ssh/config
Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa_github
Host gitlab.com
HostName gitlab.com
User git
IdentityFile ~/.ssh/id_rsa_gitlab
Performance Configuration
# Configure performance settings
git config --global core.preloadindex true
git config --global core.fscache true
git config --global gc.auto 256
# Configure pack settings
git config --global pack.threads 0
git config --global pack.windowMemory 256m
# Configure index settings
git config --global index.version 4
git config --global feature.manyFiles true
Conditional Configuration
Directory-Based Configuration
# Configure different settings for work/personal
git config --global includeIf.gitdir:~/work/.path ~/work/.gitconfig
git config --global includeIf.gitdir:~/personal/.path ~/personal/.gitconfig
# ~/work/.gitconfig
[user]
name = Work Name
email = work.email@company.com
# ~/personal/.gitconfig
[user]
name = Personal Name
email = personal.email@gmail.com
URL-Based Configuration
# Configure based on remote URL
git config --global includeIf.hasconfig:remote.*.url:https://github.com/company/*.path ~/company/.gitconfig
# Different settings for different Git providers
git config --global includeIf.hasconfig:remote.*.url:https://github.com/*.path ~/github/.gitconfig
git config --global includeIf.hasconfig:remote.*.url:https://gitlab.com/*.path ~/gitlab/.gitconfig
Hooks Configuration
Global Hooks
# Set global hooks directory
git config --global core.hooksPath ~/.githooks
# Create global hooks directory
mkdir -p ~/.githooks
# Make hooks executable
chmod +x ~/.githooks/pre-commit
chmod +x ~/.githooks/commit-msg
Hook Examples
Pre-commit Hook:
#!/bin/sh
# ~/.githooks/pre-commit
# Run linting
if command -v npm >/dev/null 2>&1; then
npm run lint
fi
# Check for debugging statements
if grep -r "console.log\|debugger" --include="*.js" .; then
echo "Warning: Debug statements found"
fi
Commit-msg Hook:
#!/bin/sh
# ~/.githooks/commit-msg
# Check commit message format
commit_regex='^(feat|fix|docs|style|refactor|test|chore)(\(.+\))?: .{1,50}'
if ! grep -qE "$commit_regex" "$1"; then
echo "Invalid commit message format"
echo "Use: type(scope): description"
exit 1
fi
Environment Variables
Git Environment Variables
# Editor configuration
export GIT_EDITOR=nano
export GIT_EDITOR=vim
export GIT_EDITOR="code --wait"
# Pager configuration
export GIT_PAGER=less
export GIT_PAGER="less -R"
# SSH configuration
export GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa_github"
# Debugging
export GIT_TRACE=1
export GIT_TRACE_PERFORMANCE=1
export GIT_TRACE_SETUP=1
Configuration Management
View Configuration
# List all configuration
git config --list
# List with sources
git config --list --show-origin
# Show specific config
git config user.name
git config --get user.name
# Show config for specific level
git config --global --list
git config --local --list
Edit Configuration
# Edit global configuration
git config --global --edit
# Edit local configuration
git config --local --edit
# Edit system configuration
sudo git config --system --edit
Remove Configuration
# Remove specific setting
git config --global --unset user.name
# Remove section
git config --global --remove-section alias
# Remove all settings for a key
git config --global --unset-all alias.l
Common Configuration Recipes
Developer Setup
# Complete developer setup
git config --global user.name "Your Name"
git config --global user.email "your.email@example.com"
git config --global init.defaultBranch main
git config --global core.editor "code --wait"
git config --global merge.tool vscode
git config --global diff.tool vscode
git config --global pull.rebase true
git config --global push.autoSetupRemote true
git config --global credential.helper cache
Team Lead Setup
# Team lead configuration
git config --global user.name "Team Lead"
git config --global user.email "lead@company.com"
git config --global core.hooksPath ~/.githooks
git config --global merge.ff false
git config --global branch.autoSetupRebase always
git config --global push.default current
git config --global rebase.autoStash true
Performance-Focused Setup
# Performance optimization
git config --global core.preloadindex true
git config --global core.fscache true
git config --global gc.auto 256
git config --global pack.threads 0
git config --global index.version 4
git config --global feature.manyFiles true
git config --global feature.experimental true
Troubleshooting Configuration
Common Issues
-
Configuration not taking effect
# Check configuration hierarchy
git config --list --show-origin
# Local config overrides global
git config --local --list -
Wrong user showing in commits
# Check current user config
git config user.name
git config user.email
# Fix for repository
git config --local user.name "Correct Name"
git config --local user.email "correct@email.com" -
Aliases not working
# Check alias configuration
git config --get-regexp alias
# Test alias
git config --global alias.test 'status'
git test
Configuration Validation
# Validate configuration
git config --list | grep -E "(user|core|push|pull)"
# Test configuration
git config --global --get-regexp "alias.*"
git config --global --get-regexp "core.*"
# Check for conflicting settings
git config --list --show-origin | grep "user.name"
Best Practices
Configuration Organization
- Use global for personal settings - User info, editor, aliases
- Use local for project-specific - Different email, hooks, workflows
- Use system sparingly - Only for organization-wide policies
- Document team configurations - Share useful settings
- Version control configurations - Keep dotfiles in Git
Security Considerations
- Never commit credentials - Use credential helpers
- Use SSH keys - More secure than passwords
- Protect hook scripts - Don't allow arbitrary code execution
- Review global settings - Understand what you're configuring
- Use conditional includes - Separate work/personal configurations
Maintenance
- Regular cleanup - Remove unused aliases and settings
- Update configurations - Keep up with new Git features
- Test changes - Verify configuration works as expected
- Backup configurations - Keep dotfiles in version control
- Document custom settings - Remember why you configured something
See Advanced Git for using these configurations in complex workflows and Troubleshooting for resolving configuration issues.