Git Configuration Guide
Git configuration is essential for proper version control setup and personalized development workflows. This comprehensive guide covers initial setup, advanced configuration options, security settings, and best practices for managing Git configurations across different environments.
Initial Setup and Basic Configuration
Essential First-Time Configuration
Every time Git is used for the first time, two basic configurations must be set: your name and email address. This information is used to identify your actions in the repository and appears in commit metadata¹:
# Set your global name and email
git config --global user.name "First I Last"
git config --global user.email "first.last@gmail.com"
# Verify your configuration
git config --global --list
Default Branch Configuration
Modern Git repositories commonly use main
instead of master
as the default branch name². When creating a new repository from the CLI, you may see the following message:
$ git init
hint: Using 'master' as the name for the initial branch. This default branch name
hint: is subject to change. To configure the initial branch name to use in all
hint: of your new repositories, which will suppress this warning, call:
hint:
hint: git config --global init.defaultBranch <name>
hint:
hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and
hint: 'development'. The just-created branch can be renamed via this command:
hint:
hint: git branch -m <name>
Initialized empty Git repository in /home/hades/Documents/repos/AzureTerraform/.git/
To configure the default branch name globally:
# Set 'main' as the default branch for new repositories
git config --global init.defaultBranch main
# Alternative common names
git config --global init.defaultBranch trunk
git config --global init.defaultBranch develop
Line Ending Configuration
Configure line ending handling to prevent cross-platform issues³:
# Windows users
git config --global core.autocrlf true
# Linux/Mac users
git config --global core.autocrlf input
# Universal approach (recommended)
git config --global core.autocrlf false
git config --global core.eol lf
Configuration Scopes and Hierarchy
Git configuration operates on a hierarchical system with three main scopes⁴:
Configuration Levels
System (
--system
): Applies to every user and repository on the system- Location:
/etc/gitconfig
(Linux/Mac),C:\Program Files\Git\etc\gitconfig
(Windows) - Requires administrative privileges to modify
- Location:
Global (
--global
): Applies to all repositories for the current user- Location:
~/.gitconfig
or~/.config/git/config
- Most commonly used for personal settings
- Location:
Local (
--local
): Applies only to the current repository- Location:
.git/config
within the repository - Takes precedence over global and system settings
- Location:
Worktree: Applies to specific worktrees (Git 2.32+)
- Location:
.git/config.worktree
- Highest precedence for worktree-specific settings
- Location:
Viewing Configuration Hierarchy
# View all configuration with sources
git config --list --show-origin
# View configuration for specific scope
git config --system --list
git config --global --list
git config --local --list
# Check specific configuration value and its source
git config --show-origin user.name
# List all configuration files Git would read
git config --list --show-scope
Advanced Configuration Options
Core Settings
Editor Configuration
# Set default text 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 "notepad" # Windows Notepad
git config --global core.editor "'C:\Program Files\Notepad++\notepad++.exe' -multiInst -notabbar -nosession -noPlugin" # Notepad++
Pager Configuration
# Configure pager for Git output
git config --global core.pager "less -R" # Default
git config --global core.pager "more" # Alternative
git config --global core.pager "" # Disable pager
# Configure specific command pagers
git config --global pager.branch false # Disable pager for git branch
git config --global pager.log "less -S" # Horizontal scrolling for git log
File Handling
# Configure file mode tracking (useful on Windows)
git config --global core.filemode false
# Set default file permissions for new files
git config --global core.sharedrepository group
# Configure symlink handling
git config --global core.symlinks true
# Set up .gitignore handling
git config --global core.excludesfile ~/.gitignore_global
User Interface and Display
Color Configuration
# Enable colored output globally
git config --global color.ui auto
# Configure specific command colors
git config --global color.branch auto
git config --global color.diff auto
git config --global color.status auto
git config --global color.interactive auto
# Customize color schemes
git config --global color.diff.meta "yellow 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"
git config --global color.status.added "yellow"
git config --global color.status.changed "green"
git config --global color.status.untracked "cyan"
Display Configuration
# Configure branch and tag display
git config --global column.ui auto
git config --global column.branch auto
git config --global column.tag auto
# Configure sorting
git config --global branch.sort -committerdate
git config --global tag.sort version:refname
# Configure git log formatting
git config --global format.pretty "format:%C(yellow)%h%C(reset) %C(blue)%an%C(reset) %C(cyan)%ar%C(reset) %s"
Performance and Behavior
Fetch and Pull Configuration
# Configure default pull behavior (Git 2.27+)
git config --global pull.rebase false # Merge (default)
git config --global pull.rebase true # Rebase
git config --global pull.ff only # Fast-forward only
# Configure fetch behavior
git config --global fetch.prune true # Auto-prune deleted remote branches
git config --global fetch.prunetags true # Auto-prune deleted remote tags
# Configure push behavior
git config --global push.default simple # Push current branch to same name
git config --global push.followtags true # Push annotated tags with commits
Merge and Diff Configuration
# Configure merge tool
git config --global merge.tool vimdiff
git config --global merge.tool "code --wait"
git config --global merge.tool meld
# Configure diff tool
git config --global diff.tool vimdiff
git config --global diff.tool "code --wait --diff"
# Configure merge behavior
git config --global merge.ff false # Always create merge commits
git config --global merge.conflictstyle diff3 # Show common ancestor in conflicts
# Configure rerere (reuse recorded resolution)
git config --global rerere.enabled true
git config --global rerere.autoupdate true
Security and Authentication
GPG Signing Configuration
Configure Git to sign commits and tags with GPG for authenticity verification⁵:
# Configure GPG signing
git config --global user.signingkey [GPG-KEY-ID]
git config --global commit.gpgsign true
git config --global tag.gpgsign true
# Configure GPG program location (if needed)
git config --global gpg.program gpg2
git config --global gpg.program "C:\Program Files (x86)\GnuPG\bin\gpg.exe" # Windows
# Set up SSH signing (Git 2.34+)
git config --global gpg.format ssh
git config --global user.signingkey ~/.ssh/id_ed25519.pub
git config --global gpg.ssh.allowedSignersFile ~/.ssh/allowed_signers
Credential Management
# Configure credential helper
git config --global credential.helper store # Store in plain text (less secure)
git config --global credential.helper cache # Cache in memory
git config --global credential.helper cache --timeout=3600 # Cache for 1 hour
# Windows Credential Manager
git config --global credential.helper manager-core
# macOS Keychain
git config --global credential.helper osxkeychain
# Configure credential helper for specific hosts
git config --global credential.https://github.com.helper store
git config --global credential.https://gitlab.com.username yourusername
Security Best Practices
# Configure safe directories (Git 2.35.2+)
git config --global safe.directory '*'
git config --global safe.directory /path/to/trusted/repo
# Configure protocol restrictions
git config --global protocol.version 2
git config --global protocol.file.allow always
git config --global protocol.git.allow user
git config --global protocol.ssh.allow always
git config --global protocol.https.allow always
git config --global protocol.http.allow user
# Configure transfer security
git config --global transfer.fsckobjects true
git config --global fetch.fsckobjects true
git config --global receive.fsckObjects true
Conditional Configuration
Directory-Based Configuration
You can use conditional includes to apply different Git configurations based on the directory. This is useful for separating work and personal projects⁶:
# Example: Add these lines to your ~/.gitconfig
[includeIf "gitdir:~/projects/work/"]
path = ~/projects/work/.gitconfig
[includeIf "gitdir:~/projects/personal/"]
path = ~/projects/personal/.gitconfig
[includeIf "gitdir:/company/repos/"]
path = /company/shared/.gitconfig
# Conditional includes also support onbranch conditions (Git 2.29+)
[includeIf "onbranch:feature/*"]
path = ~/.config/git/feature-branch-config
Work Configuration Example
Contents of ~/projects/work/.gitconfig
:
[user]
email = first.last@company.com
name = First Last
[commit]
gpgsign = true
template = ~/.gitmessage-work
[core]
hooksPath = ~/projects/work/.git-hooks
[url "git@github-work:company/"]
insteadOf = git@github.com:company/
insteadOf = https://github.com/company/
[push]
default = current
[pull]
rebase = true
Personal Configuration Example
Contents of ~/projects/personal/.gitconfig
:
[user]
email = first.last@gmail.com
name = First Last
[commit]
gpgsign = false
template = ~/.gitmessage-personal
[core]
hooksPath = ~/projects/personal/.git-hooks
[url "git@github.com:personal-username/"]
insteadOf = git@github.com:personal-username/
[push]
default = simple
[pull]
ff = only
Host-Based Configuration
# Configure different settings for different Git hosts
[includeIf "hasconfig:remote.*.url:https://github.com/**"]
path = ~/.config/git/github-config
[includeIf "hasconfig:remote.*.url:https://gitlab.com/**"]
path = ~/.config/git/gitlab-config
[includeIf "hasconfig:remote.*.url:git@bitbucket.org:**"]
path = ~/.config/git/bitbucket-config
Aliases and Shortcuts
Essential 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
git config --global alias.sw switch
# Advanced aliases
git config --global alias.unstage 'reset HEAD --'
git config --global alias.last 'log -1 HEAD'
git config --global alias.visual '!gitk'
git config --global alias.tree 'log --graph --pretty=format:"%C(red)%h%C(reset) -%C(yellow)%d%C(reset) %s %C(green)(%cr) %C(bold blue)<%an>%C(reset)" --abbrev-commit'
# Cleanup aliases
git config --global alias.cleanup-merged 'branch --merged | grep -v "\*\|main\|master\|develop" | xargs -n 1 git branch -d'
git config --global alias.cleanup-remote 'remote prune origin'
# Information aliases
git config --global alias.contributors 'shortlog --summary --numbered'
git config --global alias.filechanges 'log --follow -p --'
git config --global alias.find-merge 'log --merges --grep'
Complex Aliases with Shell Commands
# Aliases using shell commands
git config --global alias.ignore '!gi() { curl -sL https://www.toptal.com/developers/gitignore/api/$@ ;}; gi'
git config --global alias.root 'rev-parse --show-toplevel'
git config --global alias.exec '!exec '
# Interactive aliases
git config --global alias.fixup '!git log --oneline -n 20 | fzf | cut -d" " -f1 | xargs -r git commit --fixup'
git config --global alias.choose-commit '!git log --oneline | head -20 | cat -n | read -p "Choose commit: " choice && git show $(sed -n "${choice}p" | cut -f2)'
URL Rewriting and Remote Configuration
URL Rewriting
# Rewrite HTTPS URLs to SSH for better authentication
git config --global url."git@github.com:".insteadOf "https://github.com/"
git config --global url."git@gitlab.com:".insteadOf "https://gitlab.com/"
# Use different SSH keys for different hosts
git config --global url."git@github-work:".insteadOf "git@github.com:"
git config --global url."git@github-personal:".insteadOf "git@github.com:"
# Enterprise configurations
git config --global url."https://enterprise.company.com/".insteadOf "git://enterprise.company.com/"
SSH Configuration
Configure SSH hosts in ~/.ssh/config
:
# Work GitHub account
Host github-work
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa_work
IdentitiesOnly yes
# Personal GitHub account
Host github-personal
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa_personal
IdentitiesOnly yes
Hook Configuration
Global Hooks
# Set global hooks directory
git config --global core.hooksPath ~/.git-hooks
# Configure individual hook behavior
git config --global receive.denyCurrentBranch warn
git config --global receive.denyNonFastForwards true
git config --global receive.denyDeletes true
Template Directory
# Set up template directory for new repositories
git config --global init.templatedir ~/.git-template
# Create template structure
mkdir -p ~/.git-template/hooks
mkdir -p ~/.git-template/info
mkdir -p ~/.git-template/description
Configuration Management
Editing Configuration
Command Line Editing
# Edit global configuration file directly
git config --global --edit
# Edit local repository configuration
git config --local --edit
# Edit system configuration (requires admin)
git config --system --edit
Direct File Editing
# Open global config in preferred editor
$EDITOR ~/.gitconfig
vim ~/.gitconfig
code ~/.gitconfig
# Location varies by system:
# Linux/Mac: ~/.gitconfig or ~/.config/git/config
# Windows: %USERPROFILE%\.gitconfig or %APPDATA%\git\config
Configuration Inspection
Viewing Current Configuration
# View all configuration with sources and scope
git config --list --show-origin --show-scope
# View configuration for specific section
git config --get-regexp user
git config --get-regexp color
git config --get-regexp alias
# Check if specific configuration exists
git config --get user.name
git config --get-regex "remote\..*\.url"
# View effective configuration (after includes)
git config --list
Configuration Validation
# Test conditional includes
git config --list --show-origin | grep -E "(work|personal)"
# Validate configuration syntax
git config --list >/dev/null && echo "Configuration valid" || echo "Configuration has errors"
# Check for duplicate configurations
git config --list | sort | uniq -d
Configuration Backup and Portability
Backup Configuration
# Backup global configuration
cp ~/.gitconfig ~/.gitconfig.backup.$(date +%Y%m%d)
# Export specific configuration sections
git config --global --get-regexp alias > ~/git-aliases-backup.txt
git config --global --get-regexp user > ~/git-user-backup.txt
# Create portable configuration
git config --list --global > ~/portable-git-config.txt
Restore Configuration
# Restore from backup
cp ~/.gitconfig.backup.20241018 ~/.gitconfig
# Import configuration from file
while read line; do
key=$(echo $line | cut -d= -f1)
value=$(echo $line | cut -d= -f2-)
git config --global "$key" "$value"
done < portable-git-config.txt
Troubleshooting Configuration
Common Configuration Issues
Configuration Not Taking Effect
# Check configuration precedence
git config --list --show-origin | grep "setting-name"
# Clear configuration at specific level
git config --global --unset user.name
git config --local --unset-all remote.origin.url
# Remove entire configuration section
git config --global --remove-section alias
Conditional Configuration Problems
# Debug conditional includes
GIT_CONFIG_TRACE=1 git config --list
# Test directory matching
git config --show-origin --get user.email
# Verify gitdir patterns
echo "Current directory: $(pwd)"
git config --show-origin --list | grep includeIf
Authentication Issues
# Clear credential cache
git config --global --unset credential.helper
git credential-manager-core delete https://github.com
# Test credential helper
git credential fill <<EOF
protocol=https
host=github.com
username=your-username
EOF
# Debug credential helpers
GIT_CURL_VERBOSE=1 git fetch
Performance Issues
# Disable expensive operations
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 4
git config --global pack.windowMemory 256m
# Optimize for large repositories
git config --global feature.manyFiles true
git config --global index.version 4
Platform-Specific Configuration
Windows-Specific Settings
# Configure line endings for Windows
git config --global core.autocrlf true
git config --global core.safecrlf warn
# Configure file system case sensitivity
git config --global core.ignorecase true
# Configure symbolic links (requires developer mode)
git config --global core.symlinks true
# Configure long path support (Windows 10+)
git config --global core.longpaths true
# Configure Windows Credential Manager
git config --global credential.helper manager-core
Linux/Unix-Specific Settings
# Configure for case-sensitive file systems
git config --global core.ignorecase false
# Configure symbolic link handling
git config --global core.symlinks true
# Configure file permissions
git config --global core.filemode true
git config --global core.sharedrepository group
# Configure credential helper
git config --global credential.helper cache --timeout=3600
macOS-Specific Settings
# Configure macOS Keychain integration
git config --global credential.helper osxkeychain
# Configure for HFS+ case insensitivity
git config --global core.ignorecase true
# Configure Homebrew Git location
git config --global core.editor "/usr/local/bin/code --wait"
Best Practices and Guidelines
Configuration Organization
- Use global configuration sparingly: Only set truly global settings
- Leverage conditional includes: Separate work and personal configurations
- Document custom configurations: Comment your .gitconfig file
- Use descriptive alias names: Make aliases self-explanatory
- Regularly audit configurations: Remove unused or deprecated settings
Security Considerations
- Enable GPG signing: For commit authenticity
- Use credential helpers: Avoid storing passwords in plain text
- Configure safe directories: Prevent privilege escalation
- Enable transfer checks: Validate object integrity
- Review URL rewrites: Ensure they don't introduce vulnerabilities
Performance Optimization
- Enable file system cache: Improve performance on Windows
- Configure appropriate pack settings: For repository size
- Use shallow clones: When full history isn't needed
- Enable preload index: For better performance
- Configure garbage collection: Manage repository size
Team Collaboration
- Standardize core settings: Line endings, file modes
- Share hook configurations: Consistent validation across team
- Document team-specific aliases: Share useful shortcuts
- Coordinate signing policies: Consistent security practices
- Establish merge strategies: Unified approach to integration
Footnotes and References
¹ Git User Configuration: Git Documentation Team. (2024). git-config Manual - user.name and user.email. Available at: Git Config User Settings
² Default Branch Naming: GitHub, Inc. (2020). Renaming the default branch from master. Available at: GitHub Default Branch
³ Line Ending Configuration: Atlassian. (2024). Configuring Git to handle line endings. Available at: Line Endings Guide
⁴ Configuration Hierarchy: Chacon, S., & Straub, B. (2014). Pro Git - Git Configuration. Available at: Git Configuration Hierarchy
⁵ GPG Signing: GitHub, Inc. (2024). Signing commits with GPG. Available at: GitHub GPG Signing
⁶ Conditional Configuration: Git Documentation Team. (2024). git-config Manual - Conditional includes. Available at: Conditional Includes
Additional Resources
Official Documentation
- Git Configuration Documentation
- Pro Git Book - Customizing Git
- Git Manual Pages
- Git Reference Manual
Platform-Specific Resources
- GitHub Configuration Guide
- GitLab Configuration Documentation
- Atlassian Git Configuration Tutorials
- Azure DevOps Git Configuration
Tools and Utilities
- Git Configuration Generator
- Gitconfig Examples Repository
- Git Hooks Framework
- Git Credential Manager