Catalypt LogoCatalypt.ai

Industry Focus

Developer Options

Resources

Back to Blog

AI Wrote My Git Commits for a Month. Here's What Happened

December 28, 2023 Josh Butler Workflows

"Let AI write your commit messages!" they said. "It'll save time!" they said. Fast forward one month: my git log looks like a Victorian novel, my teammates hate me, and I spent more time editing AI commits than I would have spent writing them.

But I learned something. Here's the journey from commit message hell to actually useful automation.

Week 1: The Optimistic Beginning

# What I changed: Fixed null pointer exception in user service

# What AI wrote:
"Rectified a critical software defect pertaining to null reference 
exceptions within the user service module, implementing robust null 
checking mechanisms to ensure system stability and prevent runtime 
errors that could potentially impact user experience and system 
reliability in production environments."

# What I wanted:
"Fix NPE in user service"

Every commit was a paragraph. The AI was trying to win a creative writing contest.

The Overcorrection

I told the AI to be more concise:

# What I changed: Refactored authentication flow, added OAuth support

# What AI wrote:
"Update code"

# Also AI:
"Fix bug"
"Change files"
"Modify implementation"
"Update stuff"

From Victorian novel to caveman grunts. No middle ground.

The Commit Message Hall of Fame

The Philosopher

"In the grand tapestry of software development, this commit represents 
a pivotal moment where the old gives way to the new, as we transition 
from callback-based asynchronous operations to the more elegant 
promise-based paradigm"

# Translation: "Convert callbacks to promises"

The Apologizer

"Fix unfortunate oversight in previous implementation where database 
connections were not being properly closed, leading to potential 
resource exhaustion. This commit humbly addresses this issue with 
sincere apologies for any inconvenience caused"

# Just say: "Fix database connection leak"

The Captain Obvious

"Add new file named UserController.js to the controllers directory 
which contains controller logic for user-related operations"

# Yeah, we can see that from the diff

What Good Commit Messages Actually Look Like

# Format that works:
type(scope): subject

body (optional)

footer (optional)

# Examples:
fix(auth): prevent race condition in token refresh

feat(api): add bulk user import endpoint
- Support CSV and JSON formats
- Validate email uniqueness
- Add progress tracking

refactor(db): optimize user query performance
Previously N+1 queries, now single JOIN

The AI Prompt That Finally Worked

Generate a git commit message:

Rules:
1. First line: type(scope): description (max 50 chars)
   - type: feat|fix|docs|style|refactor|test|chore
   - scope: component or area affected
   - description: imperative mood, lowercase

2. Body (if needed): What and why, not how (wrap at 72 chars)

3. No fluff words: "basically", "simply", "just"
4. No apologizing or philosophy
5. Focus on WHAT changed and WHY, not HOW

Diff: [git diff content]

Week 3: Finding the Balance

AI commits started looking reasonable:

feat(payments): integrate Stripe payment processing

fix(ui): resolve modal z-index conflict with dropdown

refactor(api): extract validation logic to middleware

docs(readme): add troubleshooting section for Docker issues

But then came the edge cases...

When AI Commits Go Wrong

The Security Leak

# AI generated:
"fix(config): update database connection string to use production 
credentials (postgresql://admin:[email protected]:5432)"

# DON'T PUT SECRETS IN COMMIT MESSAGES

The Wrong Attribution

# I fixed a bug. AI wrote:
"feat(auth): add new authentication system"

# My team: "Where's the new auth system?'
# Me: "It's... a bug fix'

The Merge Commit Disaster

# Default merge message:
"Merge branch 'feature/user-profile' into develop"

# AI "improvement":
"Harmoniously integrate the culmination of user profile enhancements 
into the primary development branch, representing a significant 
milestone in our journey towards a more user-centric application"

The Conventional Commits That Work

# Bug fixes
fix(auth): check token expiry before refresh
fix(ui): prevent form submission on enter in textarea
fix(api): handle null response from external service

# Features  
feat(users): implement soft delete
feat(search): add fuzzy matching
feat(export): support PDF generation

# Refactoring
refactor(db): consolidate duplicate queries
refactor(utils): simplify date formatting logic
refactor(components): extract shared button styles

# Documentation
docs(api): document rate limiting behavior
docs(setup): clarify Node version requirement
docs(contrib): add commit message guidelines

The Commit Message Antipatterns

  • "WIP" (on main branch)
  • "Fix stuff" (what stuff?)
  • "asdfasdf\" (keyboard mash)
  • "Final commit" (it never is)
  • "Actually final commit"
  • "OK this time really final"
  • Copy-pasting the entire PR description

Week 4: The Hybrid Approach

What actually works:

" "
# 1. AI analyzes the diff
git diff | ai analyze

# 2. AI suggests a commit message
"Suggested: fix(auth): prevent concurrent login sessions"

# 3. Human decides to accept, edit, or rewrite
# (Usually needs minor edits)

# 4. AI learns from corrections
# (Theoretically... mostly it doesn't)

The ROI Analysis

Time "saved" by AI commits: 2 min/commit × 150 commits = 5 hours

Time spent:
- Setting up AI tooling: 2 hours
- Tweaking prompts: 3 hours  
- Editing bad commits: 4 hours
- Explaining to team: 1 hour
- Fixing leaked secrets: 2 hours

Net time saved: -7 hours 😭

When AI Commits Actually Help

  1. Large refactoring - AI can summarize many changes
  2. Documentation updates - Good at describing what changed
  3. Dependency updates - Clear, formulaic messages
  4. Generated code changes - Explains the generation

The Final Workflow

#!/bin/bash
# commit-ai.sh

# Get diff
DIFF=$(git diff --staged)

# Get AI suggestion
SUGGESTION=$(echo "$DIFF" | ai-commit-message)

# Show suggestion
echo "AI suggests: $SUGGESTION"
echo "Accept? (y/n/e for edit)"

read RESPONSE
case $RESPONSE in
  y) git commit -m "$SUGGESTION" ;;
  e) git commit -e -m "$SUGGESTION" ;;
  n) git commit ;;
esac

Lessons Learned

  1. AI is bad at context (was it a fix or a feature?)
  2. AI is verbose by nature (trained on documentation)
  3. AI doesn't understand your team's conventions
  4. But AI is good at summarizing changes
  5. Human review is non-negotiable

The Happy Middle Ground

Now I use AI for:

  • Suggesting the type and scope
  • Summarizing large diffs
  • Reminding me about conventional format
  • Catching when I forgot to mention breaking changes

But I write the actual message. It's faster than editing AI's purple prose.

AI writing commit messages is like having a very eager intern who read every git best practices article but has never actually worked on a team. Helpful for suggestions, terrible at understanding context, and occasionally commits your passwords to the repo history. Use it as a tool, not a replacement for thinking. And please, for the love of Linus, don't let it write merge commit messages.

Get Started