Like other projects, we also have some guidelines for our code.  For
Git in general, a few rough rules are:

 - Most importantly, we never say "It's in POSIX; we'll happily
   ignore your needs should your system not conform to it."
   We live in the real world.

 - However, we often say "Let's stay away from that construct,
   it's not even in POSIX".

 - In spite of the above two rules, we sometimes say "Although
   this is not in POSIX, it (is so convenient | makes the code
   much more readable | has other good characteristics) and
   practically all the platforms we care about support it, so
   let's use it".

   Again, we live in the real world, and it is sometimes a
   judgement call, the decision based more on real world
   constraints people face than what the paper standard says.

 - Fixing style violations while working on a real change as a
   preparatory clean-up step is good, but otherwise avoid useless code
   churn for the sake of conforming to the style.

   "Once it _is_ in the tree, it's not really worth the patch noise to
   go and fix it up."
   Cf. https://lore.kernel.org/all/20100126160632.3bdbe172.akpm@linux-foundation.org/

 - Log messages to explain your changes are as important as the
   changes themselves.  Clearly written code and in-code comments
   explain how the code works and what is assumed from the surrounding
   context.  The log messages explain what the changes wanted to
   achieve and why the changes were necessary (more on this in the
   accompanying SubmittingPatches document).

Make your code readable and sensible, and don't try to be clever.

