git-notes(1)
============

NAME
----
git-notes - Add or inspect object notes

SYNOPSIS
--------
[verse]
'git notes' [list [<object>]]
'git notes' add [-f] [--allow-empty] [-F <file> | -m <msg> | (-c | -C) <object>] [<object>]
'git notes' copy [-f] ( --stdin | <from-object> <to-object> )
'git notes' append [--allow-empty] [-F <file> | -m <msg> | (-c | -C) <object>] [<object>]
'git notes' edit [--allow-empty] [<object>]
'git notes' show [<object>]
'git notes' merge [-v | -q] [-s <strategy> ] <notes-ref>
'git notes' merge --commit [-v | -q]
'git notes' merge --abort [-v | -q]
'git notes' remove [--ignore-missing] [--stdin] [<object>...]
'git notes' prune [-n] [-v]
'git notes' get-ref


DESCRIPTION
-----------
Adds, removes, or reads notes attached to objects, without touching
the objects themselves.

By default, notes are saved to and read from `refs/notes/commits`, but
this default can be overridden.  See the OPTIONS, CONFIGURATION, and
ENVIRONMENT sections below.  If this ref does not exist, it will be
quietly created when it is first needed to store a note.

A typical use of notes is to supplement a commit message without
changing the commit itself. Notes can be shown by 'git log' along with
the original commit message. To distinguish these notes from the
message stored in the commit object, the notes are indented like the
message, after an unindented line saying "Notes (<refname>):" (or
"Notes:" for `refs/notes/commits`).

Notes can also be added to patches prepared with `git format-patch` by
using the `--notes` option. Such notes are added as a patch commentary
after a three dash separator line.

To change which notes are shown by 'git log', see the
"notes.displayRef" configuration in linkgit:git-log[1].

See the "notes.rewrite.<command>" configuration for a way to carry
notes across commands that rewrite commits.


SUBCOMMANDS
-----------

list::
	List the notes object for a given object. If no object is
	given, show a list of all note objects and the objects they
	annotate (in the format "<note object> <annotated object>").
	This is the default subcommand if no subcommand is given.

add::
	Add notes for a given object (defaults to HEAD). Abort if the
	object already has notes (use `-f` to overwrite existing notes).
	However, if you're using `add` interactively (using an editor
	to supply the notes contents), then - instead of aborting -
	the existing notes will be opened in the editor (like the `edit`
	subcommand).

copy::
	Copy the notes for the first object onto the second object.
	Abort if the second object already has notes, or if the first
	object has none (use -f to overwrite existing notes to the
	second object). This subcommand is equivalent to:
	`git notes add [-f] -C $(git notes list <from-object>) <to-object>`
+
In `--stdin` mode, take lines in the format
+
----------
<from-object> SP <to-object> [ SP <rest> ] LF
----------
+
on standard input, and copy the notes from each <from-object> to its
corresponding <to-object>.  (The optional `<rest>` is ignored so that
the command can read the input given to the `post-rewrite` hook.)

append::
	Append to the notes of an existing object (defaults to HEAD).
	Creates a new notes object if needed.

edit::
	Edit the notes for a given object (defaults to HEAD).

show::
	Show the notes for a given object (defaults to HEAD).

merge::
	Merge the given notes ref into the current notes ref.
	This will try to merge the changes made by the given
	notes ref (called "remote") since the merge-base (if
	any) into the current notes ref (called "local").
+
If conflicts arise and a strategy for automatically resolving
conflicting notes (see the "NOTES MERGE STRATEGIES" section) is not given,
the "manual" resolver is used. This resolver checks out the
conflicting notes in a special worktree (`.git/NOTES_MERGE_WORKTREE`),
and instructs the user to manually resolve the conflicts there.
When done, the user can either finalize the merge with
'git notes merge --commit', or abort the merge with
'git notes merge --abort'.

remove::
	Remove the notes for given objects (defaults to HEAD). When
	giving zero or one object from the command line, this is
	equivalent to specifying an empty note message to
	the `edit` subcommand.

prune::
	Remove all notes for non-existing/unreachable objects.

get-ref::
	Print the current notes ref. This provides an easy way to
	retrieve the current notes ref (e.g. from scripts).

OPTIONS
-------
-f::
--force::
	When adding notes to an object that already has notes,
	overwrite the existing notes (instead of aborting).

-m <msg>::
--message=<msg>::
	Use the given note message (instead of prompting).
	If multiple `-m` options are given, their values
	are concatenated as separate paragraphs.
	Lines starting with `#` and empty lines other than a
	single line between paragraphs will be stripped out.

