Skip to main content

Git Notes

Introduction

Git notes are a powerful but often overlooked feature in Git that allows you to add or edit metadata for any commit without altering the commit itself or the repository history. Think of Git notes as Post-it notes that you can attach to commits - they provide additional information without modifying the original content.

Unlike amending a commit (which changes the commit hash) or adding a new commit with comments (which changes the history), Git notes add information to a commit in a way that doesn't affect the commit's identity or the repository's integrity.

Understanding Git Notes

What Are Git Notes?

Git notes are metadata that:

  • Can be added to any commit
  • Don't change the commit hash
  • Are stored separately from commits
  • Can be shared (or not shared) with others
  • Can be edited or removed without affecting the commit

The Notes Namespace

Git notes are organized using namespaces. By default, Git uses the "commits" namespace, but you can create and manage multiple namespaces for different types of metadata.

Basic Git Notes Commands

Adding a Note to a Commit

To add a note to the most recent commit:

bash
git notes add -m "This commit fixes the login button styling issue"

To add a note to a specific commit:

bash
git notes add -m "Important security patch" 9c1533b

The output won't show any confirmation, but the note has been added.

Viewing Notes

To see the notes attached to commits when viewing the log:

bash
git log --show-notes

Example output:

commit 9c1533b6a6d97a74bd0998553a6e98eb9964a29e
Author: Jane Developer <[email protected]>
Date: Mon Oct 21 14:53:12 2024 -0500

Fix button alignment in navbar

Notes:
Important security patch

To view notes for a specific commit:

bash
git notes show 9c1533b

Output:

Important security patch

Editing Notes

To edit an existing note:

bash
git notes edit 9c1533b

This will open your default text editor where you can modify the note content.

Removing Notes

To remove a note from a commit:

bash
git notes remove 9c1533b

Advanced Git Notes Usage

Using Custom Namespaces

You can create and manage notes in different namespaces:

bash
# Add a note in the "code-review" namespace
git notes --ref=code-review add -m "Reviewed by: Alex - Approved" 9c1533b

# View notes in the "code-review" namespace
git notes --ref=code-review show 9c1533b

This helps organize different types of metadata (like code reviews, build information, or deployment details).

Listing All Notes

To list all the notes in a repository:

bash
git notes list

Example output:

9c1533b6a6d97a74bd0998553a6e98eb9964a29e
a72f3bc9d437c98122f432a8a1c016c45e1127e0

Working with Multiple Namespaces

To list all available note namespaces:

bash
git notes --ref

Output might look like:

refs/notes/commits
refs/notes/code-review
refs/notes/build-info

Merging Notes from Others

If teammates have added notes, you can pull and merge their notes:

bash
# Fetch notes from origin
git fetch origin refs/notes/*:refs/notes/*

# Merge notes, keeping both in case of conflicts
git notes merge --strategy=cat_sort_uniq

Practical Use Cases for Git Notes

Code Review Information

Store review feedback without polluting commit messages:

bash
git notes --ref=code-review add -m "Reviewer: Sarah Johnson
- Approved with minor suggestions
- Consider refactoring the authentication logic
- Good test coverage" 3f7a921

Build and Deployment Metadata

Track build or deployment information:

bash
git notes --ref=build-info add -m "Build #4721
- Passed all CI tests
- Deployed to staging on 2024-10-22
- Performance metrics: 97/100" 8c6d45f

Documentation References

Link commits to documentation or requirements:

bash
git notes add -m "Implements requirement REQ-127 from the specification document v2.3" 6a9b2c3

Issue Tracker Integration

Connect commits to issue tracker entries:

bash
git notes add -m "Fixes issues: PROJ-235, PROJ-241
QA verified on 2024-10-23" a72f3bc

Sharing Notes with Others

By default, Git notes are not automatically pushed to remote repositories. You need to explicitly push them:

bash
# Push all notes to the remote repository
git push origin refs/notes/*

# Push only a specific namespace
git push origin refs/notes/code-review

To configure Git to automatically push notes:

bash
git config --add remote.origin.push refs/notes/*

Notes vs. Commit Messages

Understanding when to use notes versus commit messages:

Information TypeCommit MessageGit Notes
What changed
Why it changed
Implementation details
Review feedback
Build information
Post-commit discoveries
Documentation links

Potential Pitfalls and Solutions

Note Conflicts

If multiple team members add different notes to the same commit:

bash
# Use manual conflict resolution
git notes merge --strategy=manual

# Or keep both notes separated by a newline
git notes merge --strategy=cat_sort_uniq

Notes Visibility

Notes may not be immediately visible to other team members:

bash
# Make sure to explicitly fetch notes
git fetch origin refs/notes/*:refs/notes/*

# Configure git to always fetch notes
git config --add remote.origin.fetch refs/notes/*:refs/notes/*

Summary

Git notes provide a flexible way to attach metadata to commits without altering commit history. They're particularly valuable for:

  • Adding information discovered after a commit is made
  • Storing metadata that doesn't belong in commit messages
  • Tracking build, deployment, or review information
  • Creating connections between commits and external resources

By using different namespaces, you can organize various types of metadata and share only what's relevant with your team. Git notes complement commit messages by providing a space for information that emerges after the commit is created.

Additional Resources

  • Git official documentation on notes: git help notes
  • Practice adding notes to your previous projects
  • Try using Git notes in a team setting for code reviews

Exercises

  1. Add notes to your last five commits describing what you've learned since making them.
  2. Create a custom namespace for "lessons-learned" and add notes about what you would do differently.
  3. Set up a workflow in your team to use Git notes for code review feedback.
  4. Configure your Git to automatically push and fetch notes.


If you spot any mistakes on this website, please let me know at [email protected]. I’d greatly appreciate your feedback! :)