Skip to main content

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

  1. Configuration not taking effect

    # Check configuration hierarchy
    git config --list --show-origin

    # Local config overrides global
    git config --local --list
  2. 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"
  3. 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

  1. Use global for personal settings - User info, editor, aliases
  2. Use local for project-specific - Different email, hooks, workflows
  3. Use system sparingly - Only for organization-wide policies
  4. Document team configurations - Share useful settings
  5. Version control configurations - Keep dotfiles in Git

Security Considerations

  1. Never commit credentials - Use credential helpers
  2. Use SSH keys - More secure than passwords
  3. Protect hook scripts - Don't allow arbitrary code execution
  4. Review global settings - Understand what you're configuring
  5. Use conditional includes - Separate work/personal configurations

Maintenance

  1. Regular cleanup - Remove unused aliases and settings
  2. Update configurations - Keep up with new Git features
  3. Test changes - Verify configuration works as expected
  4. Backup configurations - Keep dotfiles in version control
  5. Document custom settings - Remember why you configured something

See Advanced Git for using these configurations in complex workflows and Troubleshooting for resolving configuration issues.