-F <file>::
--file=<file>::
	Take the note message from the given file.  Use '-' to
	read the note message from the standard input.
	Lines starting with `#` and empty lines other than a
	single line between paragraphs will be stripped out.

-C <object>::
--reuse-message=<object>::
	Take the given blob object (for	example, another note) as the
	note message. (Use `git notes copy <object>` instead to
	copy notes between objects.)

-c <object>::
--reedit-message=<object>::
	Like '-C', but with `-c` the editor is invoked, so that
	the user can further edit the note message.

--allow-empty::
	Allow an empty note object to be stored. The default behavior is
	to automatically remove empty notes.

--ref <ref>::
	Manipulate the notes tree in <ref>.  This overrides
	`GIT_NOTES_REF` and the "core.notesRef" configuration.  The ref
	specifies the full refname when it begins with `refs/notes/`; when it
	begins with `notes/`, `refs/` and otherwise `refs/notes/` is prefixed
	to form a full name of the ref.

--ignore-missing::
	Do not consider it an error to request removing notes from an
	object that does not have notes attached to it.

--stdin::
	Also read the object names to remove notes from the standard
	input (there is no reason you cannot combine this with object
	names from the command line).

-n::
--dry-run::
	Do not remove anything; just report the object names whose notes
	would be removed.

-s <strategy>::
--strategy=<strategy>::
	When merging notes, resolve notes conflicts using the given
	strategy. The following strategies are recognized: "manual"
	(default), "ours", "theirs", "union" and "cat_sort_uniq".
	This option overrides the "notes.mergeStrategy" configuration setting.
	See the "NOTES MERGE STRATEGIES" section below for more
	information on each notes merge strategy.

--commit::
	Finalize an in-progress 'git notes merge'. Use this option
	when you have resolved the conflicts that 'git notes merge'
	stored in .git/NOTES_MERGE_WORKTREE. This amends the partial
	merge commit created by 'git notes merge' (stored in
	.git/NOTES_MERGE_PARTIAL) by adding the notes in
	.git/NOTES_MERGE_WORKTREE. The notes ref stored in the
	.git/NOTES_MERGE_REF symref is updated to the resulting commit.

--abort::
	Abort/reset an in-progress 'git notes merge', i.e. a notes merge
	with conflicts. This simply removes all files related to the
	notes merge.

-q::
--quiet::
	When merging notes, operate quietly.

-v::
--verbose::
	When merging notes, be more verbose.
	When pruning notes, report all object names whose notes are
	removed.


DISCUSSION
----------

