Коміт неможливо змінити: будь-яка зміна, навіть у повідомленні, дає новий хеш. Але інколи до вже опублікованого коміту треба «дописати» інформацію: результат CI, посилання на рецензію, час деплою, заміток для розслідування.
git notes зберігає примітки окремо від комітів:
git notes add -m "Deployed to production 2026-10-04 14:20" a1b2c3d
git notes append -m "Rolled back: memory leak" a1b2c3d
git log -1 a1b2c3d
# commit a1b2c3d...
# ...
# Notes:
# Deployed to production 2026-10-04 14:20
# Rolled back: memory leak
Як це влаштовано: примітки - звичайні об'єкти Git в окремій гілці refs/notes/commits. Ця гілка містить коміти з деревом, де ім'я файлу - хеш коміту, до якого примітка, а вміст - текст. Тобто це історія приміток з власними комітами, а сам коміт-ціль не змінюється.
Простори імен - різні види метаданих окремо:
git notes --ref=ci add -m "build #4812: passed" HEAD
git notes --ref=deploy add -m "prod 2026-10-04" HEAD
git log --notes=ci --notes=deploy
Головна незручність - примітки не передаються за замовчуванням. git push і git fetch працюють лише з гілками й тегами, тож refs/notes/* треба вказати явно:
git push origin 'refs/notes/*'
git fetch origin 'refs/notes/*:refs/notes/*'
Або додати refspec у конфігурацію remote. GitHub давно не показує примітки в інтерфейсі, тому вони корисні передусім для внутрішніх інструментів.
Ще деталі:
- rebase і amend створюють нові коміти - примітки старих не переносяться, якщо не налаштувати
notes.rewriteRef; - злиття приміток з різних джерел - окрема команда
git notes mergeзі стратегіямиunion,cat_sort_uniq; - примітки не входять у хеш і не захищені підписом коміту - не використовуйте їх для чогось, що має бути незмінним.
Де notes доречні:
- CI записує результат збирання чи покриття до коміту;
- інструмент деплою позначає, які коміти й коли потрапили в продакшен;
- проєкти, що приймають патчі поштою, додають посилання на обговорення;
- особисті нотатки при розслідуванні історії.
Альтернативи: trailer-рядки в повідомленні (Reviewed-by:, Refs: #142) - якщо інформація відома до коміту; теги - для позначення конкретних точок; зовнішні системи (CI, трекер) - якщо метадані не мають жити разом з репозиторієм.