#Git History
Understanding and viewing project history is an important skill in Git. This chapter details how to view, analyze, and understand Git commit history.
#Basic History Viewing
#git log Basics
# View full commit history
git log
# View concise one-line history
git log --oneline
# Limit number of commits
git log -n 5
git log --oneline -10
# View graphical branch history
git log --graph
# Combined usage
git log --oneline --graph -10#Create Demo History
Let's create a project with rich history for demonstration:
# Create demo project
mkdir git-history-demo
cd git-history-demo
git init
# Create initial commit
echo "# Git History Demo Project" > README.md
git add README.md
git commit -m "Initial commit: Add README"
# Add more commits
echo "Project description" >> README.md
git add README.md
git commit -m "Update README: Add description"
echo "console.log('Hello World');" > app.js
git add app.js
git commit -m "Add main app file"
echo "body { margin: 0; }" > style.css
git add style.css
git commit -m "Add style file"#Detailed Log Options
#Formatting Output
# Custom format
git log --pretty=format:"%h - %an, %ar : %s"
# Common format options
git log --pretty=format:"%H" # Full hash
git log --pretty=format:"%h" # Short hash
git log --pretty=format:"%an" # Author name
git log --pretty=format:"%ae" # Author email
git log --pretty=format:"%ad" # Author date
git log --pretty=format:"%ar" # Relative date
git log --pretty=format:"%s" # Commit message
git log --pretty=format:"%b" # Commit body
# Beautified log format
git log --pretty=format:"%C(yellow)%h%C(reset) - %C(green)%an%C(reset), %C(blue)%ar%C(reset) : %s"#Time and Date Filtering
# View commits in specific period
git log --since="2 weeks ago"
git log --until="2023-12-01"
git log --since="2023-01-01" --until="2023-12-31"
# Relative time
git log --since="yesterday"
git log --since="1 week ago"
git log --since="2 months ago"
# Specific date format
git log --since="2023-01-01 00:00:00"
git log --after="Jan 1 2023" --before="Dec 31 2023"#Author and Committer Filtering
# Filter by author
git log --author="John Doe"
git log --author="john@example.com"
# Regex support
git log --author="John.*"
git log --author=".*@company.com"
# Filter by committer
git log --committer="Jane Doe"
# Exclude specific author
git log --author="^(?!.*John Doe).*$" --perl-regexp#Content Search
# Search commit messages
git log --grep="fix"
git log --grep="bug" --grep="fix" --all-match
# Search code changes
git log -S "function_name"
git log -G "regex"
# Search file content changes
git log -p -S "console.log"
# Ignore case
git log --grep="BUG" -i#File and Path Filtering
# View history of specific file
git log README.md
git log -- README.md # Safer syntax
# View multiple files
git log file1.txt file2.txt
# View directory history
git log src/
git log -- src/
# View deleted file history
git log --all --full-history -- deleted_file.txt#Advanced History Viewing
#Graphical History
# Basic branch graph
git log --graph --oneline
# Detailed branch graph
git log --graph --pretty=format:"%C(red)%h%C(reset) -%C(yellow)%d%C(reset) %s %C(green)(%cr) %C(bold blue)<%an>%C(reset)"
# View all branches
git log --graph --oneline --all
# Simplified branch graph
git log --graph --simplify-by-decoration --oneline --all#Statistics
# Show change stats
git log --stat
# Show short stats
git log --shortstat
# Show changed filenames only
git log --name-only
# Show file status
git log --name-status
# Show numeric stats
git log --numstat#Diff Display
# Show diff for each commit
git log -p
# Limit diff context lines
git log -p -U1
# Show diff for specific file only
git log -p -- file.txt
# Show word-level diff
git log -p --word-diff