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).

 - A label "NEEDSWORK:" followed by a description of the things to
   be done is a way to leave in-code comments to document design
   decisions yet to be made. 80% of the work to resolve a NEEDSWORK
   comment is to decide if it still makes sense to do so, since the
   situation around the codebase may have changed since the comment
   was written.  It can be a very valid change to remove an existing
   NEEDSWORK comment without doing anything else, with the commit log
   message describing a good argument why it does not make sense to do
   the thing the NEEDSWORK comment mentioned.

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++)".

   . since late 2023 with 8277dbe987 we have been using the bool type
     from <stdbool.h>.

   . since late 2024 with v2.48.0-rc0~20, we have been using compound
     literals, e.g., (struct foo){ .member = value };

   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.");

   We do not use // comments.

 - 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 reinitializing
      the structure for immediate reuse, and without freeing the structure
      itself.

    - `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.

 - Bit fields should be defined without a space around the colon. E.g.

   unsigned my_field:1;
   unsigned other_field:1;
   unsigned field_with_longer_name:1;

 - When a function `F` accepts flags, those flags should be defined as `enum
   F_flags`. Individual flag definitions should start with `F` and be in
   all-uppercase letters. Flag values should be represented via bit shifts.
   E.g.

        enum frobnicate_flags {
                FROBNICATE_FOO = (1 << 0),
                FROBNICATE_BAR = (1 << 1),
        };

        int frobnicate(enum frobnicate_flags flags);

 - Array names should be named in the singular form if the individual items are
   subject of use. E.g.:

         char *dog[] = ...;
         walk_dog(dog[0]);
         walk_dog(dog[1]);

   Cases where the array is employed as a whole rather than as its unit parts,
   the plural form is preferable. E.g:

         char *dogs[] = ...;
         walk_all_dogs(dogs);

 - For file timestamps, do not use "st_mtim" (and other timestamp
   members in "struct stat") unconditionally; not everybody is POSIX
   (grep for USE_ST_TIMESPEC).  If you only need a timestamp in whole
   second resolution, "st_mtime" should work fine everywhere.


For Perl programs:

 - Most of the C guidelines above apply.

 - We try to support Perl 5.26.0 and later ("require v5.26").

 - 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.
