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:

LevelScopeFile LocationCommand Flag
LocalSingle repository.git/config--local
GlobalCurrent user~/.gitconfig--global
SystemAll 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:

Git - Aliases & Shortcuts

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.