Git - Configuration
Intermediate
Git configuration controls how Git behaves in different situations. Understanding configuration levels, options, and customization can dramatically improve your Git workflow efficiency.
Configuration Levels
Git has three configuration levels, listed in order of precedence:
Level | Scope | File Location | Command Flag |
---|---|---|---|
Local | Single repository | .git/config | --local |
Global | Current user | ~/.gitconfig | --global |
System | All users | /etc/gitconfig | --system |
# Local overrides global, global overrides system
Local: .git/config ← Highest priority
Global: ~/.gitconfig ← Medium priority
System: /etc/gitconfig ← Lowest priority
Basic Configuration Commands
Setting Configuration Values
# Set global configuration (most common)
git config --global user.name "John Doe"
git config --global user.email "[email protected]"
# Set local configuration (repository-specific)
git config --local user.email "[email protected]"
# Set system configuration (requires admin privileges)
sudo git config --system core.editor vim
Reading Configuration Values
# Get specific value
git config user.name
git config --global user.email
# Get all configuration
git config --list
# Get configuration with origins
git config --list --show-origin
# Get configuration for specific level
git config --global --list
Configuration list output:
user.name=John Doe
[email protected]
core.editor=vim
core.autocrlf=input
push.default=simple
pull.rebase=false
Removing Configuration
# Remove specific configuration
git config --global --unset user.email
# Remove section
git config --global --remove-section user
# Edit configuration file directly
git config --global --edit
Essential Configuration Settings
User Identity
# Required for commits
git config --global user.name "Your Full Name"
git config --global user.email "[email protected]"
# Verify settings
git config user.name
git config user.email
Default Editor
# Set default editor for commit messages
git config --global core.editor "code --wait" # VS Code
git config --global core.editor vim # Vim
git config --global core.editor nano # Nano
git config --global core.editor "subl -n -w" # Sublime Text
Line Ending Configuration
# Windows (convert LF to CRLF on checkout)
git config --global core.autocrlf true
# macOS/Linux (convert CRLF to LF on commit)
git config --global core.autocrlf input
# No conversion (use as-is)
git config --global core.autocrlf false
Branch and Merge Configuration
Default Branch Settings
# Set default branch name for new repositories
git config --global init.defaultBranch main
# Auto-setup tracking branches
git config --global branch.autosetupmerge always
git config --global branch.autosetuprebase always
Push Configuration
# Only push current branch
git config --global push.default simple
# Push all matching branches
git config --global push.default matching
# Always push with lease for safety
git config --global push.default current
git config --global push.useForceWithLease true
Pull Configuration
# Default pull behavior
git config --global pull.rebase false # Merge (default)
git config --global pull.rebase true # Rebase
git config --global pull.ff only # Fast-forward only
# Auto-prune deleted remote branches
git config --global fetch.prune true
Git Aliases
Aliases create shortcuts for frequently used commands:
Basic Aliases
# Basic command aliases
git config --global alias.st status
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
# Now you can use short commands
git st # git status
git co main # git checkout main
git br -a # git branch -a
Advanced Aliases
# Log aliases
git config --global alias.lg "log --oneline --graph --decorate"
git config --global alias.lga "log --oneline --graph --decorate --all"
git config --global alias.hist "log --pretty=format:'%h %ad | %s%d [%an]' --graph --date=short"
# Status and diff aliases
git config --global alias.unstage "reset HEAD --"
git config --global alias.last "log -1 HEAD"
git config --global alias.visual "!gitk"
Complex Aliases with Shell Commands
# Aliases that run shell commands (prefix with !)
git config --global alias.root "!pwd"
git config --global alias.today "!git log --since='midnight' --author=\"$(git config user.name)\" --oneline"
git config --global alias.contributors "!git log --format='%aN' | sort -u"
# Function aliases
git config --global alias.ignore "!gi() { curl -L -s https://www.gitignore.io/api/\$@ ;}; gi"
git config --global alias.sync "!f() { git checkout \$1 && git pull origin \$1; }; f"
Color Configuration
# Enable color output
git config --global color.ui auto
# Specific color settings
git config --global color.branch auto
git config --global color.diff auto
git config --global color.status auto
# Custom colors
git config --global color.diff.meta "blue bold"
git config --global color.diff.frag "magenta bold"
git config --global color.diff.old "red bold"
git config --global color.diff.new "green bold"
Security Configuration
Signing Commits
# Configure GPG signing
git config --global user.signingkey YOUR_GPG_KEY_ID
git config --global commit.gpgsign true
git config --global tag.gpgsign true
# Configure SSH signing (Git 2.34+)
git config --global gpg.format ssh
git config --global user.signingkey ~/.ssh/id_ed25519.pub
git config --global commit.gpgsign true
Security Settings
# Disable auto-merge of notes
git config --global notes.mergeStrategy manual
# Configure safe directories
git config --global --add safe.directory /path/to/repo
# Set credential helper
git config --global credential.helper store # Not recommended
git config --global credential.helper cache # Temporary cache
Performance Configuration
Repository Optimization
# Parallel processing
git config --global pack.threads 0 # Use all available cores
git config --global index.threads 0
git config --global checkout.workers 0
# Memory settings
git config --global pack.windowMemory 256m
git config --global pack.packSizeLimit 1g
# Compression
git config --global core.compression 9
git config --global core.loosecompression 1
Network Settings
# HTTP settings
git config --global http.postBuffer 524288000 # 500MB
git config --global http.maxRequestBuffer 100M
git config --global http.timeout 60
# SSH settings
git config --global core.sshCommand "ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no"
Workflow-Specific Configuration
Development Environment
# IDE integration
git config --global core.editor "code --wait"
git config --global diff.tool vscode
git config --global difftool.vscode.cmd 'code --wait --diff $LOCAL $REMOTE'
git config --global merge.tool vscode
git config --global mergetool.vscode.cmd 'code --wait $MERGED'
Team Collaboration
# Consistent line endings
git config --global core.autocrlf input
# Consistent file modes
git config --global core.filemode false
# Reuse conflict resolutions
git config --global rerere.enabled true
git config --global rerere.autoupdate true
Conditional Configuration
Configure different settings for different contexts:
Include configurations based on directory:
# In ~/.gitconfig
[includeIf "gitdir:~/work/"]
path = ~/work/.gitconfig
[includeIf "gitdir:~/personal/"]
path = ~/personal/.gitconfig
Work-specific configuration (~/work/.gitconfig):
[user]
name = John Doe
email = [email protected]
signingkey = WORK_GPG_KEY
[core]
sshCommand = ssh -i ~/.ssh/work_key
Configuration File Examples
Complete ~/.gitconfig Example
[user]
name = John Doe
email = [email protected]
signingkey = ABC123DEF456
[core]
editor = code --wait
autocrlf = input
compression = 9
[init]
defaultBranch = main
[push]
default = simple
useForceWithLease = true
[pull]
rebase = false
[branch]
autosetupmerge = always
[fetch]
prune = true
[color]
ui = auto
[alias]
st = status
co = checkout
br = branch
ci = commit
lg = log --oneline --graph --decorate
unstage = reset HEAD --
last = log -1 HEAD
[rerere]
enabled = true
autoupdate = true
[commit]
gpgsign = true
Configuration Management
Backup and Restore
# Backup configuration
cp ~/.gitconfig ~/.gitconfig.backup
# Export specific configuration
git config --global --list > gitconfig-backup.txt
# Import configuration
git config --global --file=gitconfig-backup.txt --replace-all
Multiple Git Identities
Setup script for switching identities:
#!/bin/bash
# git-identity.sh
if [ "$1" = "work" ]; then
git config user.name "John Doe"
git config user.email "[email protected]"
git config user.signingkey "WORK_KEY"
elif [ "$1" = "personal" ]; then
git config user.name "John"
git config user.email "[email protected]"
git config user.signingkey "PERSONAL_KEY"
else
echo "Usage: git-identity.sh [work|personal]"
fi
Troubleshooting Configuration
Common Issues
# Check where configuration is coming from
git config --show-origin user.name
# Debug configuration loading
git config --list --show-origin | grep user.name
# Validate configuration
git config --get-regexp user.*
# Reset configuration to defaults
git config --global --unset-all user.name
git config --global --unset-all user.email
Configuration Conflicts
# Find conflicting settings
git config --list | grep -E "(user\.name|user\.email)" | sort | uniq -c
# Check effective configuration
git config --get user.name
git config --get user.email
# Edit configuration directly
git config --global --edit
Best Practices
Configuration Strategy
- ✅ Set global defaults for common settings
- ✅ Use local config for repository-specific needs
- ✅ Keep sensitive data out of shared configurations
- ✅ Document team configuration standards
- ✅ Use aliases for frequently used commands
- ✅ Test configuration changes in isolation
Security Considerations
- ✅ Use SSH keys instead of passwords
- ✅ Enable commit signing for important repositories
- ✅ Keep credentials out of configuration files
- ✅ Use credential helpers for secure storage
- ❌ Never commit configuration with secrets
Summary
You now understand Git configuration:
- ✅ Configuration levels: local, global, system
- ✅ Essential settings for user identity and workflow
- ✅ Aliases for improved productivity
- ✅ Security configuration for signing and credentials
- ✅ Performance tuning for large repositories
- ✅ Conditional configuration for different contexts
- ✅ Troubleshooting configuration issues
Next Steps
Now that you understand configuration, let's explore Git aliases and shortcuts in detail:
Practice Tip: Start with basic global configuration, then gradually add aliases and workflow-specific settings as you identify repetitive tasks in your daily Git usage.