123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547 |
- git-commit(1)
- =============
- NAME
- ----
- git-commit - Record changes to the repository
- SYNOPSIS
- --------
- [verse]
- 'git commit' [-a | --interactive | --patch] [-s] [-v] [-u<mode>] [--amend]
- [--dry-run] [(-c | -C | --fixup | --squash) <commit>]
- [-F <file> | -m <msg>] [--reset-author] [--allow-empty]
- [--allow-empty-message] [--no-verify] [-e] [--author=<author>]
- [--date=<date>] [--cleanup=<mode>] [--[no-]status]
- [-i | -o] [--pathspec-from-file=<file> [--pathspec-file-nul]]
- [-S[<keyid>]] [--] [<pathspec>...]
- DESCRIPTION
- -----------
- Create a new commit containing the current contents of the index and
- the given log message describing the changes. The new commit is a
- direct child of HEAD, usually the tip of the current branch, and the
- branch is updated to point to it (unless no branch is associated with
- the working tree, in which case HEAD is "detached" as described in
- linkgit:git-checkout[1]).
- The content to be committed can be specified in several ways:
- 1. by using linkgit:git-add[1] to incrementally "add" changes to the
- index before using the 'commit' command (Note: even modified files
- must be "added");
- 2. by using linkgit:git-rm[1] to remove files from the working tree
- and the index, again before using the 'commit' command;
- 3. by listing files as arguments to the 'commit' command
- (without --interactive or --patch switch), in which
- case the commit will ignore changes staged in the index, and instead
- record the current content of the listed files (which must already
- be known to Git);
- 4. by using the -a switch with the 'commit' command to automatically
- "add" changes from all known files (i.e. all files that are already
- listed in the index) and to automatically "rm" files in the index
- that have been removed from the working tree, and then perform the
- actual commit;
- 5. by using the --interactive or --patch switches with the 'commit' command
- to decide one by one which files or hunks should be part of the commit
- in addition to contents in the index,
- before finalizing the operation. See the ``Interactive Mode'' section of
- linkgit:git-add[1] to learn how to operate these modes.
- The `--dry-run` option can be used to obtain a
- summary of what is included by any of the above for the next
- commit by giving the same set of parameters (options and paths).
- If you make a commit and then find a mistake immediately after
- that, you can recover from it with 'git reset'.
- OPTIONS
- -------
- -a::
- --all::
- Tell the command to automatically stage files that have
- been modified and deleted, but new files you have not
- told Git about are not affected.
- -p::
- --patch::
- Use the interactive patch selection interface to chose
- which changes to commit. See linkgit:git-add[1] for
- details.
- -C <commit>::
- --reuse-message=<commit>::
- Take an existing commit object, and reuse the log message
- and the authorship information (including the timestamp)
- when creating the commit.
- -c <commit>::
- --reedit-message=<commit>::
- Like '-C', but with `-c` the editor is invoked, so that
- the user can further edit the commit message.
- --fixup=<commit>::
- Construct a commit message for use with `rebase --autosquash`.
- The commit message will be the subject line from the specified
- commit with a prefix of "fixup! ". See linkgit:git-rebase[1]
- for details.
- --squash=<commit>::
- Construct a commit message for use with `rebase --autosquash`.
- The commit message subject line is taken from the specified
- commit with a prefix of "squash! ". Can be used with additional
- commit message options (`-m`/`-c`/`-C`/`-F`). See
- linkgit:git-rebase[1] for details.
- --reset-author::
- When used with -C/-c/--amend options, or when committing after a
- conflicting cherry-pick, declare that the authorship of the
- resulting commit now belongs to the committer. This also renews
- the author timestamp.
- --short::
- When doing a dry-run, give the output in the short-format. See
- linkgit:git-status[1] for details. Implies `--dry-run`.
- --branch::
- Show the branch and tracking info even in short-format.
- --porcelain::
- When doing a dry-run, give the output in a porcelain-ready
- format. See linkgit:git-status[1] for details. Implies
- `--dry-run`.
- --long::
- When doing a dry-run, give the output in the long-format.
- Implies `--dry-run`.
- -z::
- --null::
- When showing `short` or `porcelain` status output, print the
- filename verbatim and terminate the entries with NUL, instead of LF.
- If no format is given, implies the `--porcelain` output format.
- Without the `-z` option, filenames with "unusual" characters are
- quoted as explained for the configuration variable `core.quotePath`
- (see linkgit:git-config[1]).
- -F <file>::
- --file=<file>::
- Take the commit message from the given file. Use '-' to
- read the message from the standard input.
- --author=<author>::
- Override the commit author. Specify an explicit author using the
- standard `A U Thor <author@example.com>` format. Otherwise <author>
- is assumed to be a pattern and is used to search for an existing
- commit by that author (i.e. rev-list --all -i --author=<author>);
- the commit author is then copied from the first such commit found.
- --date=<date>::
- Override the author date used in the commit.
- -m <msg>::
- --message=<msg>::
- Use the given <msg> as the commit message.
- If multiple `-m` options are given, their values are
- concatenated as separate paragraphs.
- +
- The `-m` option is mutually exclusive with `-c`, `-C`, and `-F`.
- -t <file>::
- --template=<file>::
- When editing the commit message, start the editor with the
- contents in the given file. The `commit.template` configuration
- variable is often used to give this option implicitly to the
- command. This mechanism can be used by projects that want to
- guide participants with some hints on what to write in the message
- in what order. If the user exits the editor without editing the
- message, the commit is aborted. This has no effect when a message
- is given by other means, e.g. with the `-m` or `-F` options.
- -s::
- --signoff::
- Add Signed-off-by line by the committer at the end of the commit
- log message. The meaning of a signoff depends on the project,
- but it typically certifies that committer has
- the rights to submit this work under the same license and
- agrees to a Developer Certificate of Origin
- (see http://developercertificate.org/ for more information).
- -n::
- --no-verify::
- This option bypasses the pre-commit and commit-msg hooks.
- See also linkgit:githooks[5].
- --allow-empty::
- Usually recording a commit that has the exact same tree as its
- sole parent commit is a mistake, and the command prevents you
- from making such a commit. This option bypasses the safety, and
- is primarily for use by foreign SCM interface scripts.
- --allow-empty-message::
- Like --allow-empty this command is primarily for use by foreign
- SCM interface scripts. It allows you to create a commit with an
- empty commit message without using plumbing commands like
- linkgit:git-commit-tree[1].
- --cleanup=<mode>::
- This option determines how the supplied commit message should be
- cleaned up before committing. The '<mode>' can be `strip`,
- `whitespace`, `verbatim`, `scissors` or `default`.
- +
- --
- strip::
- Strip leading and trailing empty lines, trailing whitespace,
- commentary and collapse consecutive empty lines.
- whitespace::
- Same as `strip` except #commentary is not removed.
- verbatim::
- Do not change the message at all.
- scissors::
- Same as `whitespace` except that everything from (and including)
- the line found below is truncated, if the message is to be edited.
- "`#`" can be customized with core.commentChar.
- # ------------------------ >8 ------------------------
- default::
- Same as `strip` if the message is to be edited.
- Otherwise `whitespace`.
- --
- +
- The default can be changed by the `commit.cleanup` configuration
- variable (see linkgit:git-config[1]).
- -e::
- --edit::
- The message taken from file with `-F`, command line with
- `-m`, and from commit object with `-C` are usually used as
- the commit log message unmodified. This option lets you
- further edit the message taken from these sources.
- --no-edit::
- Use the selected commit message without launching an editor.
- For example, `git commit --amend --no-edit` amends a commit
- without changing its commit message.
- --amend::
- Replace the tip of the current branch by creating a new
- commit. The recorded tree is prepared as usual (including
- the effect of the `-i` and `-o` options and explicit
- pathspec), and the message from the original commit is used
- as the starting point, instead of an empty message, when no
- other message is specified from the command line via options
- such as `-m`, `-F`, `-c`, etc. The new commit has the same
- parents and author as the current one (the `--reset-author`
- option can countermand this).
- +
- --
- It is a rough equivalent for:
- ------
- $ git reset --soft HEAD^
- $ ... do something else to come up with the right tree ...
- $ git commit -c ORIG_HEAD
- ------
- but can be used to amend a merge commit.
- --
- +
- You should understand the implications of rewriting history if you
- amend a commit that has already been published. (See the "RECOVERING
- FROM UPSTREAM REBASE" section in linkgit:git-rebase[1].)
- --no-post-rewrite::
- Bypass the post-rewrite hook.
- -i::
- --include::
- Before making a commit out of staged contents so far,
- stage the contents of paths given on the command line
- as well. This is usually not what you want unless you
- are concluding a conflicted merge.
- -o::
- --only::
- Make a commit by taking the updated working tree contents
- of the paths specified on the
- command line, disregarding any contents that have been
- staged for other paths. This is the default mode of operation of
- 'git commit' if any paths are given on the command line,
- in which case this option can be omitted.
- If this option is specified together with `--amend`, then
- no paths need to be specified, which can be used to amend
- the last commit without committing changes that have
- already been staged. If used together with `--allow-empty`
- paths are also not required, and an empty commit will be created.
- --pathspec-from-file=<file>::
- Pathspec is passed in `<file>` instead of commandline args. If
- `<file>` is exactly `-` then standard input is used. Pathspec
- elements are separated by LF or CR/LF. Pathspec elements can be
- quoted as explained for the configuration variable `core.quotePath`
- (see linkgit:git-config[1]). See also `--pathspec-file-nul` and
- global `--literal-pathspecs`.
- --pathspec-file-nul::
- Only meaningful with `--pathspec-from-file`. Pathspec elements are
- separated with NUL character and all other characters are taken
- literally (including newlines and quotes).
- -u[<mode>]::
- --untracked-files[=<mode>]::
- Show untracked files.
- +
- --
- The mode parameter is optional (defaults to 'all'), and is used to
- specify the handling of untracked files; when -u is not used, the
- default is 'normal', i.e. show untracked files and directories.
- The possible options are:
- - 'no' - Show no untracked files
- - 'normal' - Shows untracked files and directories
- - 'all' - Also shows individual files in untracked directories.
- The default can be changed using the status.showUntrackedFiles
- configuration variable documented in linkgit:git-config[1].
- --
- -v::
- --verbose::
- Show unified diff between the HEAD commit and what
- would be committed at the bottom of the commit message
- template to help the user describe the commit by reminding
- what changes the commit has.
- Note that this diff output doesn't have its
- lines prefixed with '#'. This diff will not be a part
- of the commit message. See the `commit.verbose` configuration
- variable in linkgit:git-config[1].
- +
- If specified twice, show in addition the unified diff between
- what would be committed and the worktree files, i.e. the unstaged
- changes to tracked files.
- -q::
- --quiet::
- Suppress commit summary message.
- --dry-run::
- Do not create a commit, but show a list of paths that are
- to be committed, paths with local changes that will be left
- uncommitted and paths that are untracked.
- --status::
- Include the output of linkgit:git-status[1] in the commit
- message template when using an editor to prepare the commit
- message. Defaults to on, but can be used to override
- configuration variable commit.status.
- --no-status::
- Do not include the output of linkgit:git-status[1] in the
- commit message template when using an editor to prepare the
- default commit message.
- -S[<keyid>]::
- --gpg-sign[=<keyid>]::
- --no-gpg-sign::
- GPG-sign commits. The `keyid` argument is optional and
- defaults to the committer identity; if specified, it must be
- stuck to the option without a space. `--no-gpg-sign` is useful to
- countermand both `commit.gpgSign` configuration variable, and
- earlier `--gpg-sign`.
- \--::
- Do not interpret any more arguments as options.
- <pathspec>...::
- When pathspec is given on the command line, commit the contents of
- the files that match the pathspec without recording the changes
- already added to the index. The contents of these files are also
- staged for the next commit on top of what have been staged before.
- +
- For more details, see the 'pathspec' entry in linkgit:gitglossary[7].
- EXAMPLES
- --------
- When recording your own work, the contents of modified files in
- your working tree are temporarily stored to a staging area
- called the "index" with 'git add'. A file can be
- reverted back, only in the index but not in the working tree,
- to that of the last commit with `git restore --staged <file>`,
- which effectively reverts 'git add' and prevents the changes to
- this file from participating in the next commit. After building
- the state to be committed incrementally with these commands,
- `git commit` (without any pathname parameter) is used to record what
- has been staged so far. This is the most basic form of the
- command. An example:
- ------------
- $ edit hello.c
- $ git rm goodbye.c
- $ git add hello.c
- $ git commit
- ------------
- Instead of staging files after each individual change, you can
- tell `git commit` to notice the changes to the files whose
- contents are tracked in
- your working tree and do corresponding `git add` and `git rm`
- for you. That is, this example does the same as the earlier
- example if there is no other change in your working tree:
- ------------
- $ edit hello.c
- $ rm goodbye.c
- $ git commit -a
- ------------
- The command `git commit -a` first looks at your working tree,
- notices that you have modified hello.c and removed goodbye.c,
- and performs necessary `git add` and `git rm` for you.
- After staging changes to many files, you can alter the order the
- changes are recorded in, by giving pathnames to `git commit`.
- When pathnames are given, the command makes a commit that
- only records the changes made to the named paths:
- ------------
- $ edit hello.c hello.h
- $ git add hello.c hello.h
- $ edit Makefile
- $ git commit Makefile
- ------------
- This makes a commit that records the modification to `Makefile`.
- The changes staged for `hello.c` and `hello.h` are not included
- in the resulting commit. However, their changes are not lost --
- they are still staged and merely held back. After the above
- sequence, if you do:
- ------------
- $ git commit
- ------------
- this second commit would record the changes to `hello.c` and
- `hello.h` as expected.
- After a merge (initiated by 'git merge' or 'git pull') stops
- because of conflicts, cleanly merged
- paths are already staged to be committed for you, and paths that
- conflicted are left in unmerged state. You would have to first
- check which paths are conflicting with 'git status'
- and after fixing them manually in your working tree, you would
- stage the result as usual with 'git add':
- ------------
- $ git status | grep unmerged
- unmerged: hello.c
- $ edit hello.c
- $ git add hello.c
- ------------
- After resolving conflicts and staging the result, `git ls-files -u`
- would stop mentioning the conflicted path. When you are done,
- run `git commit` to finally record the merge:
- ------------
- $ git commit
- ------------
- As with the case to record your own changes, you can use `-a`
- option to save typing. One difference is that during a merge
- resolution, you cannot use `git commit` with pathnames to
- alter the order the changes are committed, because the merge
- should be recorded as a single commit. In fact, the command
- refuses to run when given pathnames (but see `-i` option).
- COMMIT INFORMATION
- ------------------
- Author and committer information is taken from the following environment
- variables, if set:
- GIT_AUTHOR_NAME
- GIT_AUTHOR_EMAIL
- GIT_AUTHOR_DATE
- GIT_COMMITTER_NAME
- GIT_COMMITTER_EMAIL
- GIT_COMMITTER_DATE
- (nb "<", ">" and "\n"s are stripped)
- The author and committer names are by convention some form of a personal name
- (that is, the name by which other humans refer to you), although Git does not
- enforce or require any particular form. Arbitrary Unicode may be used, subject
- to the constraints listed above. This name has no effect on authentication; for
- that, see the `credential.username` variable in linkgit:git-config[1].
- In case (some of) these environment variables are not set, the information
- is taken from the configuration items `user.name` and `user.email`, or, if not
- present, the environment variable EMAIL, or, if that is not set,
- system user name and the hostname used for outgoing mail (taken
- from `/etc/mailname` and falling back to the fully qualified hostname when
- that file does not exist).
- The `author.name` and `committer.name` and their corresponding email options
- override `user.name` and `user.email` if set and are overridden themselves by
- the environment variables.
- The typical usage is to set just the `user.name` and `user.email` variables;
- the other options are provided for more complex use cases.
- :git-commit: 1
- include::date-formats.txt[]
- DISCUSSION
- ----------
- Though not required, it's a good idea to begin the commit message
- with a single short (less than 50 character) line summarizing the
- change, followed by a blank line and then a more thorough description.
- The text up to the first blank line in a commit message is treated
- as the commit title, and that title is used throughout Git.
- For example, linkgit:git-format-patch[1] turns a commit into email, and it uses
- the title on the Subject line and the rest of the commit in the body.
- include::i18n.txt[]
- ENVIRONMENT AND CONFIGURATION VARIABLES
- ---------------------------------------
- The editor used to edit the commit log message will be chosen from the
- `GIT_EDITOR` environment variable, the core.editor configuration variable, the
- `VISUAL` environment variable, or the `EDITOR` environment variable (in that
- order). See linkgit:git-var[1] for details.
- HOOKS
- -----
- This command can run `commit-msg`, `prepare-commit-msg`, `pre-commit`,
- `post-commit` and `post-rewrite` hooks. See linkgit:githooks[5] for more
- information.
- FILES
- -----
- `$GIT_DIR/COMMIT_EDITMSG`::
- This file contains the commit message of a commit in progress.
- If `git commit` exits due to an error before creating a commit,
- any commit message that has been provided by the user (e.g., in
- an editor session) will be available in this file, but will be
- overwritten by the next invocation of `git commit`.
- SEE ALSO
- --------
- linkgit:git-add[1],
- linkgit:git-rm[1],
- linkgit:git-mv[1],
- linkgit:git-merge[1],
- linkgit:git-commit-tree[1]
- GIT
- ---
- Part of the linkgit:git[1] suite
|