As for more concrete guidelines, just imitate the existing code
(this is a good guideline, no matter which project you are
contributing to). It is always preferable to match the _local_
convention. New code added to Git suite is expected to match
the overall style of existing code. Modifications to existing
code are expected to match the style the surrounding code already
uses (even if it doesn't match the overall style of existing code).

But if you must have a list of rules, here are some language
specific ones. Note that Documentation/ToolsForGit.adoc document
has a collection of tips to help you use some external tools
to conform to these guidelines.

For shell scripts specifically (not exhaustive):

 - We use tabs for indentation.

 - Case arms are indented at the same depth as case and esac lines,
   like this:

	case "$variable" in
	pattern1)
		do this
		;;
	pattern2)
		do that
		;;
	esac

 - Redirection operators should be written with space before, but no
   space after them.  In other words, write 'echo test >"$file"'
   instead of 'echo test> $file' or 'echo test > $file'.  Note that
   even though it is not required by POSIX to double-quote the
   redirection target in a variable (as shown above), our code does so
   because some versions of bash issue a warning without the quotes.

	(incorrect)
	cat hello > world < universe
	echo hello >$world

	(correct)
	cat hello >world <universe
	echo hello >"$world"

 - We prefer $( ... ) for command substitution; unlike ``, it
   properly nests.  It should have been the way Bourne spelled
   it from day one, but unfortunately isn't.

 - If you want to find out if a command is available on the user's
   $PATH, you should use 'type <command>', instead of 'which <command>'.
   The output of 'which' is not machine parsable and its exit code
   is not reliable across platforms.

 - We use POSIX compliant parameter substitutions and avoid bashisms;
   namely:

   - We use ${parameter-word} and its [-=?+] siblings, and their
     colon'ed "unset or null" form.

   - We use ${parameter#word} and its [#%] siblings, and their
     doubled "longest matching" form.

   - No "Substring Expansion" ${parameter:offset:length}.

   - No shell arrays.

   - No pattern replacement ${parameter/pattern/string}.

 - We use Arithmetic Expansion $(( ... )).

 - We do not use Process Substitution <(list) or >(list).

 - Do not write control structures on a single line with semicolon.
   "then" should be on the next line for if statements, and "do"
   should be on the next line for "while" and "for".

	(incorrect)
	if test -f hello; then
		do this
	fi

	(correct)
	if test -f hello
	then
		do this
	fi

 - If a command sequence joined with && or || or | spans multiple
   lines, put each command on a separate line and put && and || and |
   operators at the end of each line, rather than the start. This
   means you don't need to use \ to join lines, since the above
   operators imply the sequence isn't finished.

	(incorrect)
	grep blob verify_pack_result \
	| awk -f print_1.awk \
	| sort >actual &&
	...

	(correct)
	grep blob verify_pack_result |
	awk -f print_1.awk |
	sort >actual &&
	...

 - We prefer "test" over "[ ... ]".

 - We do not write the noiseword "function" in front of shell
   functions.

 - We prefer a space between the function name and the parentheses,
   and no space inside the parentheses. The opening "{" should also
   be on the same line.

	(incorrect)
	my_function(){
		...

	(correct)
	my_function () {
		...

 - As to use of grep, stick to a subset of BRE (namely, no \{m,n\},
   [::], [==], or [..]) for portability.

   - We do not use \{m,n\};

   - We do not use ? or + (which are \{0,1\} and \{1,\}
     respectively in BRE) but that goes without saying as these
     are ERE elements not BRE (note that \? and \+ are not even part
     of BRE -- making them accessible from BRE is a GNU extension).

 - Use Git's gettext wrappers in git-sh-i18n to make the user
   interface translatable. See "Marking strings for translation" in
   po/README.

 - We do not write our "test" command with "-a" and "-o" and use "&&"
   or "||" to concatenate multiple "test" commands instead, because
   the use of "-a/-o" is often error-prone.  E.g.

     test -n "$x" -a "$a" = "$b"

   is buggy and breaks when $x is "=", but

     test -n "$x" && test "$a" = "$b"

   does not have such a problem.

 - Even though "local" is not part of POSIX, we make heavy use of it
   in our test suite.  We do not use it in scripted Porcelains, and
   hopefully nobody starts using "local" before all shells that matter
   support it (notably, ksh from AT&T Research does not support it yet).

 - Some versions of shell do not understand "export variable=value",
   so we write "variable=value" and then "export variable" on two
   separate lines.

 - Some versions of dash have broken variable assignment when prefixed
   with "local", "export", and "readonly", in that the value to be
   assigned goes through field splitting at $IFS unless quoted.

	(incorrect)
	local variable=$value
	local variable=$(command args)

	(correct)
	local variable="$value"
	local variable="$(command args)"

 - The common construct

	VAR=VAL command args

   to temporarily set and export environment variable VAR only while
   "command args" is running is handy, but this triggers an
   unspecified behaviour according to POSIX when used for a command
   that is not an external command (like shell functions).  Indeed,
   dash 0.5.10.2-6 on Ubuntu 20.04, /bin/sh on FreeBSD 13, and AT&T
   ksh all make a temporary assignment without exporting the variable,
   in such a case.  As it does not work portably across shells, do not
   use this syntax for shell functions.  A common workaround is to do
   an explicit export in a subshell, like so:

	(incorrect)
	VAR=VAL func args

	(correct)
	(
		VAR=VAL &&
		export VAR &&
		func args
	)

   but be careful that the effect "func" makes to the variables in the
   current shell will be lost across the subshell boundary.

 - Use octal escape sequences (e.g. "\302\242"), not hexadecimal (e.g.
   "\xc2\xa2") in printf format strings, since hexadecimal escape
   sequences are not portable.


For C programs:

 - We use tabs to indent, and interpret tabs as taking up to
   8 spaces.

 - Nested C preprocessor directives are indented after the hash by one
   space per nesting level.

	#if FOO
	# include <foo.h>
	# if BAR
	#  include <bar.h>
	# endif
	#endif

 - We try to keep to at most 80 characters per line.

 - As a Git developer we assume you have a reasonably modern compiler
   and we recommend you to enable the DEVELOPER makefile knob to
   ensure your patch is clear of all compiler warnings we care about,
   by e.g. "echo DEVELOPER=1 >>config.mak".

 - When using DEVELOPER=1 mode, you may see warnings from the compiler
   like "error: unused parameter 'foo' [-Werror=unused-parameter]",
   which indicates that a function ignores its argument. If the unused
   parameter can't be removed (e.g., because the function is used as a
   callback and has to match a certain interface), you can annotate
   the individual parameters with the UNUSED (or MAYBE_UNUSED)
   keyword, like "int foo UNUSED".

 - We try to support a wide range of C compilers to compile Git with,
   including old ones.  As of Git v2.35.0 Git requires C99 (we check
   "__STDC_VERSION__"). You should not use features from a newer C
   standard, even if your compiler groks them.

   New C99 features have been phased in gradually, if something's new
   in C99 but not used yet don't assume that it's safe to use, some
   compilers we target have only partial support for it. These are
   considered safe to use:

   . since around 2007 with 2b6854c863a, we have been using
     initializer elements which are not computable at load time. E.g.:

	const char *args[] = { "constant", variable, NULL };

   . since early 2012 with e1327023ea, we have been using an enum
     definition whose last element is followed by a comma.  This, like
     an array initializer that ends with a trailing comma, can be used
     to reduce the patch noise when adding a new identifier at the end.

   . since mid 2017 with cbc0f81d, we have been using designated
     initializers for struct (e.g. "struct t v = { .val = 'a' };").

   . since mid 2017 with 512f41cf, we have been using designated
     initializers for array (e.g. "int array[10] = { [5] = 2 }").

   . since early 2021 with 765dc168882, we have been using variadic
     macros, mostly for printf-like trace and debug macros.

   . since late 2021 with 44ba10d6, we have had variables declared in
     the for loop "for (int i = 0; i < 10; i++)".

   New C99 features that we cannot use yet:

   . %z and %zu as a printf() argument for a size_t (the %z being for
     the POSIX-specific ssize_t). Instead you should use
     printf("%"PRIuMAX, (uintmax_t)v).  These days the MSVC version we
     rely on supports %z, but the C library used by MinGW does not.

   . Shorthand like ".a.b = *c" in struct initializations is known to
     trip up an older IBM XLC version, use ".a = { .b = *c }" instead.
     See the 33665d98 (reftable: make assignments portable to AIX xlc
     v12.01, 2022-03-28).

 - Variables have to be declared at the beginning of the block, before
   the first statement (i.e. -Wdeclaration-after-statement).  It is
   encouraged to have a blank line between the end of the declarations
   and the first statement in the block.

 - Do not explicitly initialize global variables to 0 or NULL;
   instead, let BSS take care of the zero initialization.

 - NULL pointers shall be written as NULL, not as 0.

 - When declaring pointers, the star sides with the variable
   name, i.e. "char *string", not "char* string" or
   "char * string".  This makes it easier to understand code
   like "char *string, c;".

 - Use whitespace around operators and keywords, but not inside
   parentheses and not around functions. So:

        while (condition)
		func(bar + 1);

   and not:

        while( condition )
		func (bar+1);

 - A binary operator (other than ",") and ternary conditional "?:"
   have a space on each side of the operator to separate it from its
   operands.  E.g. "A + 1", not "A+1".

 - A unary operator (other than "." and "->") have no space between it
   and its operand.  E.g. "(char *)ptr", not "(char *) ptr".

 - Do not explicitly compare an integral value with constant 0 or '\0',
   or a pointer value with constant NULL.  For instance, to validate that
   counted array <ptr, cnt> is initialized but has no elements, write:

	if (!ptr || cnt)
		BUG("empty array expected");

   and not:

	if (ptr == NULL || cnt != 0);
		BUG("empty array expected");

 - We avoid using braces unnecessarily.  I.e.

	if (bla) {
		x = 1;
	}

   is frowned upon. But there are a few exceptions:

	- When the statement extends over a few lines (e.g., a while loop
	  with an embedded conditional, or a comment). E.g.:

		while (foo) {
			if (x)
				one();
			else
				two();
		}

		if (foo) {
			/*
			 * This one requires some explanation,
			 * so we're better off with braces to make
			 * it obvious that the indentation is correct.
			 */
			doit();
		}

	- When there are multiple arms to a conditional and some of them
	  require braces, enclose even a single line block in braces for
	  consistency. E.g.:

		if (foo) {
			doit();
		} else {
			one();
			two();
			three();
		}

 - We try to avoid assignments in the condition of an "if" statement.

 - Try to make your code understandable.  You may put comments
   in, but comments invariably tend to stale out when the code
   they were describing changes.  Often splitting a function
   into two makes the intention of the code much clearer.

 - Multi-line comments include their delimiters on separate lines from
   the text.  E.g.

	/*
	 * A very long
	 * multi-line comment.
	 */

   Note however that a comment that explains a translatable string to
   translators uses a convention of starting with a magic token
   "TRANSLATORS: ", e.g.

	/*
	 * TRANSLATORS: here is a comment that explains the string to
	 * be translated, that follows immediately after it.
	 */
	_("Here is a translatable string explained by the above.");

 - Double negation is often harder to understand than no negation
   at all.

 - There are two schools of thought when it comes to comparison,
   especially inside a loop. Some people prefer to have the less stable
   value on the left hand side and the more stable value on the right hand
   side, e.g. if you have a loop that counts variable i down to the
   lower bound,

	while (i > lower_bound) {
		do something;
		i--;
	}

   Other people prefer to have the textual order of values match the
   actual order of values in their comparison, so that they can
   mentally draw a number line from left to right and place these
   values in order, i.e.

	while (lower_bound < i) {
		do something;
		i--;
	}

   Both are valid, and we use both.  However, the more "stable" the
   stable side becomes, the more we tend to prefer the former
   (comparison with a constant, "i > 0", is an extreme example).
   Just do not mix styles in the same part of the code and mimic
   existing styles in the neighbourhood.

 - There are two schools of thought when it comes to splitting a long
   logical line into multiple lines.  Some people push the second and
   subsequent lines far enough to the right with tabs and align them:

        if (the_beginning_of_a_very_long_expression_that_has_to ||
		span_more_than_a_single_line_of ||
		the_source_text) {
                ...

   while other people prefer to align the second and the subsequent
   lines with the column immediately inside the opening parenthesis,
   with tabs and spaces, following our "tabstop is always a multiple
   of 8" convention:

        if (the_beginning_of_a_very_long_expression_that_has_to ||
	    span_more_than_a_single_line_of ||
	    the_source_text) {
                ...

   Both are valid, and we use both.  Again, just do not mix styles in
   the same part of the code and mimic existing styles in the
   neighbourhood.

 - When splitting a long logical line, some people change line before
   a binary operator, so that the result looks like a parse tree when
   you turn your head 90-degrees counterclockwise:

        if (the_beginning_of_a_very_long_expression_that_has_to
	    || span_more_than_a_single_line_of_the_source_text) {

   while other people prefer to leave the operator at the end of the
   line:

        if (the_beginning_of_a_very_long_expression_that_has_to ||
	    span_more_than_a_single_line_of_the_source_text) {

   Both are valid, but we tend to use the latter more, unless the
   expression gets fairly complex, in which case the former tends to
   be easier to read.  Again, just do not mix styles in the same part
   of the code and mimic existing styles in the neighbourhood.

 - When splitting a long logical line, with everything else being
   equal, it is preferable to split after the operator at higher
   level in the parse tree.  That is, this is more preferable:

	if (a_very_long_variable * that_is_used_in +
	    a_very_long_expression) {
		...

   than

	if (a_very_long_variable *
	    that_is_used_in + a_very_long_expression) {
		...

 - Some clever tricks, like using the !! operator with arithmetic
   constructs, can be extremely confusing to others.  Avoid them,
   unless there is a compelling reason to use them.

 - Use the API.  No, really.  We have a strbuf (variable length
   string), several arrays with the ALLOC_GROW() macro, a
   string_list for sorted string lists, a hash map (mapping struct
   objects) named "struct decorate", amongst other things.

 - When you come up with an API, document its functions and structures
   in the header file that exposes the API to its callers. Use what is
   in "strbuf.h" as a model for the appropriate tone and level of
   detail.

 - The first #include in C files, except in platform specific compat/
   implementations and sha1dc/, must be <git-compat-util.h>.  This
   header file insulates other header files and source files from
   platform differences, like which system header files must be
   included in what order, and what C preprocessor feature macros must
   be defined to trigger certain features we expect out of the system.
   A collorary to this is that C files should not directly include
   system header files themselves.

   There are some exceptions, because certain group of files that
   implement an API all have to include the same header file that
   defines the API and it is convenient to include <git-compat-util.h>
   there.  Namely:

   - the implementation of the built-in commands in the "builtin/"
     directory that include "builtin.h" for the cmd_foo() prototype
     definition,

   - the test helper programs in the "t/helper/" directory that include
     "t/helper/test-tool.h" for the cmd__foo() prototype definition,

   - the xdiff implementation in the "xdiff/" directory that includes
     "xdiff/xinclude.h" for the xdiff machinery internals,

   - the unit test programs in "t/unit-tests/" directory that include
     "t/unit-tests/test-lib.h" that gives them the unit-tests
     framework, and

   - the source files that implement reftable in the "reftable/"
     directory that include "reftable/system.h" for the reftable
     internals,

   are allowed to assume that they do not have to include
   <git-compat-util.h> themselves, as it is included as the first
   '#include' in these header files.  These headers must be the first
   header file to be "#include"d in them, though.

 - A C file must directly include the header files that declare the
   functions and the types it uses, except for the functions and types
   that are made available to it by including one of the header files
   it must include by the previous rule.

 - If you are planning a new command, consider writing it in shell
   or perl first, so that changes in semantics can be easily
   changed and discussed.  Many Git commands started out like
   that, and a few are still scripts.

 - Avoid introducing a new dependency into Git. This means you
   usually should stay away from scripting languages not already
   used in the Git core command set (unless your command is clearly
   separate from it, such as an importer to convert random-scm-X
   repositories to Git).

 - When we pass <string, length> pair to functions, we should try to
   pass them in that order.

 - Use Git's gettext wrappers to make the user interface
   translatable. See "Marking strings for translation" in po/README.

 - Variables and functions local to a given source file should be marked
   with "static". Variables that are visible to other source files
   must be declared with "extern" in header files. However, function
   declarations should not use "extern", as that is already the default.

 - You can launch gdb around your program using the shorthand GIT_DEBUGGER.
   Run `GIT_DEBUGGER=1 ./bin-wrappers/git foo` to simply use gdb as is, or
   run `GIT_DEBUGGER="<debugger> <debugger-args>" ./bin-wrappers/git foo` to
   use your own debugger and arguments. Example: `GIT_DEBUGGER="ddd --gdb"
   ./bin-wrappers/git log` (See `bin-wrappers/wrap-for-bin.sh`.)

 - The primary data structure that a subsystem 'S' deals with is called
   `struct S`. Functions that operate on `struct S` are named
   `S_<verb>()` and should generally receive a pointer to `struct S` as
   first parameter. E.g.

	struct strbuf;

	void strbuf_add(struct strbuf *buf, ...);

	void strbuf_reset(struct strbuf *buf);

    is preferred over:

	struct strbuf;

	void add_string(struct strbuf *buf, ...);

	void reset_strbuf(struct strbuf *buf);

 - There are several common idiomatic names for functions performing
   specific tasks on a structure `S`:

    - `S_init()` initializes a structure without allocating the
      structure itself.

    - `S_release()` releases a structure's contents without freeing the
      structure.

    - `S_clear()` is equivalent to `S_release()` followed by `S_init()`
      such that the structure is directly usable after clearing it. When
      `S_clear()` is provided, `S_init()` shall not allocate resources
      that need to be released again.

    - `S_free()` releases a structure's contents and frees the
      structure.

 - Function names should be clear and descriptive, accurately reflecting
   their purpose or behavior. Arbitrary suffixes that do not add meaningful
   context can lead to confusion, particularly for newcomers to the codebase.

   Historically, the '_1' suffix has been used in situations where:

   - A function handles one element among a group that requires similar
     processing.
   - A recursive function has been separated from its setup phase.

   The '_1' suffix can be used as a concise way to indicate these specific
   cases. However, it is recommended to find a more descriptive name wherever
   possible to improve the readability and maintainability of the code.

For Perl programs:

 - Most of the C guidelines above apply.

 - We try to support Perl 5.8.1 and later ("use Perl 5.008001").

 - use strict and use warnings are strongly preferred.

 - Don't overuse statement modifiers unless using them makes the
   result easier to follow.

	... do something ...
	do_this() unless (condition);
        ... do something else ...

   is more readable than:

	... do something ...
	unless (condition) {
		do_this();
	}
        ... do something else ...

   *only* when the condition is so rare that do_this() will be almost
   always called.

 - We try to avoid assignments inside "if ()" conditions.

 - Learn and use Git.pm if you need that functionality.

For Python scripts:

 - We follow PEP-8 (https://peps.python.org/pep-0008/).

 - As a minimum, we aim to be compatible with Python 2.7.

 - Where required libraries do not restrict us to Python 2, we try to
   also be compatible with Python 3.1 and later.


Program Output

 We make a distinction between a Git command's primary output and
 output which is merely chatty feedback (for instance, status
 messages, running transcript, or progress display), as well as error
 messages. Roughly speaking, a Git command's primary output is that
 which one might want to capture to a file or send down a pipe; its
 chatty output should not interfere with these use-cases.

 As such, primary output should be sent to the standard output stream
 (stdout), and chatty output should be sent to the standard error
 stream (stderr). Examples of commands which produce primary output
 include `git log`, `git show`, and `git branch --list` which generate
 output on the stdout stream.

 Not all Git commands have primary output; this is often true of
 commands whose main function is to perform an action. Some action
 commands are silent, whereas others are chatty. An example of a
 chatty action commands is `git clone` with its "Cloning into
 '<path>'..." and "Checking connectivity..." status messages which it
 sends to the stderr stream.

 Error messages from Git commands should always be sent to the stderr
 stream.


Error Messages

 - Do not end a single-sentence error message with a full stop.

 - Do not capitalize the first word, only because it is the first word
   in the message ("unable to open '%s'", not "Unable to open '%s'").  But
   "SHA-3 not supported" is fine, because the reason the first word is
   capitalized is not because it is at the beginning of the sentence,
   but because the word would be spelled in capital letters even when
   it appeared in the middle of the sentence.

 - Say what the error is first ("cannot open '%s'", not "%s: cannot open").

 - Enclose the subject of an error inside a pair of single quotes,
   e.g. `die(_("unable to open '%s'"), path)`.

 - Unless there is a compelling reason not to, error messages from
   porcelain commands should be marked for translation, e.g.
   `die(_("bad revision %s"), revision)`.

 - Error messages from the plumbing commands are sometimes meant for
   machine consumption and should not be marked for translation,
   e.g., `die("bad revision %s", revision)`.

 - BUG("message") are for communicating the specific error to developers,
   thus should not be translated.


Externally Visible Names

 - For configuration variable names, follow the existing convention:

   . The section name indicates the affected subsystem.

   . The subsection name, if any, indicates which of an unbounded set
     of things to set the value for.

   . The variable name describes the effect of tweaking this knob.

   The section and variable names that consist of multiple words are
   formed by concatenating the words without punctuation marks (e.g. `-`),
   and are broken using bumpyCaps in documentation as a hint to the
   reader.

   When choosing the variable namespace, do not use variable name for
   specifying possibly unbounded set of things, most notably anything
   an end user can freely come up with (e.g. branch names).  Instead,
   use subsection names or variable values, like the existing variable
   branch.<name>.description does.


Writing Documentation:

 Most (if not all) of the documentation pages are written in the
 AsciiDoc format in *.adoc files (e.g. Documentation/git.adoc), and
 processed into HTML and manpages (e.g. git.html and git.1 in the
 same directory).

 The documentation liberally mixes US and UK English (en_US/UK)
 norms for spelling and grammar, which is somewhat unfortunate.
 In an ideal world, it would have been better if it consistently
 used only one and not the other, and we would have picked en_US
 (if you wish to correct the English of some of the existing
 documentation, please see the documentation-related advice in the
 Documentation/SubmittingPatches file).

 In order to ensure the documentation is inclusive, avoid assuming
 that an unspecified example person is male or female, and think
 twice before using "he", "him", "she", or "her".  Here are some
 tips to avoid use of gendered pronouns:

  - Prefer succinctness and matter-of-factly describing functionality
    in the abstract.  E.g.

     `--short`:: Emit output in the short-format.

    and avoid something like these overly verbose alternatives:

     `--short`:: Use this to emit output in the short-format.
     `--short`:: You can use this to get output in the short-format.
     `--short`:: A user who prefers shorter output could....
     `--short`:: Should a person and/or program want shorter output, he
                 she/they/it can...

    This practice often eliminates the need to involve human actors in
    your description, but it is a good practice regardless of the
    avoidance of gendered pronouns.

  - When it becomes awkward to stick to this style, prefer "you" when
    addressing the hypothetical user, and possibly "we" when
    discussing how the program might react to the user.  E.g.

      You can use this option instead of `--xyz`, but we might remove
      support for it in future versions.

    while keeping in mind that you can probably be less verbose, e.g.

      Use this instead of `--xyz`. This option might be removed in future
      versions.

  - If you still need to refer to an example person that is
    third-person singular, you may resort to "singular they" to avoid
    "he/she/him/her", e.g.

      A contributor asks their upstream to pull from them.

    Note that this sounds ungrammatical and unnatural to those who
    learned that "they" is only used for third-person plural, e.g.
    those who learn English as a second language in some parts of the
    world.

 Every user-visible change should be reflected in the documentation.
 The same general rule as for code applies -- imitate the existing
 conventions.


Markup:

 Literal parts (e.g. use of command-line options, command names,
 branch names, URLs, pathnames (files and directories), configuration and
 environment variables) must be typeset as verbatim (i.e. wrapped with
 backticks):
   `--pretty=oneline`
   `git rev-list`
   `remote.pushDefault`
   `http://git.example.com`
   `.git/config`
   `GIT_DIR`
   `HEAD`
   `umask`(2)

 An environment variable must be prefixed with "$" only when referring to its
 value and not when referring to the variable itself, in this case there is
 nothing to add except the backticks:
   `GIT_DIR` is specified
   `$GIT_DIR/hooks/pre-receive`

 Word phrases enclosed in `backtick characters` are rendered literally
 and will not be further expanded. The use of `backticks` to achieve the
 previous rule means that literal examples should not use AsciiDoc
 escapes.
   Correct:
      `--pretty=oneline`
   Incorrect:
      `\--pretty=oneline`

 Placeholders are spelled in lowercase and enclosed in
 angle brackets surrounded by underscores:
   _<file>_
   _<commit>_

 If a placeholder has multiple words, they are separated by dashes:
   _<new-branch-name>_
   _<template-directory>_

 When needed, use a distinctive identifier for placeholders, usually
 made of a qualification and a type:
   _<git-dir>_
   _<key-id>_

Characters are also surrounded by underscores:
   _LF_, _CR_, _CR_/_LF_, _NUL_, _EOF_

 Git's Asciidoc processor has been tailored to treat backticked text
 as complex synopsis. When literal and placeholders are mixed, you can
 use the backtick notation which will take care of correctly typesetting
 the content.
   `--jobs <n>`
   `--sort=<key>`
   `<directory>/.git`
   `remote.<name>.mirror`
   `ssh://[<user>@]<host>[:<port>]/<path-to-git-repo>`

As a side effect, backquoted placeholders are correctly typeset, but
this style is not recommended.

 When documenting multiple related `git config` variables, place them on
 a separate line instead of separating them by commas.  For example, do
 not write this:
   `core.var1`, `core.var2`::
	Description common to `core.var1` and `core.var2`.

Instead write this:
   `core.var1`::
   `core.var2`::
	Description common to `core.var1` and `core.var2`.

Synopsis Syntax

 The synopsis (a paragraph with [synopsis] attribute) is automatically
 formatted by the toolchain and does not need typesetting.

 A few commented examples follow to provide reference when writing or
 modifying command usage strings and synopsis sections in the manual
 pages:

 Possibility of multiple occurrences is indicated by three dots:
   <file>...
   (One or more of <file>.)

 Optional parts are enclosed in square brackets:
   [<file>...]
   (Zero or more of <file>.)

 An optional parameter needs to be typeset with unconstrained pairs
   [<repository>]

   --exec-path[=<path>]
   (Option with an optional argument.  Note that the "=" is inside the
   brackets.)

   [<patch>...]
   (Zero or more of <patch>.  Note that the dots are inside, not
   outside the brackets.)

 Multiple alternatives are indicated with vertical bars:
   [-q | --quiet]
   [--utf8 | --no-utf8]

 Use spacing around "|" token(s), but not immediately after opening or
 before closing a [] or () pair:
   Do: [-q | --quiet]
   Don't: [-q|--quiet]

 Don't use spacing around "|" tokens when they're used to separate the
 alternate arguments of an option:
    Do: --track[=(direct|inherit)]
    Don't: --track[=(direct | inherit)]

 Parentheses are used for grouping:
   [(<rev>|<range>)...]
   (Any number of either <rev> or <range>.  Parens are needed to make
   it clear that "..." pertains to both <rev> and <range>.)

   [(-p <parent>)...]
   (Any number of option -p, each with one <parent> argument.)

   git remote set-head <name> (-a|-d|<branch>)
   (One and only one of "-a", "-d" or "<branch>" _must_ (no square
   brackets) be provided.)

 And a somewhat more contrived example:
   --diff-filter=[(A|C|D|M|R|T|U|X|B)...[*]]
   Here "=" is outside the brackets, because "--diff-filter=" is a
   valid usage.  "*" has its own pair of brackets, because it can
   (optionally) be specified only when one or more of the letters is
   also provided.

  A note on notation:
   Use 'git' (all lowercase) when talking about commands i.e. something
   the user would type into a shell and use 'Git' (uppercase first letter)
   when talking about the version control system and its properties.

 If some place in the documentation needs to typeset a command usage
 example with inline substitutions, it is fine to use +monospaced and
 inline substituted text+ instead of `monospaced literal text`, and with
 the former, the part that should not get substituted must be
 quoted/escaped.