Commit notes are blobs containing extra information about an object
(usually information to supplement a commit's message).  These blobs
are taken from notes refs.  A notes ref is usually a branch which
contains "files" whose paths are the object names for the objects
they describe, with some directory separators included for performance
reasons footnote:[Permitted pathnames have the form
'ab'`/`'cd'`/`'ef'`/`'...'`/`'abcdef...': a sequence of directory
names of two hexadecimal digits each followed by a filename with the
rest of the object ID.].

Every notes change creates a new commit at the specified notes ref.
You can therefore inspect the history of the notes by invoking, e.g.,
`git log -p notes/commits`.  Currently the commit message only records
which operation triggered the update, and the commit authorship is
determined according to the usual rules (see linkgit:git-commit[1]).
These details may change in the future.

It is also permitted for a notes ref to point directly to a tree
object, in which case the history of the notes can be read with
`git log -p -g <refname>`.


NOTES MERGE STRATEGIES
----------------------

The default notes merge strategy is "manual", which checks out
conflicting notes in a special work tree for resolving notes conflicts
(`.git/NOTES_MERGE_WORKTREE`), and instructs the user to resolve the
conflicts in that work tree.
When done, the user can either finalize the merge with
'git notes merge --commit', or abort the merge with
'git notes merge --abort'.

Users may select an automated merge strategy from among the following using
either -s/--strategy option or configuring notes.mergeStrategy accordingly:

"ours" automatically resolves conflicting notes in favor of the local
version (i.e. the current notes ref).

"theirs" automatically resolves notes conflicts in favor of the remote
version (i.e. the given notes ref being merged into the current notes
ref).

"union" automatically resolves notes conflicts by concatenating the
local and remote versions.

"cat_sort_uniq" is similar to "union", but in addition to concatenating
the local and remote versions, this strategy also sorts the resulting
lines, and removes duplicate lines from the result. This is equivalent
to applying the "cat | sort | uniq" shell pipeline to the local and
remote versions. This strategy is useful if the notes follow a line-based
format where one wants to avoid duplicated lines in the merge result.
Note that if either the local or remote version contain duplicate lines
prior to the merge, these will also be removed by this notes merge
strategy.


EXAMPLES
--------

You can use notes to add annotations with information that was not
available at the time a commit was written.

------------
$ git notes add -m 'Tested-by: Johannes Sixt <j6t@kdbg.org>' 72a144e2
$ git show -s 72a144e
[...]
    Signed-off-by: Junio C Hamano <gitster@pobox.com>

Notes:
    Tested-by: Johannes Sixt <j6t@kdbg.org>
------------

In principle, a note is a regular Git blob, and any kind of
(non-)format is accepted.  You can binary-safely create notes from
arbitrary files using 'git hash-object':

------------
$ cc *.c
$ blob=$(git hash-object -w a.out)
$ git notes --ref=built add --allow-empty -C "$blob" HEAD
------------

(You cannot simply use `git notes --ref=built add -F a.out HEAD`
because that is not binary-safe.)
Of course, it doesn't make much sense to display non-text-format notes
with 'git log', so if you use such notes, you'll probably need to write
some special-purpose tools to do something useful with them.


CONFIGURATION
-------------

core.notesRef::
	Notes ref to read and manipulate instead of
	`refs/notes/commits`.  Must be an unabbreviated ref name.
	This setting can be overridden through the environment and
	command line.

notes.mergeStrategy::
	Which merge strategy to choose by default when resolving notes
	conflicts.  Must be one of `manual`, `ours`, `theirs`, `union`, or
	`cat_sort_uniq`.  Defaults to `manual`.  See "NOTES MERGE STRATEGIES"
	section above for more information on each strategy.
+
This setting can be overridden by passing the `--strategy` option.

notes.<name>.mergeStrategy::
	Which merge strategy to choose when doing a notes merge into
	refs/notes/<name>.  This overrides the more general
	"notes.mergeStrategy".  See the "NOTES MERGE STRATEGIES" section above
	for more information on each available strategy.

notes.displayRef::
	Which ref (or refs, if a glob or specified more than once), in
	addition to the default set by `core.notesRef` or
	`GIT_NOTES_REF`, to read notes from when showing commit
	messages with the 'git log' family of commands.
	This setting can be overridden on the command line or by the
	`GIT_NOTES_DISPLAY_REF` environment variable.
	See linkgit:git-log[1].

notes.rewrite.<command>::
	When rewriting commits with <command> (currently `amend` or
	`rebase`), if this variable is `false`, git will not copy
	notes from the original to the rewritten commit.  Defaults to
	`true`.  See also "`notes.rewriteRef`" below.
+
This setting can be overridden by the `GIT_NOTES_REWRITE_REF`
environment variable.

notes.rewriteMode::
	When copying notes during a rewrite, what to do if the target
	commit already has a note.  Must be one of `overwrite`,
	`concatenate`, `cat_sort_uniq`, or `ignore`.  Defaults to
	`concatenate`.
+
This setting can be overridden with the `GIT_NOTES_REWRITE_MODE`
environment variable.

notes.rewriteRef::
	When copying notes during a rewrite, specifies the (fully
	qualified) ref whose notes should be copied.  May be a glob,
	in which case notes in all matching refs will be copied.  You
	may also specify this configuration several times.
+
Does not have a default value; you must configure this variable to
enable note rewriting.
+
Can be overridden with the `GIT_NOTES_REWRITE_REF` environment variable.


ENVIRONMENT
-----------

`GIT_NOTES_REF`::
	Which ref to manipulate notes from, instead of `refs/notes/commits`.
	This overrides the `core.notesRef` setting.

`GIT_NOTES_DISPLAY_REF`::
	Colon-delimited list of refs or globs indicating which refs,
	in addition to the default from `core.notesRef` or
	`GIT_NOTES_REF`, to read notes from when showing commit
	messages.
	This overrides the `notes.displayRef` setting.
+
A warning will be issued for refs that do not exist, but a glob that
does not match any refs is silently ignored.

`GIT_NOTES_REWRITE_MODE`::
	When copying notes during a rewrite, what to do if the target
	commit already has a note.
	Must be one of `overwrite`, `concatenate`, `cat_sort_uniq`, or `ignore`.
	This overrides the `core.rewriteMode` setting.

`GIT_NOTES_REWRITE_REF`::
	When rewriting commits, which notes to copy from the original
	to the rewritten commit.  Must be a colon-delimited list of
	refs or globs.
+
If not set in the environment, the list of notes to copy depends
on the `notes.rewrite.<command>` and `notes.rewriteRef` settings.

GIT
---
Part of the linkgit:git[1] suite
