diff options
| author | Jonas Bernoulli <jonas@bernoul.li> | 2024-08-18 12:35:20 +0200 |
|---|---|---|
| committer | Jonas Bernoulli <jonas@bernoul.li> | 2024-08-18 12:35:20 +0200 |
| commit | 85bffbbfafcb0eb195f51c417971bbfe31d2d42b (patch) | |
| tree | ee8e3a596efe67585f32c8eb34b22359e36ed462 /docs | |
| parent | fecfa11e40078b9a902db455e97accb063b4aefd (diff) | |
Actually no longer track generated %.texi
Diffstat (limited to 'docs')
| -rw-r--r-- | docs/magit-section.texi | 331 | ||||
| -rw-r--r-- | docs/magit.texi | 11450 |
2 files changed, 0 insertions, 11781 deletions
diff --git a/docs/magit-section.texi b/docs/magit-section.texi deleted file mode 100644 index bf59f33..0000000 --- a/docs/magit-section.texi +++ /dev/null @@ -1,331 +0,0 @@ -\input texinfo @c -*- texinfo -*- -@c %**start of header -@setfilename magit-section.info -@settitle Magit-Section Developer Manual -@documentencoding UTF-8 -@documentlanguage en -@c %**end of header - -@copying -@quotation -Copyright (C) 2015-2024 Jonas Bernoulli <emacs.magit@@jonas.bernoulli.dev> - -You can redistribute this document and/or modify it under the terms -of the GNU General Public License as published by the Free Software -Foundation, either version 3 of the License, or (at your option) any -later version. - -This document is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE@. See the GNU -General Public License for more details. - -@end quotation -@end copying - -@dircategory Emacs -@direntry -* Magit-Section: (magit-section). Use Magit sections in your own packages. -@end direntry - -@finalout -@titlepage -@title Magit-Section Developer Manual -@subtitle for version 3.3.0.50-git -@author Jonas Bernoulli -@page -@vskip 0pt plus 1filll -@insertcopying -@end titlepage - -@contents - -@ifnottex -@node Top -@top Magit-Section Developer Manual - -This package implements the main user interface of Magit — the -collapsible sections that make up its buffers. This package used -to be distributed as part of Magit but how it can also be used by -other packages that have nothing to do with Magit or Git. - -To learn more about the section abstraction and available commands and -user options see @ref{Sections,,,magit,}. This manual documents how you -can use sections in your own packages. - -@noindent -This manual is for Magit-Section version 3.3.0.50-git. - -@insertcopying -@end ifnottex - -@menu -* Introduction:: -* Creating Sections:: -* Core Functions:: -* Matching Functions:: -@end menu - -@node Introduction -@chapter Introduction - -This package implements the main user interface of Magit — the -collapsible sections that make up its buffers. This package used -to be distributed as part of Magit but how it can also be used by -other packages that have nothing to do with Magit or Git. - -To learn more about the section abstraction and available commands -and user options see @ref{Sections,,,magit,}. This manual documents -how you can use sections in your own packages. - -When the documentation leaves something unaddressed, then please -consider that Magit uses this library extensively and search its -source for suitable examples before asking me for help. Thanks! - -@node Creating Sections -@chapter Creating Sections - -@defmac magit-insert-section [name] (type &optional value hide) &rest body -Create a section object of type CLASS, storing VALUE in its -@code{value} slot, and insert the section at point. CLASS is a -subclass of `magit-section' or has the form @code{(eval FORM)}, in -which case FORM is evaluated at runtime and should return a -subclass. In other places a sections class is often referred -to as its "type". - -Many commands behave differently depending on the class of the -current section and sections of a certain class can have their -own keymap, which is specified using the `keymap' class slot. -The value of that slot should be a variable whose value is a -keymap. - -For historic reasons Magit and Forge in most cases use symbols -as CLASS that don't actually identify a class and that lack the -appropriate package prefix. This works due to some undocumented -kludges, which are not available to other packages. - -When optional HIDE is non-nil collapse the section body by -default, i.e., when first creating the section, but not when -refreshing the buffer. Else expand it by default. This can be -overwritten using @code{magit-section-set-visibility-hook}. When a -section is recreated during a refresh, then the visibility of -predecessor is inherited and HIDE is ignored (but the hook is -still honored). - -BODY is any number of forms that actually insert the section's -heading and body. Optional NAME, if specified, has to be a -symbol, which is then bound to the object of the section being -inserted. - -Before BODY is evaluated the @code{start} of the section object is set -to the value of `point' and after BODY was evaluated its @code{end} is -set to the new value of @code{point}; BODY is responsible for moving -@code{point} forward. - -If it turns out inside BODY that the section is empty, then -@code{magit-cancel-section} can be used to abort and remove all traces -of the partially inserted section. This can happen when creating -a section by washing Git's output and Git didn't actually output -anything this time around. -@end defmac - -@defun magit-insert-heading [child-count] &rest args -Insert the heading for the section currently being inserted. - -This function should only be used inside @code{magit-insert-section}. - -When called without any arguments, then just set the @code{content} -slot of the object representing the section being inserted to -a marker at @code{point}. The section should only contain a single -line when this function is used like this. - -When called with arguments ARGS, which have to be strings, or -nil, then insert those strings at point. The section should not -contain any text before this happens and afterwards it should -again only contain a single line. If the @code{face} property is set -anywhere inside any of these strings, then insert all of them -unchanged. Otherwise use the `magit-section-heading' face for -all inserted text. - -The @code{content} property of the section object is the end of the -heading (which lasts from @code{start} to @code{content}) and the beginning -of the the body (which lasts from @code{content} to @code{end}). If the -value of @code{content} is nil, then the section has no heading and -its body cannot be collapsed. If a section does have a heading, -then its height must be exactly one line, including a trailing -newline character. This isn't enforced, you are responsible for -getting it right. The only exception is that this function does -insert a newline character if necessary. - -If provided, optional CHILD-COUNT must evaluate to an integer or -boolean. If t, then the count is determined once the children have been -inserted, using @code{magit-insert-child-count} (which see). For historic -reasons, if the heading ends with ":", the count is substituted for -that, at this time as well. If @code{magit-section-show-child-count} is nil, -no counts are inserted -@end defun - -@defmac magit-insert-section-body &rest body -Use BODY to insert the section body, once the section is expanded. -If the section is expanded when it is created, then this is -like @code{progn}. Otherwise BODY isn't evaluated until the section -is explicitly expanded. -@end defmac - -@defun magit-cancel-section -Cancel inserting the section that is currently being inserted. -Remove all traces of that section. -@end defun - -@defun magit-wash-sequence function -Repeatedly call FUNCTION until it returns @code{nil} or the end of the -buffer is reached. FUNCTION has to move point forward or return -@code{nil}. -@end defun - -@node Core Functions -@chapter Core Functions - -@defun magit-current-section -Return the section at point or where the context menu was invoked. -When using the context menu, return the section that the user -clicked on, provided the current buffer is the buffer in which -the click occurred. Otherwise return the section at point. -@end defun - -@table @asis -@item Function magit-section-at &optional position -Return the section at POSITION, defaulting to point. Default to -point even when the context menu is used. -@end table - -@defun magit-section-ident section -Return an unique identifier for SECTION@. The return value has the -form @code{((TYPE . VALUE)...)}. -@end defun - -@defun magit-section-ident-value value -Return a constant representation of VALUE@. - -VALUE is the value of a @code{magit-section} object. If that is an -object itself, then that is not suitable to be used to identify -the section because two objects may represent the same thing but -not be equal. If possible a method should be added for such -objects, which returns a value that is equal. Otherwise the -catch-all method is used, which just returns the argument -itself. -@end defun - -@defun magit-get-section ident &optional root -Return the section identified by IDENT@. -IDENT has to be a list as returned by @code{magit-section-ident}. -If optional ROOT is non-nil, then search in that section tree -instead of in the one whose root @code{magit-root-section} is. -@end defun - -@defun magit-section-lineage section &optional raw -Return the lineage of SECTION@. -If optional RAW is non-nil, return a list of section objects, -beginning with SECTION, otherwise return a list of section types. -@end defun - -@defun magit-section-content-p section -Return non-nil if SECTION has content or an unused washer function. -@end defun - -The next two functions are replacements for the Emacs functions that -have the same name except for the @code{magit-} prefix. Like -@code{magit-current-section} they do not act on point, the cursors position, -but on the position where the user clicked to invoke the context menu. - -If your package provides a context menu and some of its commands act -on the "thing at point", even if just as a default, then use the -prefixed functions to teach them to instead use the click location -when appropriate. - -@table @asis -@item Function magit-point -Return point or the position where the context menu was invoked. -When using the context menu, return the position the user clicked -on, provided the current buffer is the buffer in which the click -occurred. Otherwise return the same value as @code{point}. - -@item Function magit-thing-at-point thing &optional no-properties -Return the THING at point or where the context menu was invoked. -When using the context menu, return the thing the user clicked -on, provided the current buffer is the buffer in which the click -occurred. Otherwise return the same value as @code{thing-at-point}. -For the meaning of THING and NO-PROPERTIES see that function. -@end table - -@node Matching Functions -@chapter Matching Functions - -@defun magit-section-match condition &optional (section (magit-current-section)) -Return t if SECTION matches CONDITION@. - -SECTION defaults to the section at point. If SECTION is not -specified and there also is no section at point, then return -nil. - -CONDITION can take the following forms: - -@itemize -@item -@code{(CONDITION...)} matches if any of the CONDITIONs matches. -@item -@code{[CLASS...]} matches if the section's class is the same -as the first CLASS or a subclass of that; -the section's parent class matches the -second CLASS; and so on. - -@item -@code{[* CLASS...]} matches sections that match [CLASS@dots{}] and -also recursively all their child sections. -@item -@code{CLASS} matches if the section's class is the same -as CLASS or a subclass of that; regardless -of the classes of the parent sections. -@end itemize - -Each CLASS should be a class symbol, identifying a class that -derives from @code{magit-section}. For backward compatibility CLASS -can also be a "type symbol". A section matches such a symbol -if the value of its @code{type} slot is @code{eq}. If a type symbol has -an entry in @code{magit--section-type-alist}, then a section also -matches that type if its class is a subclass of the class that -corresponds to the type as per that alist. - -Note that it is not necessary to specify the complete section -lineage as printed by @code{magit-describe-section-briefly}, unless -of course you want to be that precise. -@end defun - -@defun magit-section-value-if condition &optional section -If the section at point matches CONDITION, then return its value. - -If optional SECTION is non-nil then test whether that matches -instead. If there is no section at point and SECTION is nil, -then return nil. If the section does not match, then return -nil. - -See @code{magit-section-match} for the forms CONDITION can take. -@end defun - -@defmac magit-section-case &rest clauses -Choose among clauses on the type of the section at point. - -Each clause looks like @code{(CONDITION BODY...)}. The type of the -section is compared against each CONDITION; the BODY forms of the -first match are evaluated sequentially and the value of the last -form is returned. Inside BODY the symbol @code{it} is bound to the -section at point. If no clause succeeds or if there is no -section at point, return nil. - -See @code{magit-section-match} for the forms CONDITION can take. -Additionally a CONDITION of t is allowed in the final clause, and -matches if no other CONDITION match, even if there is no section -at point. -@end defmac - -@bye diff --git a/docs/magit.texi b/docs/magit.texi deleted file mode 100644 index 71c1745..0000000 --- a/docs/magit.texi +++ /dev/null @@ -1,11450 +0,0 @@ -\input texinfo @c -*- texinfo -*- -@c %**start of header -@setfilename magit.info -@settitle Magit User Manual -@documentencoding UTF-8 -@documentlanguage en -@c %**end of header - -@copying -@quotation -Copyright (C) 2015-2024 Jonas Bernoulli <emacs.magit@@jonas.bernoulli.dev> - -You can redistribute this document and/or modify it under the terms -of the GNU General Public License as published by the Free Software -Foundation, either version 3 of the License, or (at your option) any -later version. - -This document is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE@. See the GNU -General Public License for more details. - -@end quotation -@end copying - -@dircategory Emacs -@direntry -* Magit: (magit). Using Git from Emacs with Magit. -@end direntry - -@finalout -@titlepage -@title Magit User Manual -@subtitle for version 3.3.0.50-git -@author Jonas Bernoulli -@page -@vskip 0pt plus 1filll -@insertcopying -@end titlepage - -@contents - -@ifnottex -@node Top -@top Magit User Manual - -Magit is an interface to the version control system Git, implemented -as an Emacs package. Magit aspires to be a complete Git porcelain. -While we cannot (yet) claim that Magit wraps and improves upon each -and every Git command, it is complete enough to allow even experienced -Git users to perform almost all of their daily version control tasks -directly from within Emacs. While many fine Git clients exist, only -Magit and Git itself deserve to be called porcelains. - -@noindent -This manual is for Magit version 3.3.0.50-git. - -@insertcopying -@end ifnottex - -@menu -* Introduction:: -* Installation:: -* Getting Started:: -* Interface Concepts:: -* Inspecting:: -* Manipulating:: -* Transferring:: -* Miscellaneous:: -* Customizing:: -* Plumbing:: -* FAQ:: -* Debugging Tools:: -* Keystroke Index:: -* Function and Command Index:: -* Variable Index:: - -@detailmenu ---- The Detailed Node Listing --- - -Installation - -* Installing from Melpa:: -* Installing from the Git Repository:: -* Post-Installation Tasks:: - -Interface Concepts - -* Modes and Buffers:: -* Sections:: -* Transient Commands:: -* Transient Arguments and Buffer Variables:: -* Completion, Confirmation and the Selection: Completion Confirmation and the Selection. -* Mouse Support:: -* Running Git:: - -Modes and Buffers - -* Switching Buffers:: -* Naming Buffers:: -* Quitting Windows:: -* Automatic Refreshing of Magit Buffers:: -* Automatic Saving of File-Visiting Buffers:: -* Automatic Reverting of File-Visiting Buffers:: - - -Sections - -* Section Movement:: -* Section Visibility:: -* Section Hooks:: -* Section Types and Values:: -* Section Options:: - - -Completion, Confirmation and the Selection - -* Action Confirmation:: -* Completion and Confirmation:: -* The Selection:: -* The hunk-internal region:: -* Support for Completion Frameworks:: -* Additional Completion Options:: - - -Running Git - -* Viewing Git Output:: -* Git Process Status:: -* Running Git Manually:: -* Git Executable:: -* Global Git Arguments:: - - -Inspecting - -* Status Buffer:: -* Repository List:: -* Logging:: -* Diffing:: -* Ediffing:: -* References Buffer:: -* Bisecting:: -* Visiting Files and Blobs:: -* Blaming:: - -Status Buffer - -* Status Sections:: -* Status Header Sections:: -* Status Module Sections:: -* Status Options:: - - -Logging - -* Refreshing Logs:: -* Log Buffer:: -* Log Margin:: -* Select from Log:: -* Reflog:: -* Cherries:: - - -Diffing - -* Refreshing Diffs:: -* Commands Available in Diffs:: -* Diff Options:: -* Revision Buffer:: - - -References Buffer - -* References Sections:: - - -Visiting Files and Blobs - -* General-Purpose Visit Commands:: -* Visiting Files and Blobs from a Diff:: - - -Manipulating - -* Creating Repository:: -* Cloning Repository:: -* Staging and Unstaging:: -* Applying:: -* Committing:: -* Branching:: -* Merging:: -* Resolving Conflicts:: -* Rebasing:: -* Cherry Picking:: -* Resetting:: -* Stashing:: - -Staging and Unstaging - -* Staging from File-Visiting Buffers:: - - -Committing - -* Initiating a Commit:: -* Editing Commit Messages:: - - -Branching - -* The Two Remotes:: -* Branch Commands:: -* Branch Git Variables:: -* Auxiliary Branch Commands:: - - -Rebasing - -* Editing Rebase Sequences:: -* Information About In-Progress Rebase:: - - -Cherry Picking - -* Reverting:: - - -Transferring - -* Remotes:: -* Fetching:: -* Pulling:: -* Pushing:: -* Plain Patches:: -* Maildir Patches:: - -Remotes - -* Remote Commands:: -* Remote Git Variables:: - - -Miscellaneous - -* Tagging:: -* Notes:: -* Submodules:: -* Subtree:: -* Worktree:: -* Sparse checkouts:: -* Bundle:: -* Common Commands:: -* Wip Modes:: -* Commands for Buffers Visiting Files:: -* Minor Mode for Buffers Visiting Blobs:: - -Submodules - -* Listing Submodules:: -* Submodule Transient:: - - -Wip Modes - -* Wip Graph:: -* Legacy Wip Modes:: - - -Customizing - -* Per-Repository Configuration:: -* Essential Settings:: - -Essential Settings - -* Safety:: -* Performance:: -* Global Bindings:: - - -Plumbing - -* Calling Git:: -* Section Plumbing:: -* Refreshing Buffers:: -* Conventions:: - -Calling Git - -* Getting a Value from Git:: -* Calling Git for Effect:: - - -Section Plumbing - -* Creating Sections:: -* Section Selection:: -* Matching Sections:: - - -Conventions - -* Theming Faces:: - - -FAQ - -* FAQ - How to @dots{}?:: -* FAQ - Issues and Errors:: - -FAQ - How to @dots{}? - -* How to pronounce Magit?:: -* How to show git's output?:: -* How to install the gitman info manual?:: -* How to show diffs for gpg-encrypted files?:: -* How does branching and pushing work?:: -* Should I disable VC@?:: - - -FAQ - Issues and Errors - -* Magit is slow:: -* I changed several thousand files at once and now Magit is unusable:: -* I am having problems committing:: -* I am using MS Windows and cannot push with Magit:: -* I am using macOS and SOMETHING works in shell, but not in Magit: I am using macOS and SOMETHING works in shell but not in Magit. -* Expanding a file to show the diff causes it to disappear:: -* Point is wrong in the @code{COMMIT_EDITMSG} buffer:: -* The mode-line information isn't always up-to-date:: -* A branch and tag sharing the same name breaks SOMETHING:: -* My Git hooks work on the command-line but not inside Magit:: -* @code{git-commit-mode} isn't used when committing from the command-line:: -* Point ends up inside invisible text when jumping to a file-visiting buffer:: -* I am no longer able to save popup defaults:: - - -@end detailmenu -@end menu - -@node Introduction -@chapter Introduction - -Magit is an interface to the version control system Git, implemented -as an Emacs package. Magit aspires to be a complete Git porcelain. -While we cannot (yet) claim that Magit wraps and improves upon each -and every Git command, it is complete enough to allow even experienced -Git users to perform almost all of their daily version control tasks -directly from within Emacs. While many fine Git clients exist, only -Magit and Git itself deserve to be called porcelains. - -Staging and otherwise applying changes is one of the most important -features in a Git porcelain and here Magit outshines anything else, -including Git itself. Git's own staging interface (@code{git add --patch}) -is so cumbersome that many users only use it in exceptional cases. -In Magit staging a hunk or even just part of a hunk is as trivial as -staging all changes made to a file. - -The most visible part of Magit's interface is the status buffer, which -displays information about the current repository. Its content is -created by running several Git commands and making their output -actionable. Among other things, it displays information about the -current branch, lists unpulled and unpushed changes and contains -sections displaying the staged and unstaged changes. That might sound -noisy, but, since sections are collapsible, it's not. - -To stage or unstage a change one places the cursor on the change and -then types @code{s} or @code{u}. The change can be a file or a hunk, or when the -region is active (i.e., when there is a selection) several files or -hunks, or even just part of a hunk. The change or changes that these -commands - and many others - would act on are highlighted. - -Magit also implements several other "apply variants" in addition to -staging and unstaging. One can discard or reverse a change, or -apply it to the working tree. Git's own porcelain only supports this -for staging and unstaging and you would have to do something like @code{git -diff ... | ??? | git apply ...} to discard, revert, or apply a single -hunk on the command line. In fact that's exactly what Magit does -internally (which is what lead to the term "apply variants"). - -Magit isn't just for Git experts, but it does assume some prior -experience with Git as well as Emacs. That being said, many users -have reported that using Magit was what finally taught them what Git -is capable of and how to use it to its fullest. Other users -wished they had switched to Emacs sooner so that they would have -gotten their hands on Magit earlier. - -While one has to know the basic features of Emacs to be able to make -full use of Magit, acquiring just enough Emacs skills doesn't take -long and is worth it, even for users who prefer other editors. Vim -users are advised to give @uref{https://github.com/emacs-evil/evil, Evil}, the "Extensible VI Layer for Emacs", -and @uref{https://github.com/syl20bnr/spacemacs, Spacemacs}, an "Emacs starter-kit focused on Evil" a try. - -Magit provides a consistent and efficient Git porcelain. After a -short learning period, you will be able to perform most of your daily -version control tasks faster than you would on the command line. You -will likely also start using features that seemed too daunting in the -past. - -Magit fully embraces Git. It exposes many advanced features using a -simple but flexible interface instead of only wrapping the trivial -ones like many GUI clients do. Of course Magit supports logging, -cloning, pushing, and other commands that usually don't fail in -spectacular ways; but it also supports tasks that often cannot be -completed in a single step. Magit fully supports tasks such as -merging, rebasing, cherry-picking, reverting, and blaming by not only -providing a command to initiate these tasks but also by displaying -context sensitive information along the way and providing commands -that are useful for resolving conflicts and resuming the sequence -after doing so. - -Magit wraps and in many cases improves upon at least the following Git -porcelain commands: @code{add}, @code{am}, @code{bisect}, @code{blame}, @code{branch}, @code{checkout}, @code{cherry}, -@code{cherry-pick}, @code{clean}, @code{clone}, @code{commit}, @code{config}, @code{describe}, @code{diff}, @code{fetch}, -@code{format-patch}, @code{init}, @code{log}, @code{merge}, @code{merge-tree}, @code{mv}, @code{notes}, @code{pull}, @code{rebase}, -@code{reflog}, @code{remote}, @code{request-pull}, @code{reset}, @code{revert}, @code{rm}, @code{show}, @code{stash}, -@code{submodule}, @code{subtree}, @code{tag}, and @code{worktree.} Many more Magit porcelain -commands are implemented on top of Git plumbing commands. - -@node Installation -@chapter Installation - -Magit can be installed using Emacs' package manager or manually from -its development repository. - -@menu -* Installing from Melpa:: -* Installing from the Git Repository:: -* Post-Installation Tasks:: -@end menu - -@node Installing from Melpa -@section Installing from Melpa - -Magit is available from Melpa and Melpa-Stable. If you haven't used -Emacs' package manager before, then it is high time you familiarize -yourself with it by reading the documentation in the Emacs manual, see -@ref{Packages,,,emacs,}. Then add one of the archives to -@code{package-archives}: - -@itemize -@item -To use Melpa: -@end itemize - -@lisp -(require 'package) -(add-to-list 'package-archives - '("melpa" . "https://melpa.org/packages/") t) -@end lisp - -@itemize -@item -To use Melpa-Stable: -@end itemize - -@lisp -(require 'package) -(add-to-list 'package-archives - '("melpa-stable" . "https://stable.melpa.org/packages/") t) -@end lisp - -Once you have added your preferred archive, you need to update the -local package list using: - -@example -M-x package-refresh-contents RET -@end example - -Once you have done that, you can install Magit and its dependencies -using: - -@example -M-x package-install RET magit RET -@end example - -Now see @ref{Post-Installation Tasks}. - -@node Installing from the Git Repository -@section Installing from the Git Repository - -Magit depends on the @code{compat}, @code{dash}, @code{transient} and @code{with-editor} libraries -which are available from Melpa and Melpa-Stable. Install them using -@code{M-x package-install RET <package> RET}. Of course you may also install -them manually from their repository. - -Then clone the Magit repository: - -@example -$ git clone https://github.com/magit/magit.git ~/.emacs.d/site-lisp/magit -$ cd ~/.emacs.d/site-lisp/magit -@end example - -Then compile the libraries and generate the info manuals: - -@example -$ make -@end example - -If you haven't installed @code{compat}, @code{dash}, @code{transient} and @code{with-editor} from -Melpa or at @code{/path/to/magit/../<package>}, then you have to tell @code{make} -where to find them. To do so create the file @code{/path/to/magit/config.mk} -with the following content before running @code{make}: - -@example -LOAD_PATH = -L ~/.emacs.d/site-lisp/magit/lisp -LOAD_PATH += -L ~/.emacs.d/site-lisp/dash -LOAD_PATH += -L ~/.emacs.d/site-lisp/transient/lisp -LOAD_PATH += -L ~/.emacs.d/site-lisp/with-editor/lisp -LOAD_PATH += -L ~/.emacs.d/site-lisp/compat -@end example - -Finally add this to your init file: - -@lisp -(add-to-list 'load-path "~/.emacs.d/site-lisp/magit/lisp") -(require 'magit) - -(with-eval-after-load 'info - (info-initialize) - (add-to-list 'Info-directory-list - "~/.emacs.d/site-lisp/magit/Documentation/")) -@end lisp - -Of course if you installed the dependencies manually as well, then -you have to tell Emacs about them too, by prefixing the above with: - -@lisp -(add-to-list 'load-path "~/.emacs.d/site-lisp/dash") -(add-to-list 'load-path "~/.emacs.d/site-lisp/transient/lisp") -(add-to-list 'load-path "~/.emacs.d/site-lisp/with-editor") -@end lisp - -Note that you have to add the @code{lisp} subdirectory to the @code{load-path}, not -the top-level of the repository, and that elements of @code{load-path} should -not end with a slash, while those of @code{Info-directory-list} should. - -Instead of requiring the feature @code{magit}, you could load just the -autoload definitions, by loading the file @code{magit-autoloads.el}. - -@lisp -(load "/path/to/magit/lisp/magit-autoloads") -@end lisp - -Instead of running Magit directly from the repository by adding that -to the @code{load-path}, you might want to instead install it in some other -directory using @code{sudo make install} and setting @code{load-path} accordingly. - -To update Magit use: - -@example -$ git pull -$ make -@end example - -At times it might be necessary to run @code{make clean all} instead. - -To view all available targets use @code{make help}. - -Now see @ref{Post-Installation Tasks}. - -@node Post-Installation Tasks -@section Post-Installation Tasks - -After installing Magit you should verify that you are indeed using the -Magit, Git, and Emacs releases you think you are using. It's best to -restart Emacs before doing so, to make sure you are not using an -outdated value for @code{load-path}. - -@example -M-x magit-version RET -@end example - -should display something like - -@example -Magit 2.8.0, Git 2.10.2, Emacs 25.1.1, gnu/linux -@end example - -Then you might also want to read about options that many users likely -want to customize. See @ref{Essential Settings}. - -To be able to follow cross references to Git manpages found in this -manual, you might also have to manually install the @code{gitman} info manual, -or advice @code{Info-follow-nearest-node} to instead open the actual manpage. -See @ref{How to install the gitman info manual?}. - -If you are completely new to Magit then see @ref{Getting Started}. - -If you run into problems, then please see the @ref{FAQ}. Also see the -@ref{Debugging Tools}. - -And last but not least please consider making a donation, to ensure -that I can keep working on Magit. See @uref{https://magit.vc/donations}. -for various donation options. - -@node Getting Started -@chapter Getting Started - -This short tutorial describes the most essential features that many -Magitians use on a daily basis. It only scratches the surface but -should be enough to get you started. - -IMPORTANT: It is safest if you clone some repository just for this -tutorial. Alternatively you can use an existing local repository, but -if you do that, then you should commit all uncommitted changes before -proceeding. - -Type @code{C-x g} to display information about the current Git repository in -a dedicated buffer, called the status buffer. - -Most Magit commands are commonly invoked from the status buffer. It -can be considered the primary interface for interacting with Git using -Magit. Many other Magit buffers may exist at a given time, but they -are often created from this buffer. - -Depending on what state your repository is in, this buffer may contain -sections titled "Staged changes", "Unstaged changes", "Unmerged into -origin/master", "Unpushed to origin/master", and many others. - -Since we are starting from a safe state, which you can easily return -to (by doing a @code{git reset --hard PRE-MAGIT-STATE}), there currently are -no staged or unstaged changes. Edit some files and save the changes. -Then go back to the status buffer, while at the same time refreshing -it, by typing @code{C-x g}. (When the status buffer, or any Magit buffer for -that matter, is the current buffer, then you can also use just @code{g} to -refresh it). - -Move between sections using @code{p} and @code{n}. Note that the bodies of some -sections are hidden. Type @code{TAB} to expand or collapse the section at -point. You can also use @code{C-tab} to cycle the visibility of the current -section and its children. Move to a file section inside the section -named "Unstaged changes" and type @code{s} to stage the changes you have made -to that file. That file now appears under "Staged changes". - -Magit can stage and unstage individual hunks, not just complete files. -Move to the file you have just staged, expand it using @code{TAB}, move to -one of the hunks using @code{n}, and unstage just that by typing @code{u}. Note how -the staging (@code{s}) and unstaging (@code{u}) commands operate on the change at -point. Many other commands behave the same way. - -You can also un-/stage just part of a hunk. Inside the body of a hunk -section (move there using @code{C-n}), set the mark using @code{C-SPC} and move down -until some added and/or removed lines fall inside the region but not -all of them. Again type @code{s} to stage. - -It is also possible to un-/stage multiple files at once. Move to a -file section, type @code{C-SPC}, move to the next file using @code{n}, and then @code{s} to -stage both files. Note that both the mark and point have to be on the -headings of sibling sections for this to work. If the region looks -like it does in other buffers, then it doesn't select Magit sections -that can be acted on as a unit. - -And then of course you want to commit your changes. Type @code{c}. This -shows the available commit commands and arguments in a buffer at the -bottom of the frame. Each command and argument is prefixed with the -key that invokes/sets it. Do not worry about this for now. We want -to create a "normal" commit, which is done by typing @code{c} again. - -Now two new buffers appear. One is for writing the commit message, -the other shows a diff with the changes that you are about to -commit. Write a message and then type @code{C-c C-c} to actually create -the commit. - -You probably don't want to push the commit you just created because -you just committed some random changes, but if that is not the case -you could push it by typing @code{P} to show all the available push commands -and arguments and then @code{p} to push to a branch with the same name as the -local branch onto the remote configured as the push-remote. (If the -push-remote is not configured yet, then you would first be prompted -for the remote to push to.) - -So far we have mentioned the commit and push menu commands. -These are probably among the menus you will be using the most, but -many others exist. To show a menu that lists all other menus (as well -as the various apply commands and some other essential commands), type -@code{h}. Try a few. (Such menus are also called "transient prefix -commands" or just "transients".) - -The key bindings in that menu correspond to the bindings in Magit -buffers, including but not limited to the status buffer. So you could -type @code{h d} to bring up the diff menu, but once you remember that "d" -stands for "diff", you would usually do so by just typing @code{d}. - -This "prefix of prefixes" is useful even once you have memorized all -the bindings, as it can provide easy access to Magit commands from -non-Magit buffers. So, by default, it is globally bound to @code{C-x M-g}. - -A similar menu featuring (for the most part) commands that act on just -the file being visited in the current buffer, is globally bound to @code{C-c -M-g}. That binding can also be used in buffers, which do not visit a -file, but then only a subset of the commands is available. - -The global key bindings mentioned in the previous two paragraphs are -quite inconvenient. We recommend using @code{C-c g} and @code{C-c f} instead, but -cannot use those key sequences by default because they are strictly -reserved for bindings added by the user. See @ref{Global Bindings}, if you -want to explicitly opt-in to the recommended key bindings. - -Magit also provides context menus and other mouse commands, see @ref{Mouse Support}. - -It is not necessary that you do so now, but if you stick with Magit, -then it is highly recommended that you read the next section too. - -@node Interface Concepts -@chapter Interface Concepts - -@menu -* Modes and Buffers:: -* Sections:: -* Transient Commands:: -* Transient Arguments and Buffer Variables:: -* Completion, Confirmation and the Selection: Completion Confirmation and the Selection. -* Mouse Support:: -* Running Git:: -@end menu - -@node Modes and Buffers -@section Modes and Buffers - -Magit provides several major-modes. For each of these modes there -usually exists only one buffer per repository. Separate modes and -thus buffers exist for commits, diffs, logs, and some other things. - -Besides these special purpose buffers, there also exists an overview -buffer, called the @strong{status buffer}. It's usually from this buffer that -the user invokes Git commands, or creates or visits other buffers. - -In this manual we often speak about "Magit buffers". By that we mean -buffers whose major-modes derive from @code{magit-mode}. - -@table @asis -@item @kbd{M-x magit-toggle-buffer-lock} -@findex magit-toggle-buffer-lock -This command locks the current buffer to its value or if the buffer -is already locked, then it unlocks it. - -Locking a buffer to its value prevents it from being reused to -display another value. The name of a locked buffer contains its -value, which allows telling it apart from other locked buffers and -the unlocked buffer. - -Not all Magit buffers can be locked to their values; for example, it -wouldn't make sense to lock a status buffer. - -There can only be a single unlocked buffer using a certain -major-mode per repository. So when a buffer is being unlocked and -another unlocked buffer already exists for that mode and repository, -then the former buffer is instead deleted and the latter is -displayed in its place. -@end table - -@menu -* Switching Buffers:: -* Naming Buffers:: -* Quitting Windows:: -* Automatic Refreshing of Magit Buffers:: -* Automatic Saving of File-Visiting Buffers:: -* Automatic Reverting of File-Visiting Buffers:: -@end menu - -@node Switching Buffers -@subsection Switching Buffers - -@defun magit-display-buffer buffer &optional display-function -This function is a wrapper around @code{display-buffer} and is used to -display any Magit buffer. It displays BUFFER in some window and, -unlike @code{display-buffer}, also selects that window, provided -@code{magit-display-buffer-noselect} is @code{nil}. It also runs the hooks -mentioned below. - -If optional DISPLAY-FUNCTION is non-nil, then that is used to -display the buffer. Usually that is @code{nil} and the function specified -by @code{magit-display-buffer-function} is used. -@end defun - -@defvar magit-display-buffer-noselect -When this is non-nil, then @code{magit-display-buffer} only displays the -buffer but forgoes also selecting the window. This variable should -not be set globally, it is only intended to be let-bound, by code -that automatically updates "the other window". This is used for -example when the revision buffer is updated when you move inside the -log buffer. -@end defvar - -@defopt magit-display-buffer-function -The function specified here is called by @code{magit-display-buffer} with -one argument, a buffer, to actually display that buffer. This -function should call @code{display-buffer} with that buffer as first and a -list of display actions as second argument. - -Magit provides several functions, listed below, that are suitable -values for this option. If you want to use different rules, then a -good way of doing that is to start with a copy of one of these -functions and then adjust it to your needs. - -Instead of using a wrapper around @code{display-buffer}, that function -itself can be used here, in which case the display actions have to -be specified by adding them to @code{display-buffer-alist} instead. - -To learn about display actions, see @ref{Choosing Window,,,elisp,}. -@end defopt - -@defun magit-display-buffer-traditional buffer -This function is the current default value of the option -@code{magit-display-buffer-function}. Before that option and this function -were added, the behavior was hard-coded in many places all over the -code base but now all the rules are contained in this one function -(except for the "noselect" special case mentioned above). -@end defun - -@defun magit-display-buffer-same-window-except-diff-v1 -This function displays most buffers in the currently selected -window. If a buffer's mode derives from @code{magit-diff-mode} or -@code{magit-process-mode}, it is displayed in another window. -@end defun - -@defun magit-display-buffer-fullframe-status-v1 -This function fills the entire frame when displaying a status -buffer. Otherwise, it behaves like -@code{magit-display-buffer-traditional}. -@end defun - -@defun magit-display-buffer-fullframe-status-topleft-v1 -This function fills the entire frame when displaying a status -buffer. It behaves like @code{magit-display-buffer-fullframe-status-v1} -except that it displays buffers that derive from @code{magit-diff-mode} -or @code{magit-process-mode} to the top or left of the current buffer -rather than to the bottom or right. As a result, Magit buffers tend -to pop up on the same side as they would if -@code{magit-display-buffer-traditional} were in use. -@end defun - -@defun magit-display-buffer-fullcolumn-most-v1 -This function displays most buffers so that they fill the entire -height of the frame. However, the buffer is displayed in another -window if (1) the buffer's mode derives from @code{magit-process-mode}, -or (2) the buffer's mode derives from @code{magit-diff-mode}, provided -that the mode of the current buffer derives from @code{magit-log-mode} or -@code{magit-cherry-mode}. -@end defun - -@defopt magit-pre-display-buffer-hook -This hook is run by @code{magit-display-buffer} before displaying the -buffer. -@end defopt - -@defun magit-save-window-configuration -This function saves the current window configuration. Later when -the buffer is buried, it may be restored by -@code{magit-restore-window-configuration}. -@end defun - -@defopt magit-post-display-buffer-hook -This hook is run by @code{magit-display-buffer} after displaying the -buffer. -@end defopt - -@defun magit-maybe-set-dedicated -This function remembers if a new window had to be created to display -the buffer, or whether an existing window was reused. This -information is later used by @code{magit-mode-quit-window}, to determine -whether the window should be deleted when its last Magit buffer is -buried. -@end defun - -@node Naming Buffers -@subsection Naming Buffers - -@defopt magit-generate-buffer-name-function -The function used to generate the names of Magit buffers. - -Such a function should take the options @code{magit-uniquify-buffer-names} -as well as @code{magit-buffer-name-format} into account. If it doesn't, -then should be clearly stated in the doc-string. And if it supports -%-sequences beyond those mentioned in the doc-string of the option -@code{magit-buffer-name-format}, then its own doc-string should describe -the additions. -@end defopt - -@defun magit-generate-buffer-name-default-function mode -This function returns a buffer name suitable for a buffer whose -major-mode is MODE and which shows information about the repository -in which @code{default-directory} is located. - -This function uses @code{magit-buffer-name-format} and supporting all of -the %-sequences mentioned the documentation of that option. It also -respects the option @code{magit-uniquify-buffer-names}. -@end defun - -@defopt magit-buffer-name-format -The format string used to name Magit buffers. - -At least the following %-sequences are supported: - -@itemize -@item -@code{%m} - -The name of the major-mode, but with the @code{-mode} suffix removed. - -@item -@code{%M} - -Like @code{%m} but abbreviate @code{magit-status-mode} as @code{magit}. - -@item -@code{%v} - -The value the buffer is locked to, in parentheses, or an empty -string if the buffer is not locked to a value. - -@item -@code{%V} - -Like @code{%v}, but the string is prefixed with a space, unless it is an -empty string. - -@item -@code{%t} - -The top-level directory of the working tree of the repository, or -if @code{magit-uniquify-buffer-names} is non-nil an abbreviation of that. - -@item -@code{%x} - -If @code{magit-uniquify-buffer-names} is nil "*", otherwise the empty -string. Due to limitations of the @code{uniquify} package, buffer names -must end with the path. -@end itemize - -The value should always contain @code{%m} or @code{%M}, @code{%v} or @code{%V}, and @code{%t}. If -@code{magit-uniquify-buffer-names} is non-nil, then the value must end with -@code{%t} or @code{%t%x}. See issue #2841. -@end defopt - -@defopt magit-uniquify-buffer-names -This option controls whether the names of Magit buffers are -uniquified. If the names are not being uniquified, then they -contain the full path of the top-level of the working tree of the -corresponding repository. If they are being uniquified, then they -end with the basename of the top-level, or if that would conflict -with the name used for other buffers, then the names of all these -buffers are adjusted until they no longer conflict. - -This is done using the @code{uniquify} package; customize its options to -control how buffer names are uniquified. -@end defopt - -@node Quitting Windows -@subsection Quitting Windows - -@table @asis -@item @kbd{q} (@code{magit-mode-bury-buffer}) -@kindex q -@findex magit-mode-bury-buffer -This command buries or kills the current Magit buffer. The function -specified by option @code{magit-bury-buffer-function} is used to bury the -buffer when called without a prefix argument or to kill it when -called with a single prefix argument. - -When called with two or more prefix arguments then it always kills -all Magit buffers, associated with the current project, including -the current buffer. -@end table - -@defopt magit-bury-buffer-function -The function used to actually bury or kill the current buffer. - -@code{magit-mode-bury-buffer} calls this function with one argument. If -the argument is non-nil, then the function has to kill the current -buffer. Otherwise it has to bury it alive. The default value -currently is @code{magit-mode-quit-window}. -@end defopt - -@defun magit-restore-window-configuration kill-buffer -Bury or kill the current buffer using @code{quit-window}, which is called -with KILL-BUFFER as first and the selected window as second -argument. - -Then restore the window configuration that existed right before the -current buffer was displayed in the selected frame. Unfortunately -that also means that point gets adjusted in all the buffers, which -are being displayed in the selected frame. -@end defun - -@defun magit-mode-quit-window kill-buffer -Bury or kill the current buffer using @code{quit-window}, which is called -with KILL-BUFFER as first and the selected window as second -argument. - -Then, if the window was originally created to display a Magit buffer -and the buried buffer was the last remaining Magit buffer that was -ever displayed in the window, then that is deleted. -@end defun - -@node Automatic Refreshing of Magit Buffers -@subsection Automatic Refreshing of Magit Buffers - -After running a command which may change the state of the current -repository, the current Magit buffer and the corresponding status -buffer are refreshed. The status buffer can be automatically refreshed -whenever a buffer is saved to a file inside the respective repository -by adding a hook, like so: - -@lisp -(with-eval-after-load 'magit-mode - (add-hook 'after-save-hook 'magit-after-save-refresh-status t)) -@end lisp - -Automatically refreshing Magit buffers ensures that the displayed -information is up-to-date most of the time but can lead to a -noticeable delay in big repositories. Other Magit buffers are not -refreshed to keep the delay to a minimum and also because doing so can -sometimes be undesirable. - -Buffers can also be refreshed explicitly, which is useful in buffers -that weren't current during the last refresh and after changes were -made to the repository outside of Magit. - -@table @asis -@item @kbd{g} (@code{magit-refresh}) -@kindex g -@findex magit-refresh -This command refreshes the current buffer if its major mode derives -from @code{magit-mode} as well as the corresponding status buffer. - -If the option @code{magit-revert-buffers} calls for it, then it also -reverts all unmodified buffers that visit files being tracked in the -current repository. - -@item @kbd{G} (@code{magit-refresh-all}) -@kindex G -@findex magit-refresh-all -This command refreshes all Magit buffers belonging to the current -repository and also reverts all unmodified buffers that visit files -being tracked in the current repository. - -The file-visiting buffers are always reverted, even if -@code{magit-revert-buffers} is nil. -@end table - -@defopt magit-refresh-buffer-hook -This hook is run in each Magit buffer that was refreshed during the -current refresh - normally the current buffer and the status buffer. -@end defopt - -@defopt magit-refresh-status-buffer -When this option is non-nil, then the status buffer is automatically -refreshed after running git for side-effects, in addition to the -current Magit buffer, which is always refreshed automatically. - -Only set this to nil after exhausting all other options to improve -performance. -@end defopt - -@defun magit-after-save-refresh-status -This function is intended to be added to @code{after-save-hook}. After -doing that the corresponding status buffer is refreshed whenever a -buffer is saved to a file inside a repository. - -Note that refreshing a Magit buffer is done by re-creating its -contents from scratch, which can be slow in large repositories. If -you are not satisfied with Magit's performance, then you should -obviously not add this function to that hook. -@end defun - -@node Automatic Saving of File-Visiting Buffers -@subsection Automatic Saving of File-Visiting Buffers - -File-visiting buffers are by default saved at certain points in time. -This doesn't guarantee that Magit buffers are always up-to-date, but, -provided one only edits files by editing them in Emacs and uses only -Magit to interact with Git, one can be fairly confident. When in -doubt or after outside changes, type @code{g} (@code{magit-refresh}) to save and -refresh explicitly. - -@defopt magit-save-repository-buffers -This option controls whether file-visiting buffers are saved before -certain events. - -If this is non-nil then all modified file-visiting buffers belonging -to the current repository may be saved before running commands, -before creating new Magit buffers, and before explicitly refreshing -such buffers. If this is @code{dontask} then this is done without user -intervention. If it is @code{t} then the user has to confirm each save. -@end defopt - -@node Automatic Reverting of File-Visiting Buffers -@subsection Automatic Reverting of File-Visiting Buffers - -By default Magit automatically reverts buffers that are visiting files -that are being tracked in a Git repository, after they have changed on -disk. When using Magit one often changes files on disk by running -Git, i.e., "outside Emacs", making this a rather important feature. - -For example, if you discard a change in the status buffer, then that -is done by running @code{git apply --reverse ...}, and Emacs considers the -file to have "changed on disk". If Magit did not automatically revert -the buffer, then you would have to type @code{M-x revert-buffer RET RET} in -the visiting buffer before you could continue making changes. - -@defopt magit-auto-revert-mode -When this mode is enabled, then buffers that visit tracked files -are automatically reverted after the visited files change on disk. -@end defopt - -@defopt global-auto-revert-mode -When this mode is enabled, then any file-visiting buffer is -automatically reverted after the visited file changes on disk. - -If you like buffers that visit tracked files to be automatically -reverted, then you might also like any buffer to be reverted, not -just those visiting tracked files. If that is the case, then enable -this mode @emph{instead of} @code{magit-auto-revert-mode}. -@end defopt - -@defopt magit-auto-revert-immediately -This option controls whether Magit reverts buffers immediately. - -If this is non-nil and either @code{global-auto-revert-mode} or -@code{magit-auto-revert-mode} is enabled, then Magit immediately reverts -buffers by explicitly calling @code{auto-revert-buffers} after running Git -for side-effects. - -If @code{auto-revert-use-notify} is non-nil (and file notifications are -actually supported), then @code{magit-auto-revert-immediately} does not -have to be non-nil, because the reverts happen immediately anyway. - -If @code{magit-auto-revert-immediately} and @code{auto-revert-use-notify} are both -@code{nil}, then reverts happen after @code{auto-revert-interval} seconds of user -inactivity. That is not desirable. -@end defopt - -@defopt auto-revert-use-notify -This option controls whether file notification functions should be -used. Note that this variable unfortunately defaults to @code{t} even on -systems on which file notifications cannot be used. -@end defopt - -@defopt magit-auto-revert-tracked-only -This option controls whether @code{magit-auto-revert-mode} only reverts -tracked files or all files that are located inside Git repositories, -including untracked files and files located inside Git's control -directory. -@end defopt - -@defopt auto-revert-mode -The global mode @code{magit-auto-revert-mode} works by turning on this -local mode in the appropriate buffers (but @code{global-auto-revert-mode} -is implemented differently). You can also turn it on or off -manually, which might be necessary if Magit does not notice that a -previously untracked file now is being tracked or vice-versa. -@end defopt - -@defopt auto-revert-stop-on-user-input -This option controls whether the arrival of user input suspends the -automatic reverts for @code{auto-revert-interval} seconds. -@end defopt - -@defopt auto-revert-interval -This option controls how many seconds Emacs waits for before -resuming suspended reverts. -@end defopt - -@defopt auto-revert-buffer-list-filter -This option specifies an additional filter used by -@code{auto-revert-buffers} to determine whether a buffer should be reverted -or not. - -This option is provided by Magit, which also advises -@code{auto-revert-buffers} to respect it. Magit users who do not turn on -the local mode @code{auto-revert-mode} themselves, are best served by -setting the value to @code{magit-auto-revert-repository-buffer-p}. - -However the default is nil, so as not to disturb users who do use the -local mode directly. If you experience delays when running Magit -commands, then you should consider using one of the predicates -provided by Magit - especially if you also use Tramp. - -Users who do turn on @code{auto-revert-mode} in buffers in which Magit -doesn't do that for them, should likely not use any filter. Users -who turn on @code{global-auto-revert-mode}, do not have to worry about this -option, because it is disregarded if the global mode is enabled. -@end defopt - -@defopt auto-revert-verbose -This option controls whether Emacs reports when a buffer has been -reverted. -@end defopt - -The options with the @code{auto-revert-} prefix are located in the Custom -group named @code{auto-revert}. The other, Magit-specific, options are -located in the @code{magit} group. - -@menu -* Risk of Reverting Automatically:: -@end menu - -@node Risk of Reverting Automatically -@unnumberedsubsubsec Risk of Reverting Automatically - -For the vast majority of users, automatically reverting file-visiting -buffers after they have changed on disk is harmless. - -If a buffer is modified (i.e., it contains changes that haven't been -saved yet), then Emacs will refuse to automatically revert it. If -you save a previously modified buffer, then that results in what is -seen by Git as an uncommitted change. Git will then refuse to carry -out any commands that would cause these changes to be lost. In other -words, if there is anything that could be lost, then either Git or -Emacs will refuse to discard the changes. - -However, if you use file-visiting buffers as a sort of ad hoc -"staging area", then the automatic reverts could potentially cause -data loss. So far I have heard from only one user who uses such a -workflow. - -An example: You visit some file in a buffer, edit it, and save the -changes. Then, outside of Emacs (or at least not using Magit or by -saving the buffer) you change the file on disk again. At this point -the buffer is the only place where the intermediate version still -exists. You have saved the changes to disk, but that has since been -overwritten. Meanwhile Emacs considers the buffer to be unmodified -(because you have not made any changes to it since you last saved it -to the visited file) and therefore would not object to it being -automatically reverted. At this point an Auto-Revert mode would kick -in. It would check whether the buffer is modified and since that is -not the case it would revert it. The intermediate version would be -lost. (Actually you could still get it back using the @code{undo} command.) - -If your workflow depends on Emacs preserving the intermediate version -in the buffer, then you have to disable all Auto-Revert modes. But -please consider that such a workflow would be dangerous even without -using an Auto-Revert mode, and should therefore be avoided. If Emacs -crashes or if you quit Emacs by mistake, then you would also lose the -buffer content. There would be no autosave file still containing the -intermediate version (because that was deleted when you saved the -buffer) and you would not be asked whether you want to save the buffer -(because it isn't modified). - -@node Sections -@section Sections - -Magit buffers are organized into nested sections, which can be -collapsed and expanded, similar to how sections are handled in Org -mode. Each section also has a type, and some sections also have a -value. For each section type there can also be a local keymap, shared -by all sections of that type. - -Taking advantage of the section value and type, many commands operate on -the current section, or when the region is active and selects sections -of the same type, all of the selected sections. Commands that only -make sense for a particular section type (as opposed to just behaving -differently depending on the type) are usually bound in section type -keymaps. - -@menu -* Section Movement:: -* Section Visibility:: -* Section Hooks:: -* Section Types and Values:: -* Section Options:: -@end menu - -@node Section Movement -@subsection Section Movement - -To move within a section use the usual keys (@code{C-p}, @code{C-n}, @code{C-b}, @code{C-f} etc), -whose global bindings are not shadowed. To move to another section use -the following commands. - -@table @asis -@item @kbd{p} (@code{magit-section-backward}) -@kindex p -@findex magit-section-backward -When not at the beginning of a section, then move to the beginning -of the current section. At the beginning of a section, instead move -to the beginning of the previous visible section. - -@item @kbd{n} (@code{magit-section-forward}) -@kindex n -@findex magit-section-forward -Move to the beginning of the next visible section. - -@item @kbd{M-p} (@code{magit-section-backward-siblings}) -@kindex M-p -@findex magit-section-backward-siblings -Move to the beginning of the previous sibling section. If there is -no previous sibling section, then move to the parent section -instead. - -@item @kbd{M-n} (@code{magit-section-forward-siblings}) -@kindex M-n -@findex magit-section-forward-siblings -Move to the beginning of the next sibling section. If there is no -next sibling section, then move to the parent section instead. - -@item @kbd{^} (@code{magit-section-up}) -@kindex ^ -@findex magit-section-up -Move to the beginning of the parent of the current section. -@end table - -The above commands all call the hook @code{magit-section-movement-hook}. -Any of the functions listed below can be used as members of this hook. - -You might want to remove some of the functions that Magit adds using -@code{add-hook}. In doing so you have to make sure you do not attempt to -remove function that haven't even been added yet, for example: - -@lisp -(with-eval-after-load 'magit-diff - (remove-hook 'magit-section-movement-hook - 'magit-hunk-set-window-start)) -@end lisp - -@defvar magit-section-movement-hook -This hook is run by all of the above movement commands, after -arriving at the destination. -@end defvar - -@defun magit-hunk-set-window-start -This hook function ensures that the beginning of the current section -is visible, provided it is a @code{hunk} section. Otherwise, it does -nothing. - -Loading @code{magit-diff} adds this function to the hook. -@end defun - -@defun magit-section-set-window-start -This hook function ensures that the beginning of the current section -is visible, regardless of the section's type. If you add this to -@code{magit-section-movement-hook}, then you must remove the hunk-only -variant in turn. -@end defun - -@defun magit-log-maybe-show-more-commits -This hook function only has an effect in log buffers, and @code{point} is -on the "show more" section. If that is the case, then it doubles -the number of commits that are being shown. - -Loading @code{magit-log} adds this function to the hook. -@end defun - -@defun magit-log-maybe-update-revision-buffer -When moving inside a log buffer, then this function updates the -revision buffer, provided it is already being displayed in another -window of the same frame. - -Loading @code{magit-log} adds this function to the hook. -@end defun - -@defun magit-log-maybe-update-blob-buffer -When moving inside a log buffer and another window of the same frame -displays a blob buffer, then this function instead displays the blob -buffer for the commit at point in that window. -@end defun - -@defun magit-status-maybe-update-revision-buffer -When moving inside a status buffer, then this function updates the -revision buffer, provided it is already being displayed in another -window of the same frame. -@end defun - -@defun magit-status-maybe-update-stash-buffer -When moving inside a status buffer, then this function updates the -stash buffer, provided it is already being displayed in another -window of the same frame. -@end defun - -@defun magit-status-maybe-update-blob-buffer -When moving inside a status buffer and another window of the same -frame displays a blob buffer, then this function instead displays -the blob buffer for the commit at point in that window. -@end defun - -@defun magit-stashes-maybe-update-stash-buffer -When moving inside a buffer listing stashes, then this function -updates the stash buffer, provided it is already being displayed -in another window of the same frame. -@end defun - -@defopt magit-update-other-window-delay -Delay before automatically updating the other window. - -When moving around in certain buffers, then certain other buffers, -which are being displayed in another window, may optionally be -updated to display information about the section at point. - -When holding down a key to move by more than just one section, then -that would update that buffer for each section on the way. To -prevent that, updating the revision buffer is delayed, and this -option controls for how long. For optimal experience you might have -to adjust this delay and/or the keyboard repeat rate and delay of -your graphical environment or operating system. -@end defopt - -@node Section Visibility -@subsection Section Visibility - -Magit provides many commands for changing the visibility of sections, -but all you need to get started are the next two. - -@table @asis -@item @kbd{@key{TAB}} (@code{magit-section-toggle}) -@kindex TAB -@findex magit-section-toggle -Toggle the visibility of the body of the current section. - -@item @kbd{C-c @key{TAB}} (@code{magit-section-cycle}) -@itemx @kbd{C-<tab>} (@code{magit-section-cycle}) -@kindex C-c TAB -@kindex C-<tab> -@findex magit-section-cycle -Cycle the visibility of current section and its children. - -If this command is invoked using @code{C-<tab>} and that is globally bound -to @code{tab-next}, then this command pivots to behave like that command, -and you must instead use @code{C-c TAB} to cycle section visibility. - -If you would like to keep using @code{C-<tab>} to cycle section visibility -but also want to use @code{tab-bar-mode}, then you have to prevent that mode -from using this key and instead bind another key to @code{tab-next}. Because -@code{tab-bar-mode} does not use a mode map but instead manipulates the -global map, this involves advising @code{tab-bar--define-keys}. - -@item @kbd{M-<tab>} (@code{magit-section-cycle-diffs}) -@kindex M-<tab> -@findex magit-section-cycle-diffs -Cycle the visibility of diff-related sections in the current buffer. - -@item @kbd{S-<tab>} (@code{magit-section-cycle-global}) -@kindex S-<tab> -@findex magit-section-cycle-global -Cycle the visibility of all sections in the current buffer. - -@item @kbd{1} (@code{magit-section-show-level-1}) -@itemx @kbd{2} (@code{magit-section-show-level-2}) -@itemx @kbd{3} (@code{magit-section-show-level-3}) -@itemx @kbd{4} (@code{magit-section-show-level-4}) -@kindex 1 -@kindex 2 -@kindex 3 -@kindex 4 -@findex magit-section-show-level-1 -@findex magit-section-show-level-2 -@findex magit-section-show-level-3 -@findex magit-section-show-level-4 -Show sections surrounding the current section up to level N@. - -@item @kbd{M-1} (@code{magit-section-show-level-1-all}) -@itemx @kbd{M-2} (@code{magit-section-show-level-2-all}) -@itemx @kbd{M-3} (@code{magit-section-show-level-3-all}) -@itemx @kbd{M-4} (@code{magit-section-show-level-4-all}) -@kindex M-1 -@kindex M-2 -@kindex M-3 -@kindex M-4 -@findex magit-section-show-level-1-all -@findex magit-section-show-level-2-all -@findex magit-section-show-level-3-all -@findex magit-section-show-level-4-all -Show all sections up to level N@. -@end table - -Some functions, which are used to implement the above commands, are -also exposed as commands themselves. By default no keys are bound to -these commands, as they are generally perceived to be much less -useful. But your mileage may vary. - -@deffn Command magit-section-show -Show the body of the current section. -@end deffn - -@deffn Command magit-section-hide -Hide the body of the current section. -@end deffn - -@deffn Command magit-section-show-headings -Recursively show headings of children of the current section. Only -show the headings. Previously shown text-only bodies are hidden. -@end deffn - -@deffn Command magit-section-show-children -Recursively show the bodies of children of the current section. -With a prefix argument show children down to the level of the -current section, and hide deeper children. -@end deffn - -@deffn Command magit-section-hide-children -Recursively hide the bodies of children of the current section. -@end deffn - -@deffn Command magit-section-toggle-children -Toggle visibility of bodies of children of the current section. -@end deffn - -When a buffer is first created then some sections are shown expanded -while others are not. This is hard coded. When a buffer is refreshed -then the previous visibility is preserved. The initial visibility of -certain sections can also be overwritten using the hook -@code{magit-section-set-visibility-hook}. - -@defopt magit-section-initial-visibility-alist -This options can be used to override the initial visibility of -sections. In the future it will also be used to define the -defaults, but currently a section's default is still hardcoded. - -The value is an alist. Each element maps a section type or lineage -to the initial visibility state for such sections. The state has to -be one of @code{show} or @code{hide}, or a function that returns one of these -symbols. A function is called with the section as the only argument. - -Use the command @code{magit-describe-section-briefly} to determine a -section's lineage or type. The vector in the output is the section -lineage and the type is the first element of that vector. Wildcards -can be used, see @code{magit-section-match}. -@end defopt - -@defopt magit-section-cache-visibility -This option controls for which sections the previous visibility -state should be restored if a section disappears and later appears -again. The value is a boolean or a list of section types. If t, -then the visibility of all sections is cached. Otherwise this is -only done for sections whose type matches one of the listed types. - -This requires that the function @code{magit-section-cached-visibility} is -a member of @code{magit-section-set-visibility-hook}. -@end defopt - -@defvar magit-section-set-visibility-hook -This hook is run when first creating a buffer and also when -refreshing an existing buffer, and is used to determine the -visibility of the section currently being inserted. - -Each function is called with one argument, the section being -inserted. It should return @code{hide} or @code{show}, or to leave the visibility -undefined @code{nil}. If no function decides on the visibility and the -buffer is being refreshed, then the visibility is preserved; or if -the buffer is being created, then the hard coded default is used. - -Usually this should only be used to set the initial visibility but -not during refreshes. If @code{magit-insert-section--oldroot} is non-nil, -then the buffer is being refreshed and these functions should -immediately return @code{nil}. -@end defvar - -@defopt magit-section-visibility-indicator -This option controls whether and how to indicate that a section can -be expanded/collapsed. - -If nil, then no visibility indicators are shown. Otherwise the -value has to have one of these two forms: - -@itemize -@item -@code{(EXPANDABLE-BITMAP . COLLAPSIBLE-BITMAP)} - -Both values have to be variables whose values are fringe -bitmaps. In this case every section that can be expanded -or collapsed gets an indicator in the left fringe. - -To provide extra padding around the indicator, set -@code{left-fringe-width} in @code{magit-mode-hook}, e.g.: - -@lisp -(add-hook 'magit-mode-hook (lambda () - (setq left-fringe-width 20))) -@end lisp - -@item -@code{(STRING . BOOLEAN)} - -In this case STRING (usually an ellipsis) is shown at the end -of the heading of every collapsed section. Expanded sections -get no indicator. The cdr controls whether the appearance of -these ellipsis take section highlighting into account. Doing -so might potentially have an impact on performance, while not -doing so is kinda ugly. -@end itemize -@end defopt - -@node Section Hooks -@subsection Section Hooks - -Which sections are inserted into certain buffers is controlled with -hooks. This includes the status and the refs buffers. For other -buffers, e.g., log and diff buffers, this is not possible. The -command @code{magit-describe-section} can be used to see which hook (if any) -was responsible for inserting the section at point. - -For buffers whose sections can be customized by the user, a hook -variable called @code{magit-TYPE-sections-hook} exists. This hook should be -changed using @code{magit-add-section-hook}. Avoid using @code{add-hooks} or the -Custom interface. - -The various available section hook variables are described later in -this manual along with the appropriate "section inserter functions". - -@defun magit-add-section-hook hook function &optional at append local -Add the function FUNCTION to the value of section hook HOOK@. - -Add FUNCTION at the beginning of the hook list unless optional -APPEND is non-nil, in which case FUNCTION is added at the end. If -FUNCTION already is a member then move it to the new location. - -If optional AT is non-nil and a member of the hook list, then add -FUNCTION next to that instead. Add before or after AT, or replace -AT with FUNCTION depending on APPEND@. If APPEND is the symbol -@code{replace}, then replace AT with FUNCTION@. For any other non-nil value -place FUNCTION right after AT@. If nil, then place FUNCTION right -before AT@. If FUNCTION already is a member of the list but AT is -not, then leave FUNCTION where ever it already is. - -If optional LOCAL is non-nil, then modify the hook's buffer-local -value rather than its global value. This makes the hook local by -copying the default value. That copy is then modified. - -HOOK should be a symbol. If HOOK is void, it is first set to nil. -HOOK's value must not be a single hook function. FUNCTION should -be a function that takes no arguments and inserts one or multiple -sections at point, moving point forward. FUNCTION may choose not -to insert its section(s), when doing so would not make sense. It -should not be abused for other side-effects. -@end defun - -To remove a function from a section hook, use @code{remove-hook}. - -@node Section Types and Values -@subsection Section Types and Values - -Each section has a type, for example @code{hunk}, @code{file}, and @code{commit}. -Instances of certain section types also have a value. The value of a -section of type @code{file}, for example, is a file name. - -Users usually do not have to worry about a section's type and value, -but knowing them can be handy at times. - -@table @asis -@item @kbd{H} (@code{magit-describe-section}) -@kindex H -@findex magit-describe-section -This command shows information about the section at point in a -separate buffer. -@end table - -@deffn Command magit-describe-section-briefly -This command shows information about the section at point in the -echo area, as @code{#<magit-section VALUE [TYPE PARENT-TYPE...] - BEGINNING-END>}. -@end deffn - -Many commands behave differently depending on the type of the section -at point and/or somehow consume the value of that section. But that -is only one of the reasons why the same key may do something different, -depending on what section is current. - -Additionally for each section type a keymap @strong{might} be defined, named -@code{magit-TYPE-section-map}. That keymap is used as text property keymap -of all text belonging to any section of the respective type. If such -a map does not exist for a certain type, then you can define it -yourself, and it will automatically be used. - -@node Section Options -@subsection Section Options - -This section describes options that have an effect on more than just a -certain type of sections. As you can see there are not many of those. - -@defopt magit-section-show-child-count -Whether to append the number of children to section headings. This -only affects sections that could benefit from this information. -@end defopt - -@node Transient Commands -@section Transient Commands - -Many Magit commands are implemented as @strong{transient} commands. First the -user invokes a @strong{prefix} command, which causes its @strong{infix} arguments and -@strong{suffix} commands to be displayed in the echo area. The user then -optionally sets some infix arguments and finally invokes one of the -suffix commands. - -This is implemented in the library @code{transient}. Earlier Magit releases -used the package @code{magit-popup} and even earlier versions library -@code{magit-key-mode}. - -Transient is documented in @ref{Top,,,transient,}. - -@table @asis -@item @kbd{C-x M-g} (@code{magit-dispatch}) -@itemx @kbd{C-c g} (@code{magit-dispatch}) -@kindex C-x M-g -@kindex C-c g -@findex magit-dispatch -This transient prefix command binds most of Magit's other prefix -commands as suffix commands and displays them in a temporary buffer -until one of them is invoked. Invoking such a sub-prefix causes the -suffixes of that command to be bound and displayed instead of those -of @code{magit-dispatch}. - -This command is also, or especially, useful outside Magit buffers, -so Magit by default binds it to @code{C-c M-g} in the global keymap. -@code{C-c g} would be a better binding, but we cannot use that by default, -because that key sequence is reserved for the user. See @ref{Global Bindings} to learn more default and recommended key bindings. -@end table - -@node Transient Arguments and Buffer Variables -@section Transient Arguments and Buffer Variables - -The infix arguments of many of Magit's transient prefix commands cease -to have an effect once the @code{git} command that is called with those -arguments has returned. Commands that create a commit are a good -example for this. If the user changes the arguments, then that only -affects the next invocation of a suffix command. If the same -transient prefix command is later invoked again, then the arguments -are initially reset to the default value. This default value can be -set for the current Emacs session or saved permanently, see -@ref{Saving Values,,,transient,}. It is also possible to cycle through -previously used sets of arguments using @code{C-M-p} and @code{C-M-n}, see -@ref{Using History,,,transient,}. - -However the infix arguments of many other transient commands continue -to have an effect even after the @code{git} command that was called with -those arguments has returned. The most important commands like this -are those that display a diff or log in a dedicated buffer. Their -arguments obviously continue to have an effect for as long as the -respective diff or log is being displayed. Furthermore the used -arguments are stored in buffer-local variables for future reference. - -For commands in the second group it isn't always desirable to reset -their arguments to the global value when the transient prefix command -is invoked again. - -As mentioned above, it is possible to cycle through previously used -sets of arguments while a transient popup is visible. That means that -we could always reset the infix arguments to the default because the -set of arguments that is active in the existing buffer is only a few -@code{C-M-p} away. Magit can be configured to behave like that, but because I -expect that most users would not find that very convenient, it is not -the default. - -Also note that it is possible to change the diff and log arguments -used in the current buffer (including the status buffer, which -contains both diff and log sections) using the respective "refresh" -transient prefix commands on @code{D} and @code{L}. (@code{d} and @code{l} on the other hand are -intended to change @strong{what} diff or log is being displayed. It is -possible to also change @strong{how} the diff or log is being displayed at the -same time, but if you only want to do the latter, then you should use -the refresh variants.) Because these secondary diff and log transient -prefixes are about @strong{changing} the arguments used in the current buffer, -they @strong{always} start out with the set of arguments that are currently in -effect in that buffer. - -Some commands are usually invoked directly even though they can also -be invoked as the suffix of a transient prefix command. Most -prominently @code{magit-show-commit} is usually invoked by typing @code{RET} while -point is on a commit in a log, but it can also be invoked from the -@code{magit-diff} transient prefix. - -When such a command is invoked directly, then it is important to reuse -the arguments as specified by the respective buffer-local values, -instead of using the default arguments. Imagine you press @code{RET} in a -log to display the commit at point in a different buffer and then use -@code{D} to change how the diff is displayed in that buffer. And then you -press @code{RET} on another commit to show that instead and the diff -arguments are reset to the default. Not cool; so Magit does not do -that by default. - -@defopt magit-prefix-use-buffer-arguments -This option controls whether the infix arguments initially shown in -certain transient prefix commands are based on the arguments that -are currently in effect in the buffer that their suffixes update. - -The @code{magit-diff} and @code{magit-log} transient prefix commands are affected -by this option. -@end defopt - -@defopt magit-direct-use-buffer-arguments -This option controls whether certain commands, when invoked directly -(i.e., not as the suffix of a transient prefix command), use the -arguments that are currently active in the buffer that they are -about to update. The alternative is to use the default value for -these arguments, which might change the arguments that are used in -the buffer. -@end defopt - -@noindent -Valid values for both of the above options are: - -@itemize -@item -@code{always}: Always use the set of arguments that is currently active -in the respective buffer, provided that buffer exists of course. -@item -@code{selected} or @code{t}: Use the set of arguments from the respective -buffer, but only if it is displayed in a window of the current -frame. This is the default for both variables. -@item -@code{current}: Use the set of arguments from the respective buffer, but -only if it is the current buffer. -@item -@code{never}: Never use the set of arguments from the respective buffer. -@end itemize - -@noindent -I am afraid it gets more complicated still: - -@itemize -@item -The global diff and log arguments are set for each supported mode -individually. The diff arguments for example have different values -in @code{magit-diff-mode}, @code{magit-revision-mode}, @code{magit-merge-preview-mode} -and @code{magit-status-mode} buffers. Setting or saving the value for one -mode does not change the value for other modes. The history however -is shared. - -@item -When @code{magit-show-commit} is invoked directly from a log buffer, then -the file filter is picked up from that buffer, not from the revision -buffer or the mode's global diff arguments. - -@item -Even though they are suffixes of the diff prefix @code{magit-show-commit} -and @code{magit-stash-show} do not use the diff buffer used by the diff -commands, instead they use the dedicated revision and stash buffers. - -At the time you invoke the diff prefix it is unknown to Magit which -of the suffix commands you are going to invoke. While not certain, -more often than not users invoke one of the commands that use the -diff buffer, so the initial infix arguments are those used in that -buffer. However if you invoke one of these commands directly, then -Magit knows that it should use the arguments from the revision resp. -stash buffer. - -@item -The log prefix also features reflog commands, but these commands do -not use the log arguments. - -@item -If @code{magit-show-refs} is invoked from a @code{magit-refs-mode} buffer, then it -acts as a refresh prefix and therefore unconditionally uses the -buffer's arguments as initial arguments. If it is invoked elsewhere -with a prefix argument, then it acts as regular prefix and therefore -respects @code{magit-prefix-use-buffer-arguments}. If it is invoked -elsewhere without a prefix argument, then it acts as a direct -command and therefore respects @code{magit-direct-use-buffer-arguments}. -@end itemize - -@node Completion Confirmation and the Selection -@section Completion, Confirmation and the Selection - -@menu -* Action Confirmation:: -* Completion and Confirmation:: -* The Selection:: -* The hunk-internal region:: -* Support for Completion Frameworks:: -* Additional Completion Options:: -@end menu - -@node Action Confirmation -@subsection Action Confirmation - -By default many actions that could potentially lead to data loss have -to be confirmed. This includes many very common actions, so this can -quickly become annoying. Many of these actions can be undone and if -you have thought about how to undo certain mistakes, then it should -be safe to disable confirmation for the respective actions. - -The option @code{magit-no-confirm} can be used to tell Magit to perform -certain actions without the user having to confirm them. Note that -while this option can only be used to disable confirmation for a -specific set of actions, the next section explains another way of -telling Magit to ask fewer questions. - -@defopt magit-no-confirm -The value of this option is a list of symbols, representing actions -that do not have to be confirmed by the user before being carried -out. - -By default many potentially dangerous commands ask the user for -confirmation. Each of the below symbols stands for an action which, -when invoked unintentionally or without being fully aware of the -consequences, could lead to tears. In many cases there are several -commands that perform variations of a certain action, so we don't -use the command names but more generic symbols. - -@itemize -@item -Applying changes: - -@itemize -@item -@code{discard} Discarding one or more changes (i.e., hunks or the -complete diff for a file) loses that change, obviously. - -@item -@code{reverse} Reverting one or more changes can usually be undone by -reverting the reversion. - -@item -@code{stage-all-changes}, @code{unstage-all-changes} When there are both -staged and unstaged changes, then un-/staging everything would -destroy that distinction. Of course that also applies when -un-/staging a single change, but then less is lost and one does -that so often that having to confirm every time would be -unacceptable. -@end itemize - -@item -Files: - -@itemize -@item -@code{delete} When a file that isn't yet tracked by Git is deleted, -then it is completely lost, not just the last changes. Very -dangerous. - -@item -@code{trash} Instead of deleting a file it can also be move to the -system trash. Obviously much less dangerous than deleting it. - -Also see option @code{magit-delete-by-moving-to-trash}. - -@item -@code{resurrect} A deleted file can easily be resurrected by "deleting" -the deletion, which is done using the same command that was used -to delete the same file in the first place. - -@item -@code{untrack} Untracking a file can be undone by tracking it again. - -@item -@code{rename} Renaming a file can easily be undone. -@end itemize - -@item -Sequences: - -@itemize -@item -@code{reset-bisect} Aborting (known to Git as "resetting") a bisect -operation loses all information collected so far. - -@item -@code{abort-cherry-pick} Aborting a cherry-pick throws away all -conflict resolutions which have already been carried out by the -user. - -@item -@code{abort-revert} Aborting a revert throws away all conflict -resolutions which have already been carried out by the user. - -@item -@code{abort-rebase} Aborting a rebase throws away all already modified -commits, but it's possible to restore those from the reflog. - -@item -@code{abort-merge} Aborting a merge throws away all conflict -resolutions which have already been carried out by the user. - -@item -@code{merge-dirty} Merging with a dirty worktree can make it hard to go -back to the state before the merge was initiated. -@end itemize - -@item -References: - -@itemize -@item -@code{delete-unmerged-branch} Once a branch has been deleted, it can -only be restored using low-level recovery tools provided by Git. -And even then the reflog is gone. The user always has to -confirm the deletion of a branch by accepting the default choice -(or selecting another branch), but when a branch has not been -merged yet, also make sure the user is aware of that. - -@item -@code{delete-pr-remote} When deleting a branch that was created from a -pull-request and if no other branches still exist on that -remote, then @code{magit-branch-delete} offers to delete the remote -as well. This should be safe because it only happens if no -other refs exist in the remotes namespace, and you can recreate -the remote if necessary. - -@item -@code{drop-stashes} Dropping a stash is dangerous because Git stores -stashes in the reflog. Once a stash is removed, there is no -going back without using low-level recovery tools provided by -Git. When a single stash is dropped, then the user always has -to confirm by accepting the default (or selecting another). -This action only concerns the deletion of multiple stashes at -once. -@end itemize - -@item -Publishing: - -@itemize -@item -@code{set-and-push} When pushing to the upstream or the push-remote -and that isn't actually configured yet, then the user can first -set the target. If s/he confirms the default too quickly, then -s/he might end up pushing to the wrong branch and if the remote -repository is configured to disallow fixing such mistakes, then -that can be quite embarrassing and annoying. -@end itemize - -@item -Edit published history: - -Without adding these symbols here, you will be warned before -editing commits that have already been pushed to one of the -branches listed in @code{magit-published-branches}. - -@itemize -@item -@code{amend-published} Affects most commands that amend to "HEAD". - -@item -@code{rebase-published} Affects commands that perform interactive -rebases. This includes commands from the commit transient that -modify a commit other than "HEAD", namely the various fixup and -squash variants. - -@item -@code{edit-published} Affects the commands @code{magit-edit-line-commit} and -@code{magit-diff-edit-hunk-commit}. These two commands make it quite -easy to accidentally edit a published commit, so you should -think twice before configuring them not to ask for confirmation. -@end itemize - -To disable confirmation completely, add all three symbols here or -set @code{magit-published-branches} to @code{nil}. - -@item -Various: - -@itemize -@item -@code{stash-apply-3way} When a stash cannot be applied using @code{git stash - apply}, then Magit uses @code{git apply} instead, possibly using the -@code{--3way} argument, which isn't always perfectly safe. See also -@code{magit-stash-apply}. - -@item -@code{kill-process} There seldom is a reason to kill a process. -@end itemize - -@item -Global settings: - -Instead of adding all of the above symbols to the value of this -option, you can also set it to the atom `t', which has the same -effect as adding all of the above symbols. Doing that most -certainly is a bad idea, especially because other symbols might be -added in the future. So even if you don't want to be asked for -confirmation for any of these actions, you are still better of -adding all of the respective symbols individually. - -When @code{magit-wip-before-change-mode} is enabled, then the following -actions can be undone fairly easily: @code{discard}, @code{reverse}, -@code{stage-all-changes}, and @code{unstage-all-changes}. If and only if -this mode is enabled, then @code{safe-with-wip} has the same effect as -adding all of these symbols individually. -@end itemize -@end defopt - -@node Completion and Confirmation -@subsection Completion and Confirmation - -Many Magit commands ask the user to select from a list of possible -things to act on, while offering the most likely choice as the -default. For many of these commands the default is the thing at -point, provided that it actually is a valid thing to act on. For -many commands that act on a branch, the current branch serves as -the default if there is no branch at point. - -These commands combine asking for confirmation and asking for a target -to act on into a single action. The user can confirm the default -target using @code{RET} or abort using @code{C-g}. This is similar to a @code{y-or-n-p} -prompt, but the keys to confirm or abort differ. - -At the same time the user is also given the opportunity to select -another target, which is useful because for some commands and/or in -some situations you might want to select the action before selecting -the target by moving to it. - -However you might find that for some commands you always want to use -the default target, if any, or even that you want the command to act -on the default without requiring any confirmation at all. The option -@code{magit-dwim-selection} can be used to configure certain commands to that -effect. - -Note that when the region is active then many commands act on the -things that are selected using a mechanism based on the region, in -many cases after asking for confirmation. This region-based mechanism -is called the "selection" and is described in detail in the next -section. When a selection exists that is valid for the invoked -command, then that command never offers to act on something else, and -whether it asks for confirmation is not controlled by this option. - -Also note that Magit asks for confirmation of certain actions that are -not coupled with completion (or the selection). Such dialogs are also -not affected by this option and are described in the previous section. - -@defopt magit-dwim-selection -@end defopt -This option can be used to tell certain commands to use the thing -at point instead of asking the user to select a candidate to act -on, with or without confirmation. - -The value has the form @code{((COMMAND nil|PROMPT DEFAULT)...)}. - -@itemize -@item -COMMAND is the command that should not prompt for a choice. -To have an effect, the command has to use the function -@code{magit-completing-read} or a utility function which in turn uses -that function. - -@item -If the command uses @code{magit-completing-read} multiple times, then -PROMPT can be used to only affect one of these uses. PROMPT, if -non-nil, is a regular expression that is used to match against -the PROMPT argument passed to @code{magit-completing-read}. - -@item -DEFAULT specifies how to use the default. If it is @code{t}, then -the DEFAULT argument passed to @code{magit-completing-read} is used -without confirmation. If it is @code{ask}, then the user is given -a chance to abort. DEFAULT can also be @code{nil}, in which case the -entry has no effect. -@end itemize - -@node The Selection -@subsection The Selection - -If the region is active, then many Magit commands act on the things -that are selected using a mechanism based on the region instead of one -single thing. When the region is not active, then these commands act -on the thing at point or read a single thing to act on. This is -described in the previous section — this section only covers how -multiple things are selected, how that is visualized, and how certain -commands behave when that is the case. - -Magit's mechanism for selecting multiple things, or rather sections -that represent these things, is based on the Emacs region, but the -area that Magit considers to be selected is typically larger than the -region and additional restrictions apply. - -Magit makes a distinction between a region that qualifies as forming a -valid Magit selection and a region that does not. If the region does -not qualify, then it is displayed as it is in other Emacs buffers. If -the region does qualify as a Magit selection, then the selection is -always visualized, while the region itself is only visualized if it -begins and ends on the same line. - -For a region to qualify as a Magit selection, it must begin in the -heading of one section and end in the heading of a sibling section. -Note that if the end of the region is at the very beginning of section -heading (i.e., at the very beginning of a line) then that section is -considered to be @strong{inside} the selection. - -This is not consistent with how the region is normally treated in -Emacs — if the region ends at the beginning of a line, then that line -is outside the region. Due to how Magit visualizes the selection, it -should be obvious that this difference exists. - -Not every command acts on every valid selection. Some commands do not -even consider the location of point, others may act on the section at -point but not support acting on the selection, and even commands that -do support the selection of course only do so if it selects things -that they can act on. - -This is the main reason why the selection must include the section at -point. Even if a selection exists, the invoked command may disregard -it, in which case it may act on the current section only. It is much -safer to only act on the current section but not the other selected -sections than it is to act on the current section @strong{instead} of the -selected sections. The latter would be much more surprising and if -the current section always is part of the selection, then that cannot -happen. - -@defvar magit-keep-region-overlay -This variable controls whether the region is visualized as usual -even when a valid Magit selection or a hunk-internal region exists. -See the doc-string for more information. -@end defvar - -@node The hunk-internal region -@subsection The hunk-internal region - -Somewhat related to the Magit selection described in the previous -section is the hunk-internal region. - -Like the selection, the hunk-internal region is based on the Emacs -region but causes that region to not be visualized as it would in -other Emacs buffers, and includes the line on which the region ends -even if it ends at the very beginning of that line. - -Unlike the selection, which is based on a region that must begin in -the heading of one section and ends in the section of a sibling -section, the hunk-internal region must begin inside the @strong{body} of a -hunk section and end in the body of the @strong{same} section. - -The hunk-internal region is honored by "apply" commands, which can, -among other targets, act on a hunk. If the hunk-internal region is -active, then such commands act only on the marked part of the hunk -instead of on the complete hunk. - -@node Support for Completion Frameworks -@subsection Support for Completion Frameworks - -The built-in option @code{completing-read-function} specifies the low-level -function used by @code{completing-read} to ask a user to select from a list -of choices. Its default value is @code{completing-read-default}. -Alternative completion frameworks typically activate themselves by -substituting their own implementation. - -Mostly for historic reasons Magit provides a similar option named -@code{magit-completing-read-function}, which only controls the low-level -function used by @code{magit-completing-read}. This option also makes it -possible to use a different completing mechanism for Magit than for -the rest of Emacs, but doing that is not recommend. - -You most likely don't have to customize the magit-specific option to -use an alternative completion framework. For example, if you enable -@code{ivy-mode}, then Magit will respect that, and if you enable @code{helm-mode}, -then you are done too. - -However if you want to use Ido, then @code{ido-mode} won't do the trick. You -will also have to install the @code{ido-completing-read+} package and use -@code{magit-ido-completing-read} as @code{magit-completing-read-function}. - -@defopt magit-completing-read-function -The value of this variable is the low-level function used to perform -completion by code that uses @code{magit-completing-read} (as opposed to -the built-in @code{completing-read}). - -The default value, @code{magit-builtin-completing-read}, is suitable for -the standard completion mechanism, @code{ivy-mode}, and @code{helm-mode} at least. - -The built-in @code{completing-read} and @code{completing-read-default} are @strong{not} -suitable to be used here. @code{magit-builtin-completing-read} performs -some additional work, and any function used in its place has to do -the same. -@end defopt - -@defun magit-builtin-completing-read prompt choices &optional predicate require-match initial-input hist def -This function performs completion using the built-in @code{completing-read} -and does some additional magit-specific work. -@end defun - -@defun magit-ido-completing-read prompt choices &optional predicate require-match initial-input hist def -This function performs completion using @code{ido-completing-read+} from the -package by the same name (which you have to explicitly install) and -does some additional magit-specific work. - -We have to use @code{ido-completing-read+} instead of the -@code{ido-completing-read} that comes with Ido itself, because the latter, -while intended as a drop-in replacement, cannot serve that purpose -because it violates too many of the implicit conventions. -@end defun - -@defun magit-completing-read prompt choices &optional predicate require-match initial-input hist def fallback -This is the function that Magit commands use when they need the user -to select a single thing to act on. The arguments have the same -meaning as for @code{completing-read}, except for FALLBACK, which is unique -to this function and is described below. - -Instead of asking the user to choose from a list of possible -candidates, this function may just return the default specified by -DEF, with or without requiring user confirmation. Whether that is -the case depends on PROMPT, @code{this-command} and @code{magit-dwim-selection}. -See the documentation of the latter for more information. - -If it does read a value in the minibuffer, then this function acts -similar to @code{completing-read}, except for the following: - -@itemize -@item -COLLECTION must be a list of choices. A function is not -supported. - -@item -If REQUIRE-MATCH is @code{nil} and the user exits without a choice, then -@code{nil} is returned instead of an empty string. - -@item -If REQUIRE-MATCH is non-nil and the users exits without a choice, -an user-error is raised. - -@item -FALLBACK specifies a secondary default that is only used if the -primary default DEF is @code{nil}. The secondary default is not subject -to @code{magit-dwim-selection} — if DEF is @code{nil} but FALLBACK is not, then -this function always asks the user to choose a candidate, just as -if both defaults were @code{nil}. - -@item -@code{format-prompt} is called on PROMPT and DEF (or FALLBACK if -DEF is @code{nil}). This appends ": " to the prompt and may also -add the default to the prompt, using the format specified by -@code{minibuffer-default-prompt-format} and depending on -@code{magit-completing-read-default-prompt-predicate}. -@end itemize -@end defun - -@node Additional Completion Options -@subsection Additional Completion Options - -@defopt magit-list-refs-sortby -For many commands that read a ref or refs from the user, the value -of this option can be used to control the order of the refs. Valid -values include any key accepted by the @code{--sort} flag of @code{git - for-each-ref}. By default, refs are sorted alphabetically by their -full name (e.g., "refs/heads/master"). -@end defopt - -@node Mouse Support -@section Mouse Support - -Double clicking on a section heading toggles the visibility of its -body, if any. Likewise clicking in the left fringe toggles the -visibility of the appropriate section. - -A context menu is provided but has to be enabled explicitly. In Emacs -28 and greater, enable the global mode @code{context-menu-mode}. If you use an -older Emacs release, set @code{magit-section-show-context-menu-for-emacs<28}. - -@node Running Git -@section Running Git - -@menu -* Viewing Git Output:: -* Git Process Status:: -* Running Git Manually:: -* Git Executable:: -* Global Git Arguments:: -@end menu - -@node Viewing Git Output -@subsection Viewing Git Output - -Magit runs Git either for side-effects (e.g., when pushing) or to get -some value (e.g., the name of the current branch). - -When Git is run for side-effects, the process output is logged in a -per-repository log buffer, which can be consulted using the -@code{magit-process} command when things don't go as expected. - -The output/errors for up to `magit-process-log-max' Git commands are -retained. - -@table @asis -@item @kbd{$} (@code{magit-process}) -@kindex $ -@findex magit-process -This commands displays the process buffer for the current -repository. -@end table - -Inside that buffer, the usual key bindings for navigating and showing -sections are available. There is one additional command. - -@table @asis -@item @kbd{k} (@code{magit-process-kill}) -@kindex k -@findex magit-process-kill -This command kills the process represented by the section at point. -@end table - -@defvar magit-git-debug -This option controls whether additional reporting of git errors is -enabled. - -Magit basically calls git for one of these two reasons: for -side-effects or to do something with its standard output. - -When git is run for side-effects then its output, including error -messages, go into the process buffer which is shown when using @code{$}. - -When git's output is consumed in some way, then it would be too -expensive to also insert it into this buffer, but when this -option is non-nil and git returns with a non-zero exit status, -then at least its standard error is inserted into this buffer. - -This is only intended for debugging purposes. Do not enable this -permanently, that would negatively affect performance. - -This is only intended for debugging purposes. Do not enable this -permanently, that would negatively affect performance. Also note -that just because git exits with a non-zero exit status and prints -an error message that usually doesn't mean that it is an error as -far as Magit is concerned, which is another reason we usually hide -these error messages. Whether some error message is relevant in -the context of some unexpected behavior has to be judged on a case -by case basis. - -The command @code{magit-toggle-git-debug} changes the value of this -variable. -@end defvar - -@defvar magit-process-extreme-logging -This option controls whether @code{magit-process-file} logs to the -@code{*Messages*} buffer. - -Only intended for temporary use when you try to figure out how -Magit uses Git behind the scene. Output that normally goes to -the magit-process buffer continues to go there. Not all output -goes to either of these two buffers. -@end defvar - -@node Git Process Status -@subsection Git Process Status - -When a Git process is running for side-effects, Magit displays an -indicator in the mode line, using the @code{magit-mode-line-process} face. - -If the Git process exits successfully, the process indicator is -removed from the mode line immediately. - -In the case of a Git error, the process indicator is not removed, but -is instead highlighted with the @code{magit-mode-line-process-error} face, -and the error details from the process buffer are provided as a -tooltip for mouse users. This error indicator persists in the mode -line until the next magit buffer refresh. - -If you do not wish process errors to be indicated in the mode line, -customize the @code{magit-process-display-mode-line-error} user option. - -Process errors are additionally indicated at the top of the status -buffer. - -@node Running Git Manually -@subsection Running Git Manually - -While Magit provides many Emacs commands to interact with Git, it does -not cover everything. In those cases your existing Git knowledge will -come in handy. Magit provides some commands for running arbitrary Git -commands by typing them into the minibuffer, instead of having to -switch to a shell. - -@table @asis -@item @kbd{!} (@code{magit-run}) -@kindex ! -@findex magit-run -This transient prefix command binds the following suffix commands -and displays them in a temporary buffer until a suffix is invoked. - -@item @kbd{! !} (@code{magit-git-command-topdir}) -@kindex ! ! -@findex magit-git-command-topdir -This command reads a command from the user and executes it in the -top-level directory of the current working tree. - -The string "git " is used as initial input when prompting the user -for the command. It can be removed to run another command. - -@item @kbd{:} (@code{magit-git-command}) -@itemx @kbd{! p} -@kindex : -@kindex ! p -@findex magit-git-command -This command reads a command from the user and executes it in -@code{default-directory}. With a prefix argument the command is executed -in the top-level directory of the current working tree instead. - -The string "git " is used as initial input when prompting the user -for the command. It can be removed to run another command. - -@item @kbd{! s} (@code{magit-shell-command-topdir}) -@kindex ! s -@findex magit-shell-command-topdir -This command reads a command from the user and executes it in the -top-level directory of the current working tree. - -@item @kbd{! S} (@code{magit-shell-command}) -@kindex ! S -@findex magit-shell-command -This command reads a command from the user and executes it in -@code{default-directory}. With a prefix argument the command is executed -in the top-level directory of the current working tree instead. -@end table - -@defopt magit-shell-command-verbose-prompt -Whether the prompt, used by the above commands when reading a -shell command, shows the directory in which it will be run. -@end defopt - -These suffix commands start external gui tools. - -@table @asis -@item @kbd{! k} (@code{magit-run-gitk}) -@kindex ! k -@findex magit-run-gitk -This command runs @code{gitk} in the current repository. - -@item @kbd{! a} (@code{magit-run-gitk-all}) -@kindex ! a -@findex magit-run-gitk-all -This command runs @code{gitk --all} in the current repository. - -@item @kbd{! b} (@code{magit-run-gitk-branches}) -@kindex ! b -@findex magit-run-gitk-branches -This command runs @code{gitk --branches} in the current repository. - -@item @kbd{! g} (@code{magit-run-git-gui}) -@kindex ! g -@findex magit-run-git-gui -This command runs @code{git gui} in the current repository. - -@item @kbd{! m} (@code{magit-git-mergetool}) -@kindex ! m -@findex magit-git-mergetool -This command runs @samp{git mergetool --gui} in the current repository. - -With a prefix argument this acts as a transient prefix command, -allowing the user to select the mergetool and change some settings. -@end table - -@node Git Executable -@subsection Git Executable - -When Magit calls Git, then it may do so using the absolute path to the -@code{git} executable, or using just its name. - -When running @code{git} locally and the @code{system-type} is @code{windows-nt} (any -Windows version) or @code{darwin} (macOS) then @code{magit-git-executable} is set -to an absolute path when Magit is loaded. - -On Windows it is necessary to use an absolute path because Git comes -with several wrapper scripts for the actual @code{git} binary, which are also -placed on @code{$PATH}, and using one of these wrappers instead of the binary -would degrade performance horribly. For some macOS users using just -the name of the executable also performs horribly, so we avoid doing -that on that platform as well. On other platforms, using just the -name seems to work just fine. - -Using an absolute path when running @code{git} on a remote machine over -Tramp, would be problematic to use an absolute path that is suitable -on the local machine, so a separate option is used to control the name -or path that is used on remote machines. - -@defopt magit-git-executable -The @code{git} executable used by Magit on the local host. This should be -either the absolute path to the executable, or the string "git" to -let Emacs find the executable itself, using the standard mechanism -for doing such things. -@end defopt - -@defopt magit-remote-git-executable -The @code{git} executable used by Magit on remote machines over Tramp. -Normally this should be just the string "git". Consider customizing -@code{tramp-remote-path} instead of this option. -@end defopt - -If Emacs is unable to find the correct executable, then you can -work around that by explicitly setting the value of one of these two -options. Doing that should be considered a kludge; it is better to -make sure that the order in @code{exec-path} or @code{tramp-remote-path} is correct. - -Note that @code{exec-path} is set based on the value of the @code{PATH} environment -variable that is in effect when Emacs is started. If you set @code{PATH} in -your shell's init files, then that only has an effect on Emacs if you -start it from that shell (because the environment of a process is only -passed to its child processes, not to arbitrary other processes). If -that is not how you start Emacs, then the @code{exec-path-from-shell} package -can help; though honestly I consider that a kludge too. - -The command @code{magit-debug-git-executable} can be useful to find out where -Emacs is searching for @code{git}. - -@table @asis -@item @kbd{M-x magit-debug-git-executable} -@findex magit-debug-git-executable -This command displays a buffer with information about -@code{magit-git-executable} and @code{magit-remote-git-executable}. - -@item @kbd{M-x magit-version} -@findex magit-version -This command shows the currently used versions of Magit, Git, and -Emacs in the echo area. Non-interactively this just returns the -Magit version. -@end table - -@node Global Git Arguments -@subsection Global Git Arguments - -@defopt magit-git-global-arguments -The arguments set here are used every time the git executable is run -as a subprocess. They are placed right after the executable itself -and before the git command - as in @code{git HERE... COMMAND REST}. For -valid arguments see -@ifinfo -@ref{git,,,gitman,}. -@end ifinfo -@ifhtml -@html -the <a href="http://git-scm.com/docs/git">git(1)</a> manpage. -@end html -@end ifhtml -@iftex -the git(1) manpage. -@end iftex - -Be careful what you add here, especially if you are using Tramp to -connect to servers with ancient Git versions. Never remove anything -that is part of the default value, unless you really know what you -are doing. And think very hard before adding something; it will be -used every time Magit runs Git for any purpose. -@end defopt - -@node Inspecting -@chapter Inspecting - -The functionality provided by Magit can be roughly divided into three -groups: inspecting existing data, manipulating existing data or adding -new data, and transferring data. Of course that is a rather crude -distinction that often falls short, but it's more useful than no -distinction at all. This section is concerned with inspecting data, -the next two with manipulating and transferring it. Then follows a -section about miscellaneous functionality, which cannot easily be fit -into this distinction. - -Of course other distinctions make sense too, e.g., Git's distinction -between porcelain and plumbing commands, which for the most part is -equivalent to Emacs' distinction between interactive commands and -non-interactive functions. All of the sections mentioned before are -mainly concerned with the porcelain -- Magit's plumbing layer is -described later. - -@menu -* Status Buffer:: -* Repository List:: -* Logging:: -* Diffing:: -* Ediffing:: -* References Buffer:: -* Bisecting:: -* Visiting Files and Blobs:: -* Blaming:: -@end menu - -@node Status Buffer -@section Status Buffer - -While other Magit buffers contain, e.g., one particular diff or one -particular log, the status buffer contains the diffs for staged and -unstaged changes, logs for unpushed and unpulled commits, lists of -stashes and untracked files, and information related to the current -branch. - -During certain incomplete operations -- for example when a merge -resulted in a conflict -- additional information is displayed that -helps proceeding with or aborting the operation. - -The command @code{magit-status} displays the status buffer belonging to the -current repository in another window. This command is used so often -that it should be bound globally. We recommend using @code{C-x g}: - -@lisp -(global-set-key (kbd "C-x g") 'magit-status) -@end lisp - -@table @asis -@item @kbd{C-x g} (@code{magit-status}) -@kindex C-x g -@findex magit-status -When invoked from within an existing Git repository, then this -command shows the status of that repository in a buffer. - -If the current directory isn't located within a Git repository, then -this command prompts for an existing repository or an arbitrary -directory, depending on the option @code{magit-repository-directories}, and -the status for the selected repository is shown instead. - -@itemize -@item -If that option specifies any existing repositories, then the user -is asked to select one of them. - -@item -Otherwise the user is asked to select an arbitrary directory using -regular file-name completion. If the selected directory is the -top-level directory of an existing working tree, then the status -buffer for that is shown. - -@item -Otherwise the user is offered to initialize the selected directory -as a new repository. After creating the repository its status -buffer is shown. -@end itemize - -These fallback behaviors can also be forced using one or more -prefix arguments: - -@itemize -@item -With two prefix arguments (or more precisely a numeric prefix -value of 16 or greater) an arbitrary directory is read, which is -then acted on as described above. The same could be accomplished -using the command @code{magit-init}. - -@item -With a single prefix argument an existing repository is read from -the user, or if no repository can be found based on the value of -@code{magit-repository-directories}, then the behavior is the same as with -two prefix arguments. -@end itemize -@end table - -@defopt magit-repository-directories -List of directories that are Git repositories or contain Git -repositories. - -Each element has the form @code{(DIRECTORY . DEPTH)}. DIRECTORY has to be -a directory or a directory file-name, a string. DEPTH, an integer, -specifies the maximum depth to look for Git repositories. If it is -0, then only add DIRECTORY itself. - -This option controls which repositories are being listed by -@code{magit-list-repositories}. It also affects @code{magit-status} (which see) -in potentially surprising ways (see above). -@end defopt - -@deffn Command magit-status-quick -This command is an alternative to @code{magit-status} that usually avoids -refreshing the status buffer. - -If the status buffer of the current Git repository exists but isn't -being displayed in the selected frame, then it is displayed without -being refreshed. - -If the status buffer is being displayed in the selected frame, -then this command refreshes it. - -Prefix arguments have the same meaning as for @code{magit-status}, -and additionally cause the buffer to be refresh. - -To use this command add this to your init file: - -@lisp -(global-set-key (kbd "C-x g") 'magit-status-quick). -@end lisp - -If you do that and then for once want to redisplay the buffer and -also immediately refresh it, then type @code{C-x g} followed by @code{g}. - -A possible alternative command is @code{magit-display-repository-buffer}. -It supports displaying any existing Magit buffer that belongs to the -current repository; not just the status buffer. -@end deffn - -@deffn Command ido-enter-magit-status -From an Ido prompt used to open a file, instead drop into -@code{magit-status}. This is similar to @code{ido-magic-delete-char}, which, -despite its name, usually causes a Dired buffer to be created. - -To make this command available, use something like: - -@lisp -(add-hook 'ido-setup-hook - (lambda () - (define-key ido-completion-map - (kbd \"C-x g\") 'ido-enter-magit-status))) -@end lisp - -Starting with Emacs 25.1 the Ido keymaps are defined just once -instead of every time Ido is invoked, so now you can modify it -like pretty much every other keymap: - -@lisp -(define-key ido-common-completion-map - (kbd \"C-x g\") 'ido-enter-magit-status) -@end lisp -@end deffn - -@menu -* Status Sections:: -* Status Header Sections:: -* Status Module Sections:: -* Status Options:: -@end menu - -@node Status Sections -@subsection Status Sections - -The contents of status buffers is controlled using the hook -@code{magit-status-sections-hook}. See @ref{Section Hooks} to learn about such -hooks and how to customize them. - -@defopt magit-status-sections-hook -Hook run to insert sections into a status buffer. -@end defopt - -The first function on that hook by default is -@code{magit-insert-status-headers}; it is described in the next section. -By default the following functions are also members of that hook: - -@defun magit-insert-merge-log -Insert section for the on-going merge. Display the heads that are -being merged. If no merge is in progress, do nothing. -@end defun - -@defun magit-insert-rebase-sequence -Insert section for the on-going rebase sequence. -If no such sequence is in progress, do nothing. -@end defun - -@defun magit-insert-am-sequence -Insert section for the on-going patch applying sequence. -If no such sequence is in progress, do nothing. -@end defun - -@defun magit-insert-sequencer-sequence -Insert section for the on-going cherry-pick or revert sequence. -If no such sequence is in progress, do nothing. -@end defun - -@defun magit-insert-bisect-output -While bisecting, insert section with output from @code{git bisect}. -@end defun - -@defun magit-insert-bisect-rest -While bisecting, insert section visualizing the bisect state. -@end defun - -@defun magit-insert-bisect-log -While bisecting, insert section logging bisect progress. -@end defun - -@defun magit-insert-untracked-files -Maybe insert a list or tree of untracked files. - -Do so depending on the value of @code{status.showUntrackedFiles}. Note -that even if the value is @code{all}, Magit still initially only shows -directories. But the directory sections can then be expanded using -@code{TAB}. -@end defun - -@defun magit-insert-unstaged-changes -Insert section showing unstaged changes. -@end defun - -@defun magit-insert-staged-changes -Insert section showing staged changes. -@end defun - -@defun magit-insert-stashes &optional ref heading -Insert the @code{stashes} section showing reflog for "refs/stash". -If optional REF is non-nil show reflog for that instead. -If optional HEADING is non-nil use that as section heading -instead of "Stashes:". -@end defun - -@defun magit-insert-unpulled-from-upstream -Insert section showing commits that haven't been pulled from the -upstream branch yet. -@end defun - -@defun magit-insert-unpulled-from-pushremote -Insert section showing commits that haven't been pulled from the -push-remote branch yet. -@end defun - -@defun magit-insert-unpushed-to-upstream -Insert section showing commits that haven't been pushed to the -upstream yet. -@end defun - -@defun magit-insert-unpushed-to-pushremote -Insert section showing commits that haven't been pushed to the -push-remote yet. -@end defun - -The following functions can also be added to the above hook: - -@defun magit-insert-tracked-files -Insert a tree of tracked files. -@end defun - -@defun magit-insert-ignored-files -Insert a tree of ignored files. -Its possible to limit the logs in the current buffer to a certain -directory using @code{D = f <DIRECTORY> RET g}. If you do that, then that -that also affects this command. - -The log filter can be used to limit to multiple files. In that case -this function only respects the first of the files and only if it is -a directory. -@end defun - -@defun magit-insert-skip-worktree-files -Insert a tree of skip-worktree files. -If the first element of @code{magit-buffer-diff-files} is a -directory, then limit the list to files below that. The value -of that variable can be set using @code{D -- DIRECTORY RET g}. -@end defun - -@defun magit-insert-assumed-unchanged-files -Insert a tree of files that are assumed to be unchanged. -If the first element of @code{magit-buffer-diff-files} is a -directory, then limit the list to files below that. The value -of that variable can be set using @code{D -- DIRECTORY RET g}. -@end defun - -@defun magit-insert-unpulled-or-recent-commits -Insert section showing unpulled or recent commits. -If an upstream is configured for the current branch and it is -ahead of the current branch, then show the missing commits. -Otherwise, show the last @code{magit-log-section-commit-count} -commits. -@end defun - -@defun magit-insert-recent-commits -Insert section showing the last @code{magit-log-section-commit-count} -commits. -@end defun - -@defopt magit-log-section-commit-count -How many recent commits @code{magit-insert-recent-commits} and -@code{magit-insert-unpulled-or-recent-commits} (provided there are no -unpulled commits) show. -@end defopt - -@defun magit-insert-unpulled-cherries -Insert section showing unpulled commits. -Like @code{magit-insert-unpulled-commits} but prefix each commit -that has not been applied yet (i.e., a commit with a patch-id -not shared with any local commit) with "+", and all others -with "-". -@end defun - -@defun magit-insert-unpushed-cherries -Insert section showing unpushed commits. -Like @code{magit-insert-unpushed-commits} but prefix each commit -which has not been applied to upstream yet (i.e., a commit with -a patch-id not shared with any upstream commit) with "+" and -all others with "-". -@end defun - -See @ref{References Buffer} for some more section inserters, which could be -used here. - -@node Status Header Sections -@subsection Status Header Sections - -The contents of status buffers is controlled using the hook -@code{magit-status-sections-hook} (see @ref{Status Sections}). - -By default @code{magit-insert-status-headers} is the first member of that -hook variable. - -@defun magit-insert-status-headers -Insert headers sections appropriate for @code{magit-status-mode} buffers. -The sections are inserted by running the functions on the hook -@code{magit-status-headers-hook}. -@end defun - -@defopt magit-status-headers-hook -Hook run to insert headers sections into the status buffer. - -This hook is run by @code{magit-insert-status-headers}, which in turn has -to be a member of @code{magit-status-sections-hook} to be used at all. -@end defopt - -By default the following functions are members of the above hook: - -@defun magit-insert-error-header -Insert a header line showing the message about the Git error that -just occurred. - -This function is only aware of the last error that occur when Git -was run for side-effects. If, for example, an error occurs while -generating a diff, then that error won't be inserted. Refreshing -the status buffer causes this section to disappear again. -@end defun - -@defun magit-insert-diff-filter-header -Insert a header line showing the effective diff filters. -@end defun - -@defun magit-insert-head-branch-header -Insert a header line about the current branch or detached @code{HEAD}. -@end defun - -@defun magit-insert-upstream-branch-header -Insert a header line about the branch that is usually pulled into -the current branch. -@end defun - -@defun magit-insert-push-branch-header -Insert a header line about the branch that the current branch is -usually pushed to. -@end defun - -@defun magit-insert-tags-header -Insert a header line about the current and/or next tag, along with -the number of commits between the tag and @code{HEAD}. -@end defun - -The following functions can also be added to the above hook: - -@defun magit-insert-repo-header -Insert a header line showing the path to the repository top-level. -@end defun - -@defun magit-insert-remote-header -Insert a header line about the remote of the current branch. - -If no remote is configured for the current branch, then fall back -showing the "origin" remote, or if that does not exist the first -remote in alphabetic order. -@end defun - -@defun magit-insert-user-header -Insert a header line about the current user. -@end defun - -@node Status Module Sections -@subsection Status Module Sections - -The contents of status buffers is controlled using the hook -@code{magit-status-sections-hook} (see @ref{Status Sections}). - -By default @code{magit-insert-modules} is @emph{not} a member of that hook -variable. - -@defun magit-insert-modules -Insert submodule sections. - -Hook @code{magit-module-sections-hook} controls which module sections are -inserted, and option @code{magit-module-sections-nested} controls whether -they are wrapped in an additional section. -@end defun - -@defopt magit-module-sections-hook -Hook run by @code{magit-insert-modules}. -@end defopt - -@defopt magit-module-sections-nested -This option controls whether @code{magit-insert-modules} wraps inserted -sections in an additional section. - -If this is non-nil, then only a single top-level section is inserted. -If it is nil, then all sections listed in @code{magit-module-sections-hook} -become top-level sections. -@end defopt - -@defun magit-insert-modules-overview -Insert sections for all submodules. For each section insert the -path, the branch, and the output of @code{git describe --tags}, -or, failing that, the abbreviated HEAD commit hash. - -Press @code{RET} on such a submodule section to show its own status buffer. -Press @code{RET} on the "Modules" section to display a list of submodules -in a separate buffer. This shows additional information not -displayed in the super-repository's status buffer. -@end defun - -@defun magit-insert-modules-unpulled-from-upstream -Insert sections for modules that haven't been pulled from the -upstream yet. These sections can be expanded to show the respective -commits. -@end defun - -@defun magit-insert-modules-unpulled-from-pushremote -Insert sections for modules that haven't been pulled from the -push-remote yet. These sections can be expanded to show the -respective commits. -@end defun - -@defun magit-insert-modules-unpushed-to-upstream -Insert sections for modules that haven't been pushed to the upstream -yet. These sections can be expanded to show the respective commits. -@end defun - -@defun magit-insert-modules-unpushed-to-pushremote -Insert sections for modules that haven't been pushed to the -push-remote yet. These sections can be expanded to show the -respective commits. -@end defun - -@node Status Options -@subsection Status Options - -@defopt magit-status-margin -This option specifies whether the margin is initially shown in -Magit-Status mode buffers and how it is formatted. - -The value has the form @code{(INIT STYLE WIDTH AUTHOR AUTHOR-WIDTH)}. - -@itemize -@item -If INIT is non-nil, then the margin is shown initially. -@item -STYLE controls how to format the author or committer date. It can -be one of @code{age} (to show the age of the commit), @code{age-abbreviated} (to -abbreviate the time unit to a character), or a string (suitable -for @code{format-time-string}) to show the actual date. Option -@code{magit-log-margin-show-committer-date} controls which date is being -displayed. -@item -WIDTH controls the width of the margin. This exists for forward -compatibility and currently the value should not be changed. -@item -AUTHOR controls whether the name of the author is also shown by -default. -@item -AUTHOR-WIDTH has to be an integer. When the name of the author -is shown, then this specifies how much space is used to do so. -@end itemize -@end defopt - -Also see the proceeding section for more options concerning status -buffers. - -@node Repository List -@section Repository List - -@deffn Command magit-list-repositories -This command displays a list of repositories in a separate buffer. - -The option @code{magit-repository-directories} controls which repositories are -displayed. -@end deffn - -@defopt magit-repolist-columns -This option controls what columns are displayed by the command -@code{magit-list-repositories} and how they are displayed. - -Each element has the form @code{(HEADER WIDTH FORMAT PROPS)}. - -HEADER is the string displayed in the header. WIDTH is the width -of the column. FORMAT is a function that is called with one -argument, the repository identification (usually its basename), -and with @code{default-directory} bound to the toplevel of its working -tree. It has to return a string to be inserted or nil. PROPS is -an alist that supports the keys @code{:right-align}, @code{:pad-right} and -@code{:sort}. - -The @code{:sort} function has a weird interface described in the -docstring of @code{tabulated-list--get-sort}. Alternatively @code{<} and -@code{magit-repolist-version<} can be used as those functions are -automatically replaced with functions that satisfy the interface. -Set @code{:sort} to @code{nil} to inhibit sorting; if unspecified, then the -column is sortable using the default sorter. - -You may wish to display a range of numeric columns using just one -character per column and without any padding between columns, in -which case you should use an appropriate HEADER, set WIDTH to 1, -and set @code{:pad-right} to 9. @code{+} is substituted for numbers higher than 9. -@end defopt - -@noindent -The following functions can be added to the above option: - -@defun magit-repolist-column-ident -This function inserts the identification of the repository. Usually -this is just its basename. -@end defun - -@defun magit-repolist-column-path -This function inserts the absolute path of the repository. -@end defun - -@defun magit-repolist-column-version -This function inserts a description of the repository's @code{HEAD} revision. -@end defun - -@defun magit-repolist-column-branch -This function inserts the name of the current branch. -@end defun - -@defun magit-repolist-column-upstream -This function inserts the name of the upstream branch of the current -branch. -@end defun - -@defun magit-repolist-column-branches -This function inserts the number of branches. -@end defun - -@defun magit-repolist-column-stashes -This function inserts the number of stashes. -@end defun - -@defun magit-repolist-column-flag -This function inserts a flag as specified by -@code{magit-repolist-column-flag-alist}. - -By default this indicates whether there are uncommitted changes. - -@itemize -@item -@code{N} if there is at least one untracked file. -@item -@code{U} if there is at least one unstaged file. -@item -@code{S} if there is at least one staged file. -@end itemize - -Only the first one of these that applies is shown. -@end defun - -@defun magit-repolist-column-flags -This functions insert all flags as specified by -@code{magit-repolist-column-flag-alist}. - -This is an alternative to function @code{magit-repolist-column-flag}, -which only lists the first one found. -@end defun - -@defun magit-repolist-column-unpulled-from-upstream -This function inserts the number of upstream commits not in the -current branch. -@end defun - -@defun magit-repolist-column-unpulled-from-pushremote -This function inserts the number of commits in the push branch but -not the current branch. -@end defun - -@defun magit-repolist-column-unpushed-to-upstream -This function inserts the number of commits in the current branch -but not its upstream. -@end defun - -@defun magit-repolist-column-unpushed-to-pushremote -This function inserts the number of commits in the current branch -but not its push branch. -@end defun - -@noindent -The following commands are available in repolist buffers: - -@table @asis -@item @kbd{@key{RET}} (@code{magit-repolist-status}) -@kindex RET -@findex magit-repolist-status -This command shows the status for the repository at point. - -@item @kbd{m} (@code{magit-repolist-mark}) -@kindex m -@findex magit-repolist-mark -This command marks the repository at point. - -@item @kbd{u} (@code{magit-repolist-unmark}) -@kindex u -@findex magit-repolist-unmark -This command unmarks the repository at point. - -@item @kbd{f} (@code{magit-repolist-fetch}) -@kindex f -@findex magit-repolist-fetch -This command fetches all marked repositories. If no repositories -are marked, then it offers to fetch all displayed repositories. - -@item @kbd{5} (@code{magit-repolist-find-file-other-frame}) -@kindex 5 -@findex magit-repolist-find-file-other-frame -This command reads a relative file-name (without completion) and -opens the respective file in each marked repository in a new frame. -If no repositories are marked, then it offers to do this for all -displayed repositories. -@end table - -@node Logging -@section Logging - -The status buffer contains logs for the unpushed and unpulled commits, -but that obviously isn't enough. The transient prefix command -@code{magit-log}, on @code{l}, features several suffix commands, which show a -specific log in a separate log buffer. - -Like other transient prefix commands, @code{magit-log} also features several -infix arguments that can be changed before invoking one of the suffix -commands. However, in the case of the log transient, these arguments -may be taken from those currently in use in the current repository's -log buffer, depending on the value of @code{magit-prefix-use-buffer-arguments} -(see @ref{Transient Arguments and Buffer Variables}). - -For information about the various arguments, see -@ifinfo -@ref{git-log,,,gitman,}. -@end ifinfo -@ifhtml -@html -the <a href="http://git-scm.com/docs/git-log">git-log(1)</a> manpage. -@end html -@end ifhtml -@iftex -the git-log(1) manpage. -@end iftex -The switch @code{++order=VALUE} is converted to one of @code{--author-date-order}, -@code{--date-order}, or @code{--topo-order} before being passed to @code{git log}. - -The log transient also features several reflog commands. See @ref{Reflog}. - -@table @asis -@item @kbd{l} (@code{magit-log}) -@kindex l -@findex magit-log -This transient prefix command binds the following suffix commands -along with the appropriate infix arguments and displays them in a -temporary buffer until a suffix is invoked. - -@item @kbd{l l} (@code{magit-log-current}) -@kindex l l -@findex magit-log-current -Show log for the current branch. When @code{HEAD} is detached or with a -prefix argument, show log for one or more revs read from the -minibuffer. - -@item @kbd{l h} (@code{magit-log-head}) -@kindex l h -@findex magit-log-head -Show log for @code{HEAD}. - -@item @kbd{l u} (@code{magit-log-related}) -@kindex l u -@findex magit-log-related -Show log for the current branch, its upstream and its push target. -When the upstream is a local branch, then also show its own -upstream. When @code{HEAD} is detached, then show log for that, the -previously checked out branch and its upstream and push-target. - -@item @kbd{l o} (@code{magit-log-other}) -@kindex l o -@findex magit-log-other -Show log for one or more revs read from the minibuffer. The user -can input any revision or revisions separated by a space, or even -ranges, but only branches, tags, and a representation of the -commit at point are available as completion candidates. - -@item @kbd{l L} (@code{magit-log-branches}) -@kindex l L -@findex magit-log-branches -Show log for all local branches and @code{HEAD}. - -@item @kbd{l b} (@code{magit-log-all-branches}) -@kindex l b -@findex magit-log-all-branches -Show log for all local and remote branches and @code{HEAD}. - -@item @kbd{l a} (@code{magit-log-all}) -@kindex l a -@findex magit-log-all -Show log for all references and @code{HEAD}. -@end table - -Two additional commands that show the log for the file or blob that is -being visited in the current buffer exists, see @ref{Commands for Buffers Visiting Files}. The command @code{magit-cherry} also shows a log, see -@ref{Cherries}. - -@menu -* Refreshing Logs:: -* Log Buffer:: -* Log Margin:: -* Select from Log:: -* Reflog:: -* Cherries:: -@end menu - -@node Refreshing Logs -@subsection Refreshing Logs - -The transient prefix command @code{magit-log-refresh}, on @code{L}, can be used to -change the log arguments used in the current buffer, without changing -which log is shown. This works in dedicated log buffers, but also in -the status buffer. - -@table @asis -@item @kbd{L} (@code{magit-log-refresh}) -@kindex L -@findex magit-log-refresh -This transient prefix command binds the following suffix commands -along with the appropriate infix arguments and displays them in a -temporary buffer until a suffix is invoked. - -@item @kbd{L g} (@code{magit-log-refresh}) -@kindex L g -@findex magit-log-refresh -This suffix command sets the local log arguments for the current -buffer. - -@item @kbd{L s} (@code{magit-log-set-default-arguments}) -@kindex L s -@findex magit-log-set-default-arguments -This suffix command sets the default log arguments for buffers of -the same type as that of the current buffer. Other existing buffers -of the same type are not affected because their local values have -already been initialized. - -@item @kbd{L w} (@code{magit-log-save-default-arguments}) -@kindex L w -@findex magit-log-save-default-arguments -This suffix command sets the default log arguments for buffers of -the same type as that of the current buffer, and saves the value for -future sessions. Other existing buffers of the same type are not -affected because their local values have already been initialized. - -@item @kbd{L L} (@code{magit-toggle-margin}) -@kindex L L -@findex magit-toggle-margin -Show or hide the margin. -@end table - -@node Log Buffer -@subsection Log Buffer - -@table @asis -@item @kbd{L} (@code{magit-log-refresh}) -@kindex L -@findex magit-log-refresh -This transient prefix command binds the following suffix commands -along with the appropriate infix arguments and displays them in a -temporary buffer until a suffix is invoked. - -See @ref{Refreshing Logs}. - -@item @kbd{q} (@code{magit-log-bury-buffer}) -@kindex q -@findex magit-log-bury-buffer -Bury the current buffer or the revision buffer in the same frame. -Like @code{magit-mode-bury-buffer} (which see) but with a negative prefix -argument instead bury the revision buffer, provided it is displayed -in the current frame. - -@item @kbd{C-c C-b} (@code{magit-go-backward}) -@kindex C-c C-b -@findex magit-go-backward -Move backward in current buffer's history. - -@item @kbd{C-c C-f} (@code{magit-go-forward}) -@kindex C-c C-f -@findex magit-go-forward -Move forward in current buffer's history. - -@item @kbd{C-c C-n} (@code{magit-log-move-to-parent}) -@kindex C-c C-n -@findex magit-log-move-to-parent -Move to a parent of the current commit. By default, this is the -first parent, but a numeric prefix can be used to specify another -parent. - -@item @kbd{j} (@code{magit-log-move-to-revision}) -@kindex j -@findex magit-log-move-to-revision -Read a revision and move to it in current log buffer. - -If the chosen reference or revision isn't being displayed in -the current log buffer, then inform the user about that and do -nothing else. - -If invoked outside any log buffer, then display the log buffer -of the current repository first; creating it if necessary. - -@item @kbd{@key{SPC}} (@code{magit-diff-show-or-scroll-up}) -@kindex SPC -@findex magit-diff-show-or-scroll-up -Update the commit or diff buffer for the thing at point. - -Either show the commit or stash at point in the appropriate buffer, -or if that buffer is already being displayed in the current frame -and contains information about that commit or stash, then instead -scroll the buffer up. If there is no commit or stash at point, then -prompt for a commit. - -@item @kbd{@key{DEL}} (@code{magit-diff-show-or-scroll-down}) -@kindex DEL -@findex magit-diff-show-or-scroll-down -Update the commit or diff buffer for the thing at point. - -Either show the commit or stash at point in the appropriate buffer, -or if that buffer is already being displayed in the current frame -and contains information about that commit or stash, then instead -scroll the buffer down. If there is no commit or stash at point, -then prompt for a commit. - -@item @kbd{=} (@code{magit-log-toggle-commit-limit}) -@kindex = -@findex magit-log-toggle-commit-limit -Toggle the number of commits the current log buffer is limited to. -If the number of commits is currently limited, then remove that -limit. Otherwise set it to 256. - -@item @kbd{+} (@code{magit-log-double-commit-limit}) -@kindex + -@findex magit-log-double-commit-limit -Double the number of commits the current log buffer is limited to. - -@item @kbd{-} (@code{magit-log-half-commit-limit}) -@kindex - -@findex magit-log-half-commit-limit -Half the number of commits the current log buffer is limited to. -@end table - -@defopt magit-log-auto-more -Insert more log entries automatically when moving past the last -entry. Only considered when moving past the last entry with -@code{magit-goto-*-section} commands. -@end defopt - -@defopt magit-log-show-refname-after-summary -Whether to show the refnames after the commit summaries. This is -useful if you use really long branch names. -@end defopt - -@defopt magit-log-show-color-graph-limit -When showing more commits than specified by this option, then the -@code{--color} argument, if specified, is silently dropped. This is -necessary because the @code{ansi-color} library, which is used to turn -control sequences into faces, is just too slow. -@end defopt - -@defopt magit-log-show-signatures-limit -When showing more commits than specified by this option, then the -@code{--show-signature} argument, if specified, is silently dropped. This -is necessary because checking the signature of a large number of -commits is just too slow. -@end defopt - -Magit displays references in logs a bit differently from how Git does -it. - -Local branches are blue and remote branches are green. Of course that -depends on the used theme, as do the colors used for other types of -references. The current branch has a box around it, as do remote -branches that are their respective remote's @code{HEAD} branch. - -If a local branch and its push-target point at the same commit, then -their names are combined to preserve space and to make that -relationship visible. For example: - -@example -origin/feature -[green][blue-] - -instead of - -feature origin/feature -[blue-] [green-------] -@end example - -Also note that while the transient features the @code{--show-signature} -argument, that won't actually be used when enabled, because Magit -defaults to use just one line per commit. Instead the commit -colorized to indicate the validity of the signed commit object, -using the faces named @code{magit-signature-*} (which see). - -For a description of @code{magit-log-margin} see @ref{Log Margin}. - -@node Log Margin -@subsection Log Margin - -In buffers which show one or more logs, it is possible to show -additional information about each commit in the margin. The options -used to configure the margin are named @code{magit-INFIX-margin}, where INFIX -is the same as in the respective major-mode @code{magit-INFIX-mode}. In -regular log buffers that would be @code{magit-log-margin}. - -@defopt magit-log-margin -This option specifies whether the margin is initially shown in -Magit-Log mode buffers and how it is formatted. - -The value has the form @code{(INIT STYLE WIDTH AUTHOR AUTHOR-WIDTH)}. - -@itemize -@item -If INIT is non-nil, then the margin is shown initially. -@item -STYLE controls how to format the author or committer date. It can -be one of @code{age} (to show the age of the commit), @code{age-abbreviated} (to -abbreviate the time unit to a character), or a string (suitable -for @code{format-time-string}) to show the actual date. Option -@code{magit-log-margin-show-committer-date} controls which date is being -displayed. -@item -WIDTH controls the width of the margin. This exists for forward -compatibility and currently the value should not be changed. -@item -AUTHOR controls whether the name of the author is also shown by -default. -@item -AUTHOR-WIDTH has to be an integer. When the name of the author -is shown, then this specifies how much space is used to do so. -@end itemize -@end defopt - -You can change the STYLE and AUTHOR-WIDTH of all @code{magit-INFIX-margin} -options to the same values by customizing @code{magit-log-margin} @strong{before} -@code{magit} is loaded. If you do that, then the respective values for the -other options will default to what you have set for that variable. -Likewise if you set INIT in @code{magit-log-margin} to @code{nil}, then that is used -in the default of all other options. But setting it to @code{t}, i.e. -re-enforcing the default for that option, does not carry to other -options. - -@defopt magit-log-margin-show-committer-date -This option specifies whether to show the committer date in the -margin. This option only controls whether the committer date is -displayed instead of the author date. Whether some date is -displayed in the margin and whether the margin is displayed at all -is controlled by other options. -@end defopt - -@table @asis -@item @kbd{L} (@code{magit-margin-settings}) -@kindex L -@findex magit-margin-settings -This transient prefix command binds the following suffix commands, -each of which changes the appearance of the margin in some way. -@end table - -In some buffers that support the margin, @code{L} is instead bound to -@code{magit-log-refresh}, but that transient features the same commands, and -then some other unrelated commands. - -@table @asis -@item @kbd{L L} (@code{magit-toggle-margin}) -@kindex L L -@findex magit-toggle-margin -This command shows or hides the margin. - -@item @kbd{L l} (@code{magit-cycle-margin-style}) -@kindex L l -@findex magit-cycle-margin-style -This command cycles the style used for the margin. - -@item @kbd{L d} (@code{magit-toggle-margin-details}) -@kindex L d -@findex magit-toggle-margin-details -This command shows or hides details in the margin. -@end table - -@node Select from Log -@subsection Select from Log - -When the user has to select a recent commit that is reachable from -@code{HEAD}, using regular completion would be inconvenient (because most -humans cannot remember hashes or "HEAD~5", at least not without double -checking). Instead a log buffer is used to select the commit, which -has the advantage that commits are presented in order and with the -commit message. - -Such selection logs are used when selecting the beginning of a rebase -and when selecting the commit to be squashed into. - -In addition to the key bindings available in all log buffers, the -following additional key bindings are available in selection log -buffers: - -@table @asis -@item @kbd{C-c C-c} (@code{magit-log-select-pick}) -@kindex C-c C-c -@findex magit-log-select-pick -Select the commit at point and act on it. Call -@code{magit-log-select-pick-function} with the selected commit as -argument. - -@item @kbd{C-c C-k} (@code{magit-log-select-quit}) -@kindex C-c C-k -@findex magit-log-select-quit -Abort selecting a commit, don't act on any commit. -@end table - -@defopt magit-log-select-margin -This option specifies whether the margin is initially shown in -Magit-Log-Select mode buffers and how it is formatted. - -The value has the form @code{(INIT STYLE WIDTH AUTHOR AUTHOR-WIDTH)}. - -@itemize -@item -If INIT is non-nil, then the margin is shown initially. -@item -STYLE controls how to format the author or committer date. It can -be one of @code{age} (to show the age of the commit), @code{age-abbreviated} (to -abbreviate the time unit to a character), or a string (suitable -for @code{format-time-string}) to show the actual date. Option -@code{magit-log-margin-show-committer-date} controls which date is being -displayed. -@item -WIDTH controls the width of the margin. This exists for forward -compatibility and currently the value should not be changed. -@item -AUTHOR controls whether the name of the author is also shown by -default. -@item -AUTHOR-WIDTH has to be an integer. When the name of the author -is shown, then this specifies how much space is used to do so. -@end itemize -@end defopt - -@node Reflog -@subsection Reflog - -Also see -@ifinfo -@ref{git-reflog,,,gitman,}. -@end ifinfo -@ifhtml -@html -the <a href="http://git-scm.com/docs/git-reflog">git-reflog(1)</a> manpage. -@end html -@end ifhtml -@iftex -the git-reflog(1) manpage. -@end iftex - -These reflog commands are available from the log transient. See -@ref{Logging}. - -@table @asis -@item @kbd{l r} (@code{magit-reflog-current}) -@kindex l r -@findex magit-reflog-current -Display the reflog of the current branch. - -@item @kbd{l O} (@code{magit-reflog-other}) -@kindex l O -@findex magit-reflog-other -Display the reflog of a branch or another ref. - -@item @kbd{l H} (@code{magit-reflog-head}) -@kindex l H -@findex magit-reflog-head -Display the @code{HEAD} reflog. -@end table - -@defopt magit-reflog-margin -This option specifies whether the margin is initially shown in -Magit-Reflog mode buffers and how it is formatted. - -The value has the form @code{(INIT STYLE WIDTH AUTHOR AUTHOR-WIDTH)}. - -@itemize -@item -If INIT is non-nil, then the margin is shown initially. -@item -STYLE controls how to format the author or committer date. It can -be one of @code{age} (to show the age of the commit), @code{age-abbreviated} (to -abbreviate the time unit to a character), or a string (suitable -for @code{format-time-string}) to show the actual date. Option -@code{magit-log-margin-show-committer-date} controls which date is being -displayed. -@item -WIDTH controls the width of the margin. This exists for forward -compatibility and currently the value should not be changed. -@item -AUTHOR controls whether the name of the author is also shown by -default. -@item -AUTHOR-WIDTH has to be an integer. When the name of the author -is shown, then this specifies how much space is used to do so. -@end itemize -@end defopt - -@node Cherries -@subsection Cherries - -Cherries are commits that haven't been applied upstream (yet), and are -usually visualized using a log. Each commit is prefixed with @code{-} if it -has an equivalent in the upstream and @code{+} if it does not, i.e., if it is -a cherry. - -The command @code{magit-cherry} shows cherries for a single branch, but the -references buffer (see @ref{References Buffer}) can show cherries for -multiple "upstreams" at once. - -Also see -@ifinfo -@ref{git-reflog,,,gitman,}. -@end ifinfo -@ifhtml -@html -the <a href="http://git-scm.com/docs/git-reflog">git-reflog(1)</a> manpage. -@end html -@end ifhtml -@iftex -the git-reflog(1) manpage. -@end iftex - -@table @asis -@item @kbd{Y} (@code{magit-cherry}) -@kindex Y -@findex magit-cherry -Show commits that are in a certain branch but that have not been -merged in the upstream branch. -@end table - -@defopt magit-cherry-margin -This option specifies whether the margin is initially shown in -Magit-Cherry mode buffers and how it is formatted. - -The value has the form @code{(INIT STYLE WIDTH AUTHOR AUTHOR-WIDTH)}. - -@itemize -@item -If INIT is non-nil, then the margin is shown initially. -@item -STYLE controls how to format the author or committer date. It can -be one of @code{age} (to show the age of the commit), @code{age-abbreviated} (to -abbreviate the time unit to a character), or a string (suitable -for @code{format-time-string}) to show the actual date. Option -@code{magit-log-margin-show-committer-date} controls which date is being -displayed. -@item -WIDTH controls the width of the margin. This exists for forward -compatibility and currently the value should not be changed. -@item -AUTHOR controls whether the name of the author is also shown by -default. -@item -AUTHOR-WIDTH has to be an integer. When the name of the author -is shown, then this specifies how much space is used to do so. -@end itemize -@end defopt - -@node Diffing -@section Diffing - -The status buffer contains diffs for the staged and unstaged commits, -but that obviously isn't enough. The transient prefix command -@code{magit-diff}, on @code{d}, features several suffix commands, which show a -specific diff in a separate diff buffer. - -Like other transient prefix commands, @code{magit-diff} also features several -infix arguments that can be changed before invoking one of the suffix -commands. However, in the case of the diff transient, these arguments may -be taken from those currently in use in the current repository's diff -buffer, depending on the value of @code{magit-prefix-use-buffer-arguments} -(see @ref{Transient Arguments and Buffer Variables}). - -Also see -@ifinfo -@ref{git-diff,,,gitman,}. -@end ifinfo -@ifhtml -@html -the <a href="http://git-scm.com/docs/git-diff">git-diff(1)</a> manpage. -@end html -@end ifhtml -@iftex -the git-diff(1) manpage. -@end iftex - -@table @asis -@item @kbd{d} (@code{magit-diff}) -@kindex d -@findex magit-diff -This transient prefix command binds the following suffix commands -along with the appropriate infix arguments and displays them in a -temporary buffer until a suffix is invoked. - -@item @kbd{d d} (@code{magit-diff-dwim}) -@kindex d d -@findex magit-diff-dwim -Show changes for the thing at point. - -@item @kbd{d r} (@code{magit-diff-range}) -@kindex d r -@findex magit-diff-range -Show differences between two commits. - -RANGE should be a range (A..B or A@dots{}B) but can also be a single -commit. If one side of the range is omitted, then it defaults to -@code{HEAD}. If just a commit is given, then changes in the working tree -relative to that commit are shown. - -If the region is active, use the revisions on the first and last -line of the region. With a prefix argument, instead of diffing the -revisions, choose a revision to view changes along, starting at the -common ancestor of both revisions (i.e., use a "@dots{}" range). - -@item @kbd{d w} (@code{magit-diff-working-tree}) -@kindex d w -@findex magit-diff-working-tree -Show changes between the current working tree and the @code{HEAD} commit. -With a prefix argument show changes between the working tree and a -commit read from the minibuffer. - -@item @kbd{d s} (@code{magit-diff-staged}) -@kindex d s -@findex magit-diff-staged -Show changes between the index and the @code{HEAD} commit. With a prefix -argument show changes between the index and a commit read from the -minibuffer. - -@item @kbd{d u} (@code{magit-diff-unstaged}) -@kindex d u -@findex magit-diff-unstaged -Show changes between the working tree and the index. - -@item @kbd{d p} (@code{magit-diff-paths}) -@kindex d p -@findex magit-diff-paths -Show changes between any two files on disk. -@end table - -All of the above suffix commands update the repository's diff buffer. -The diff transient also features two commands which show differences -in another buffer: - -@table @asis -@item @kbd{d c} (@code{magit-show-commit}) -@kindex d c -@findex magit-show-commit -Show the commit at point. If there is no commit at point or with a -prefix argument, prompt for a commit. - -@item @kbd{d t} (@code{magit-stash-show}) -@kindex d t -@findex magit-stash-show -Show all diffs of a stash in a buffer. -@end table - -Two additional commands that show the diff for the file or blob that -is being visited in the current buffer exists, see @ref{Commands for Buffers Visiting Files}. - -@menu -* Refreshing Diffs:: -* Commands Available in Diffs:: -* Diff Options:: -* Revision Buffer:: -@end menu - -@node Refreshing Diffs -@subsection Refreshing Diffs - -The transient prefix command @code{magit-diff-refresh}, on @code{D}, can be used to -change the diff arguments used in the current buffer, without changing -which diff is shown. This works in dedicated diff buffers, but also -in the status buffer. - -(There is one exception; diff arguments cannot be changed in buffers -created by @code{magit-merge-preview} because the underlying Git command does -not support these arguments.) - -@table @asis -@item @kbd{D} (@code{magit-diff-refresh}) -@kindex D -@findex magit-diff-refresh -This transient prefix command binds the following suffix commands -along with the appropriate infix arguments and displays them in a -temporary buffer until a suffix is invoked. - -@item @kbd{D g} (@code{magit-diff-refresh}) -@kindex D g -@findex magit-diff-refresh -This suffix command sets the local diff arguments for the current -buffer. - -@item @kbd{D s} (@code{magit-diff-set-default-arguments}) -@kindex D s -@findex magit-diff-set-default-arguments -This suffix command sets the default diff arguments for buffers of -the same type as that of the current buffer. Other existing buffers -of the same type are not affected because their local values have -already been initialized. - -@item @kbd{D w} (@code{magit-diff-save-default-arguments}) -@kindex D w -@findex magit-diff-save-default-arguments -This suffix command sets the default diff arguments for buffers of -the same type as that of the current buffer, and saves the value for -future sessions. Other existing buffers of the same type are not -affected because their local values have already been initialized. - -@item @kbd{D t} (@code{magit-diff-toggle-refine-hunk}) -@kindex D t -@findex magit-diff-toggle-refine-hunk -This command toggles hunk refinement on or off. - -@item @kbd{D r} (@code{magit-diff-switch-range-type}) -@kindex D r -@findex magit-diff-switch-range-type -This command converts the diff range type from "revA..revB" to -"revB@dots{}revA", or vice versa. - -@item @kbd{D f} (@code{magit-diff-flip-revs}) -@kindex D f -@findex magit-diff-flip-revs -This command swaps revisions in the diff range from "revA..revB" -to "revB..revA", or vice versa. - -@item @kbd{D F} (@code{magit-diff-toggle-file-filter}) -@kindex D F -@findex magit-diff-toggle-file-filter -This command toggles the file restriction of the diffs in the -current buffer, allowing you to quickly switch between viewing all -the changes in the commit and the restricted subset. As a special -case, when this command is called from a log buffer, it toggles the -file restriction in the repository's revision buffer, which is -useful when you display a revision from a log buffer that is -restricted to a file or files. -@end table - -In addition to the above transient, which allows changing any of the -supported arguments, there also exist some commands that change only -a particular argument. - -@table @asis -@item @kbd{-} (@code{magit-diff-less-context}) -@kindex - -@findex magit-diff-less-context -This command decreases the context for diff hunks by COUNT lines. - -@item @kbd{+} (@code{magit-diff-more-context}) -@kindex + -@findex magit-diff-more-context -This command increases the context for diff hunks by COUNT lines. - -@item @kbd{0} (@code{magit-diff-default-context}) -@kindex 0 -@findex magit-diff-default-context -This command resets the context for diff hunks to the default height. -@end table - -The following commands quickly change what diff is being displayed -without having to using one of the diff transient. - -@table @asis -@item @kbd{C-c C-d} (@code{magit-diff-while-committing}) -@kindex C-c C-d -@findex magit-diff-while-committing -While committing, this command shows the changes that are about to -be committed. While amending, invoking the command again toggles -between showing just the new changes or all the changes that will be -committed. - -This binding is available in the diff buffer as well as the commit -message buffer. - -@item @kbd{C-c C-b} (@code{magit-go-backward}) -@kindex C-c C-b -@findex magit-go-backward -This command moves backward in current buffer's history. - -@item @kbd{C-c C-f} (@code{magit-go-forward}) -@kindex C-c C-f -@findex magit-go-forward -This command moves forward in current buffer's history. -@end table - -@node Commands Available in Diffs -@subsection Commands Available in Diffs - -Some commands are only available if point is inside a diff. - -@code{magit-diff-visit-file} and related commands visit the appropriate -version of the file that the diff at point is about. Likewise -@code{magit-diff-visit-worktree-file} and related commands visit the worktree -version of the file that the diff at point is about. See @ref{Visiting Files and Blobs from a Diff} for more information and the key bindings. - -@table @asis -@item @kbd{C-c C-t} (@code{magit-diff-trace-definition}) -@kindex C-c C-t -@findex magit-diff-trace-definition -This command shows a log for the definition at point. -@end table - -@defopt magit-log-trace-definition-function -The function specified by this option is used by -@code{magit-log-trace-definition} to determine the function at point. For -major-modes that have special needs, you could set the local value -using the mode's hook. -@end defopt - -@table @asis -@item @kbd{C-c C-e} (@code{magit-diff-edit-hunk-commit}) -@kindex C-c C-e -@findex magit-diff-edit-hunk-commit -From a hunk, this command edits the respective commit and visits -the file. - -First it visits the file being modified by the hunk at the correct -location using @code{magit-diff-visit-file}. This actually visits a blob. -When point is on a diff header, not within an individual hunk, then -this visits the blob the first hunk is about. - -Then it invokes @code{magit-edit-line-commit}, which uses an interactive -rebase to make the commit editable, or if that is not possible -because the commit is not reachable from @code{HEAD} by checking out that -commit directly. This also causes the actual worktree file to be -visited. - -Neither the blob nor the file buffer are killed when finishing -the rebase. If that is undesirable, then it might be better to -use @code{magit-rebase-edit-commit} instead of this command. - -@item @kbd{j} (@code{magit-jump-to-diffstat-or-diff}) -@kindex j -@findex magit-jump-to-diffstat-or-diff -This command jumps to the diffstat or diff. When point is on a file -inside the diffstat section, then jump to the respective diff -section. Otherwise, jump to the diffstat section or a child -thereof. -@end table - -The next two commands are not specific to Magit-Diff mode (or and -Magit buffer for that matter), but it might be worth pointing out -that they are available here too. - -@table @asis -@item @kbd{@key{SPC}} (@code{scroll-up}) -@kindex SPC -@findex scroll-up -This command scrolls text upward. - -@item @kbd{@key{DEL}} (@code{scroll-down}) -@kindex DEL -@findex scroll-down -This command scrolls text downward. -@end table - -@node Diff Options -@subsection Diff Options - -@defopt magit-diff-refine-hunk -Whether to show word-granularity differences within diff hunks. - -@itemize -@item -@code{nil} Never show fine differences. -@item -@code{t} Show fine differences for the current diff hunk only. -@item -@code{all} Show fine differences for all displayed diff hunks. -@end itemize -@end defopt - -@defopt magit-diff-refine-ignore-whitespace -Whether to ignore whitespace changes in word-granularity -differences. -@end defopt - -@defopt magit-diff-adjust-tab-width -Whether to adjust the width of tabs in diffs. - -Determining the correct width can be expensive if it requires -opening large and/or many files, so the widths are cached in the -variable @code{magit-diff--tab-width-cache}. Set that to nil to invalidate -the cache. - -@itemize -@item -@code{nil} Never adjust tab width. Use `tab-width's value from the Magit -buffer itself instead. - -@item -@code{t} If the corresponding file-visiting buffer exits, then use -@code{tab-width}'s value from that buffer. Doing this is cheap, so this -value is used even if a corresponding cache entry exists. - -@item -@code{always} If there is no such buffer, then temporarily visit the file -to determine the value. - -@item -NUMBER Like @code{always}, but don't visit files larger than NUMBER -bytes. -@end itemize -@end defopt - -@defopt magit-diff-paint-whitespace -Specify where to highlight whitespace errors. - -See @code{magit-diff-highlight-trailing}, -@code{magit-diff-highlight-indentation}. The symbol @code{t} means in all -diffs, @code{status} means only in the status buffer, and nil means -nowhere. - -@itemize -@item -@code{nil} Never highlight whitespace errors. -@item -@code{t} Highlight whitespace errors everywhere. -@item -@code{uncommitted} Only highlight whitespace errors in diffs showing -uncommitted changes. For backward compatibility @code{status} is treated -as a synonym. -@end itemize -@end defopt - -@defopt magit-diff-paint-whitespace-lines -Specify in what kind of lines to highlight whitespace errors. - -@itemize -@item -@code{t} Highlight only in added lines. -@item -@code{both} Highlight in added and removed lines. -@item -@code{all} Highlight in added, removed and context lines. -@end itemize -@end defopt - -@defopt magit-diff-highlight-trailing -Whether to highlight whitespace at the end of a line in diffs. Used -only when @code{magit-diff-paint-whitespace} is non-nil. -@end defopt - -@defopt magit-diff-highlight-indentation -This option controls whether to highlight the indentation in case it -used the "wrong" indentation style. Indentation is only highlighted -if @code{magit-diff-paint-whitespace} is also non-nil. - -The value is an alist of the form @code{((REGEXP . INDENT)...)}. The path -to the current repository is matched against each element in reverse -order. Therefore if a REGEXP matches, then earlier elements are not -tried. - -If the used INDENT is @code{tabs}, highlight indentation with tabs. If -INDENT is an integer, highlight indentation with at least that many -spaces. Otherwise, highlight neither. -@end defopt - -@defopt magit-diff-hide-trailing-cr-characters -Whether to hide ^M characters at the end of a line in diffs. -@end defopt - -@defopt magit-diff-highlight-hunk-region-functions -This option specifies the functions used to highlight the -hunk-internal region. - -@code{magit-diff-highlight-hunk-region-dim-outside} overlays the outside of -the hunk internal selection with a face that causes the added and -removed lines to have the same background color as context lines. -This function should not be removed from the value of this option. - -@code{magit-diff-highlight-hunk-region-using-overlays} and -@code{magit-diff-highlight-hunk-region-using-underline} emphasize the -region by placing delimiting horizontal lines before and after it. -Both of these functions have glitches which cannot be fixed due to -limitations of Emacs' display engine. For more information see -@uref{https://github.com/magit/magit/issues/2758} ff. - -Instead of, or in addition to, using delimiting horizontal lines, -to emphasize the boundaries, you may wish to emphasize the text -itself, using @code{magit-diff-highlight-hunk-region-using-face}. - -In terminal frames it's not possible to draw lines as the overlay -and underline variants normally do, so there they fall back to -calling the face function instead. -@end defopt - -@defopt magit-diff-unmarked-lines-keep-foreground -This option controls whether added and removed lines outside the -hunk-internal region only lose their distinct background color or -also the foreground color. Whether the outside of the region is -dimmed at all depends on @code{magit-diff-highlight-hunk-region-functions}. -@end defopt - -@defopt magit-diff-extra-stat-arguments -This option specifies additional arguments to be used alongside -@code{--stat}. - -The value is a list of zero or more arguments or a function that -takes no argument and returns such a list. These arguments are -allowed here: @code{--stat-width}, @code{--stat-name-width}, -@code{--stat-graph-width} and @code{--compact-summary}. Also see -@ifinfo -@ref{git-diff,,,gitman,}. -@end ifinfo -@ifhtml -@html -the <a href="http://git-scm.com/docs/git-diff">git-diff(1)</a> manpage. -@end html -@end ifhtml -@iftex -the git-diff(1) manpage. -@end iftex -@end defopt - -@node Revision Buffer -@subsection Revision Buffer - -@defopt magit-revision-insert-related-refs -Whether to show related branches in revision buffers. - -@itemize -@item -@code{nil} Don't show any related branches. -@item -@code{t} Show related local branches. -@item -@code{all} Show related local and remote branches. -@item -@code{mixed} Show all containing branches and local merged branches. -@end itemize -@end defopt - -@defopt magit-revision-show-gravatars -Whether to show gravatar images in revision buffers. - -If @code{nil}, then don't insert any gravatar images. If @code{t}, then insert -both images. If @code{author} or @code{committer}, then insert only the -respective image. - -If you have customized the option @code{magit-revision-headers-format} -and want to insert the images then you might also have to specify -where to do so. In that case the value has to be a cons-cell of -two regular expressions. The car specifies where to insert the -author's image. The top half of the image is inserted right -after the matched text, the bottom half on the next line in the -same column. The cdr specifies where to insert the committer's -image, accordingly. Either the car or the cdr may be nil." -@end defopt - -@defopt magit-revision-use-hash-sections -Whether to turn hashes inside the commit message into sections. - -If non-nil, then hashes inside the commit message are turned into -@code{commit} sections. There is a trade off to be made between -performance and reliability: - -@itemize -@item -@code{slow} calls git for every word to be absolutely sure. -@item -@code{quick} skips words less than seven characters long. -@item -@code{quicker} additionally skips words that don't contain a number. -@item -@code{quickest} uses all words that are at least seven characters long -and which contain at least one number as well as at least one -letter. -@end itemize - -If nil, then no hashes are turned into sections, but you can still -visit the commit at point using "RET". -@end defopt - -The diffs shown in the revision buffer may be automatically restricted -to a subset of the changed files. If the revision buffer is displayed -from a log buffer, the revision buffer will share the same file -restriction as that log buffer (also see the command -@code{magit-diff-toggle-file-filter}). - -@defopt magit-revision-filter-files-on-follow -Whether showing a commit from a log buffer honors the log's file -filter when the log arguments include @code{--follow}. - -When this option is nil, displaying a commit from a log ignores the -log's file filter if the log arguments include @code{--follow}. Doing so -avoids showing an empty diff in revision buffers for commits before -a rename event. In such cases, the @code{--patch} argument of the log -transient can be used to show the file-restricted diffs inline. - -Set this option to non-nil to keep the log's file restriction even -if @code{--follow} is present in the log arguments. -@end defopt - -If the revision buffer is not displayed from a log buffer, the file -restriction is determined as usual (see @ref{Transient Arguments and Buffer Variables}). - -@node Ediffing -@section Ediffing - -This section describes how to enter Ediff from Magit buffers. For -information on how to use Ediff itself, see @ref{Top,,,ediff,}. - -@table @asis -@item @kbd{e} (@code{magit-ediff-dwim}) -@kindex e -@findex magit-ediff-dwim -Compare, stage, or resolve using Ediff. - -This command tries to guess what file, and what commit or range the -user wants to compare, stage, or resolve using Ediff. It might only -be able to guess either the file, or range/commit, in which case -the user is asked about the other. It might not always guess right, -in which case the appropriate @code{magit-ediff-*} command has to be used -explicitly. If it cannot read the user's mind at all, then it asks -the user for a command to run. - -@item @kbd{E} (@code{magit-ediff}) -@kindex E -@findex magit-ediff -This transient prefix command binds the following suffix commands -and displays them in a temporary buffer until a suffix is invoked. - -@item @kbd{E r} (@code{magit-ediff-compare}) -@kindex E r -@findex magit-ediff-compare -Compare two revisions of a file using Ediff. - -If the region is active, use the revisions on the first and last -line of the region. With a prefix argument, instead of diffing the -revisions, choose a revision to view changes along, starting at the -common ancestor of both revisions (i.e., use a "@dots{}" range). - -@item @kbd{E m} (@code{magit-ediff-resolve-rest}) -@kindex E m -@findex magit-ediff-resolve-rest -This command allows you to resolve outstanding conflicts in the file -at point using Ediff. If there is no file at point or if it doesn't -have any unmerged changes, then this command prompts for a file. - -Provided that the value of @code{merge.conflictstyle} is @code{diff3}, you can -view the file's merge-base revision using @code{/} in the Ediff control -buffer. - -The A, B and Ancestor buffers are constructed from the conflict -markers in the worktree file. Because you and/or Git may have -already resolved some conflicts, that means that these buffers -may not contain the actual versions from the respective blobs. - -@item @kbd{E M} (@code{magit-ediff-resolve-all}) -@kindex E M -@findex magit-ediff-resolve-all -This command allows you to resolve all conflicts in the file at -point using Ediff. If there is no file at point or if it doesn't -have any unmerged changes, then this command prompts for a file. - -Provided that the value of @code{merge.conflictstyle} is @code{diff3}, you can -view the file's merge-base revision using @code{/} in the Ediff control -buffer. - -First the file in the worktree is moved aside, appending the suffix -@samp{.ORIG}, so that you could later go back to that version. Then it is -reconstructed from the two sides of the conflict and the merge-base, -if available. - -It would be nice if the worktree file were just used as-is, but -Ediff does not support that. This means that all conflicts, that -Git has already resolved, are restored. On the other hand Ediff -also tries to resolve conflicts, and in many cases Ediff and Git -should produce similar results. - -However if you have already resolved some conflicts manually, then -those changes are discarded (though you can recover them from the -backup file). In such cases @code{magit-ediff-resolve-rest} might be more -suitable. - -The advantage that this command has over @code{magit-ediff-resolve-rest} -is that the A, B and Ancestor buffers correspond to blobs from the -respective commits, allowing you to inspect a side in context and -to use Magit commands in these buffers to do so. Blame and log -commands are particularly useful here. - -@item @kbd{E t} (@code{magit-git-mergetool}) -@kindex E t -@findex magit-git-mergetool -This command does not actually use Ediff. While it serves the same -purpose as @samp{magit-ediff-resolve-rest}, it uses @samp{git mergetool --gui} to -resolve conflicts. - -With a prefix argument this acts as a transient prefix command, -allowing the user to select the mergetool and change some settings. - -@item @kbd{E s} (@code{magit-ediff-stage}) -@kindex E s -@findex magit-ediff-stage -Stage and unstage changes to a file using Ediff, defaulting to the -file at point. - -@item @kbd{E u} (@code{magit-ediff-show-unstaged}) -@kindex E u -@findex magit-ediff-show-unstaged -Show unstaged changes to a file using Ediff. - -@item @kbd{E i} (@code{magit-ediff-show-staged}) -@kindex E i -@findex magit-ediff-show-staged -Show staged changes to a file using Ediff. - -@item @kbd{E w} (@code{magit-ediff-show-working-tree}) -@kindex E w -@findex magit-ediff-show-working-tree -Show changes in a file between @code{HEAD} and working tree using Ediff. - -@item @kbd{E c} (@code{magit-ediff-show-commit}) -@kindex E c -@findex magit-ediff-show-commit -Show changes to a file introduced by a commit using Ediff. - -@item @kbd{E z} (@code{magit-ediff-show-stash}) -@kindex E z -@findex magit-ediff-show-stash -Show changes to a file introduced by a stash using Ediff. -@end table - -@defopt magit-ediff-dwim-resolve-function -This option controls which function @code{magit-ediff-dwim} uses to resolve -conflicts. One of @code{magit-ediff-resolve-rest}, @code{magit-ediff-resolve-all} -or @code{magit-git-mergetool}; which are all discussed above. -@end defopt - -@defopt magit-ediff-dwim-show-on-hunks -This option controls what command @code{magit-ediff-dwim} calls when -point is on uncommitted hunks. When nil, always run -@code{magit-ediff-stage}. Otherwise, use @code{magit-ediff-show-staged} and -@code{magit-ediff-show-unstaged} to show staged and unstaged changes, -respectively. -@end defopt - -@defopt magit-ediff-show-stash-with-index -This option controls whether @code{magit-ediff-show-stash} includes a -buffer containing the file's state in the index at the time the -stash was created. This makes it possible to tell which changes in -the stash were staged. -@end defopt - -@defopt magit-ediff-quit-hook -This hook is run after quitting an Ediff session that was created -using a Magit command. The hook functions are run inside the Ediff -control buffer, and should not change the current buffer. - -This is similar to @code{ediff-quit-hook} but takes the needs of Magit into -account. The regular @code{ediff-quit-hook} is ignored by Ediff sessions -that were created using a Magit command. -@end defopt - -@node References Buffer -@section References Buffer - -@table @asis -@item @kbd{y} (@code{magit-show-refs}) -@kindex y -@findex magit-show-refs -This command lists branches and tags in a dedicated buffer. - -However if this command is invoked again from this buffer or if it -is invoked with a prefix argument, then it acts as a transient -prefix command, which binds the following suffix commands and some -infix arguments. -@end table - -All of the following suffix commands list exactly the same branches -and tags. The only difference the optional feature that can be -enabled by changing the value of @code{magit-refs-show-commit-count} (see -below). These commands specify a different branch or commit against -which all the other references are compared. - -@table @asis -@item @kbd{y y} (@code{magit-show-refs-head}) -@kindex y y -@findex magit-show-refs-head -This command lists branches and tags in a dedicated buffer. Each -reference is being compared with @code{HEAD}. - -@item @kbd{y c} (@code{magit-show-refs-current}) -@kindex y c -@findex magit-show-refs-current -This command lists branches and tags in a dedicated buffer. Each -reference is being compared with the current branch or @code{HEAD} if it -is detached. - -@item @kbd{y o} (@code{magit-show-refs-other}) -@kindex y o -@findex magit-show-refs-other -This command lists branches and tags in a dedicated buffer. Each -reference is being compared with a branch read from the user. - -@item @kbd{y r} (@code{magit-refs-set-show-commit-count}) -@kindex y r -@findex magit-refs-set-show-commit-count -This command changes for which refs the commit count is shown. -@end table - -@defopt magit-refs-show-commit-count -Whether to show commit counts in Magit-Refs mode buffers. - -@itemize -@item -@code{all} Show counts for branches and tags. -@item -@code{branch} Show counts for branches only. -@item -@code{nil} Never show counts. -@end itemize - -The default is @code{nil} because anything else can be very expensive. -@end defopt - -@defopt magit-refs-pad-commit-counts -Whether to pad all commit counts on all sides in Magit-Refs mode -buffers. - -If this is nil, then some commit counts are displayed right next to -one of the branches that appear next to the count, without any space -in between. This might look bad if the branch name faces look too -similar to @code{magit-dimmed}. - -If this is non-nil, then spaces are placed on both sides of all -commit counts. -@end defopt - -@defopt magit-refs-show-remote-prefix -Whether to show the remote prefix in lists of remote branches. - -Showing the prefix is redundant because the name of the remote is -already shown in the heading preceding the list of its branches. -@end defopt - -@defopt magit-refs-primary-column-width -Width of the primary column in `magit-refs-mode' buffers. The -primary column is the column that contains the name of the branch -that the current row is about. - -If this is an integer, then the column is that many columns wide. -Otherwise it has to be a cons-cell of two integers. The first -specifies the minimal width, the second the maximal width. In that -case the actual width is determined using the length of the names of -the shown local branches. (Remote branches and tags are not taken -into account when calculating to optimal width.) -@end defopt - -@defopt magit-refs-focus-column-width -Width of the focus column in `magit-refs-mode' buffers. - -The focus column is the first column, which marks one branch -(usually the current branch) as the focused branch using @code{*} or @code{@@}. -For each other reference, this column optionally shows how many -commits it is ahead of the focused branch and @code{<}, or if it isn't -ahead then the commits it is behind and @code{>}, or if it isn't behind -either, then a @code{=}. - -This column may also display only @code{*} or @code{@@} for the focused branch, in -which case this option is ignored. Use @code{L v} to change the verbosity -of this column. -@end defopt - -@defopt magit-refs-margin -This option specifies whether the margin is initially shown in -Magit-Refs mode buffers and how it is formatted. - -The value has the form @code{(INIT STYLE WIDTH AUTHOR AUTHOR-WIDTH)}. - -@itemize -@item -If INIT is non-nil, then the margin is shown initially. -@item -STYLE controls how to format the author or committer date. It can -be one of @code{age} (to show the age of the commit), @code{age-abbreviated} (to -abbreviate the time unit to a character), or a string (suitable -for @code{format-time-string}) to show the actual date. Option -@code{magit-log-margin-show-committer-date} controls which date is being -displayed. -@item -WIDTH controls the width of the margin. This exists for forward -compatibility and currently the value should not be changed. -@item -AUTHOR controls whether the name of the author is also shown by -default. -@item -AUTHOR-WIDTH has to be an integer. When the name of the author -is shown, then this specifies how much space is used to do so. -@end itemize -@end defopt - -@defopt magit-refs-margin-for-tags -This option specifies whether to show information about tags in the -margin. This is disabled by default because it is slow if there are -many tags. -@end defopt - -The following variables control how individual refs are displayed. If -you change one of these variables (especially the "%c" part), then you -should also change the others to keep things aligned. The following -%-sequences are supported: - -@itemize -@item -@code{%a} Number of commits this ref has over the one we compare to. -@item -@code{%b} Number of commits the ref we compare to has over this one. -@item -@code{%c} Number of commits this ref has over the one we compare to. For -the ref which all other refs are compared this is instead "@@", if -it is the current branch, or "#" otherwise. -@item -@code{%C} For the ref which all other refs are compared this is "@@", if it -is the current branch, or "#" otherwise. For all other refs " ". -@item -@code{%h} Hash of this ref's tip. -@item -@code{%m} Commit summary of the tip of this ref. -@item -@code{%n} Name of this ref. -@item -@code{%u} Upstream of this local branch. -@item -@code{%U} Upstream of this local branch and additional local vs. upstream -information. -@end itemize - -@defopt magit-refs-filter-alist -The purpose of this option is to forgo displaying certain refs -based on their name. If you want to not display any refs of a -certain type, then you should remove the appropriate function -from @code{magit-refs-sections-hook} instead. - -This alist controls which tags and branches are omitted from being -displayed in @code{magit-refs-mode} buffers. If it is @code{nil}, then all refs -are displayed (subject to @code{magit-refs-sections-hook}). - -All keys are tried in order until one matches. Then its value is -used and subsequent elements are ignored. If the value is non-nil, -then the reference is displayed, otherwise it is not. If no element -matches, then the reference is displayed. - -A key can either be a regular expression that the refname has to -match, or a function that takes the refname as only argument and -returns a boolean. A remote branch such as "origin/master" is -displayed as just "master", however for this comparison the -former is used. -@end defopt - -@table @asis -@item @kbd{@key{RET}} (@code{magit-visit-ref}) -@kindex RET -@findex magit-visit-ref -This command visits the reference or revision at point in another -buffer. If there is no revision at point or with a prefix argument -then it prompts for a revision. - -This command behaves just like @code{magit-show-commit} as described above, -except if point is on a reference in a @code{magit-refs-mode} buffer, in -which case the behavior may be different, but only if you have -customized the option @code{magit-visit-ref-behavior}. -@end table - -@defopt magit-visit-ref-behavior -This option controls how @code{magit-visit-ref} behaves in @code{magit-refs-mode} -buffers. - -By default @code{magit-visit-ref} behaves like @code{magit-show-commit}, in all -buffers, including @code{magit-refs-mode} buffers. When the type of the -section at point is @code{commit} then "RET" is bound to @code{magit-show-commit}, -and when the type is either @code{branch} or @code{tag} then it is bound to -@code{magit-visit-ref}. - -"RET" is one of Magit's most essential keys and at least by default -it should behave consistently across all of Magit, especially -because users quickly learn that it does something very harmless; it -shows more information about the thing at point in another buffer. - -However "RET" used to behave differently in @code{magit-refs-mode} buffers, -doing surprising things, some of which cannot really be described as -"visit this thing". If you've grown accustomed this behavior, you -can restore it by adding one or more of the below symbols to the -value of this option. But keep in mind that by doing so you don't -only introduce inconsistencies, you also lose some functionality and -might have to resort to @code{M-x magit-show-commit} to get it back. - -@code{magit-visit-ref} looks for these symbols in the order in which they -are described here. If the presence of a symbol applies to the -current situation, then the symbols that follow do not affect the -outcome. - -@itemize -@item -@code{focus-on-ref} - -With a prefix argument update the buffer to show commit counts -and lists of cherry commits relative to the reference at point -instead of relative to the current buffer or @code{HEAD}. - -Instead of adding this symbol, consider pressing "C-u y o RET". - -@item -@code{create-branch} - -If point is on a remote branch, then create a new local branch -with the same name, use the remote branch as its upstream, and -then check out the local branch. - -Instead of adding this symbol, consider pressing "b c RET RET", -like you would do in other buffers. - -@item -@code{checkout-any} - -Check out the reference at point. If that reference is a tag -or a remote branch, then this results in a detached @code{HEAD}. - -Instead of adding this symbol, consider pressing "b b RET", -like you would do in other buffers. - -@item -@code{checkout-branch} - -Check out the local branch at point. - -Instead of adding this symbol, consider pressing "b b RET", -like you would do in other buffers. -@end itemize -@end defopt - -@menu -* References Sections:: -@end menu - -@node References Sections -@subsection References Sections - -The contents of references buffers is controlled using the hook -@code{magit-refs-sections-hook}. See @ref{Section Hooks} to learn about such hooks -and how to customize them. All of the below functions are members of -the default value. Note that it makes much less sense to customize -this hook than it does for the respective hook used for the status -buffer. - -@defopt magit-refs-sections-hook -Hook run to insert sections into a references buffer. -@end defopt - -@defun magit-insert-local-branches -Insert sections showing all local branches. -@end defun - -@defun magit-insert-remote-branches -Insert sections showing all remote-tracking branches. -@end defun - -@defun magit-insert-tags -Insert sections showing all tags. -@end defun - -@node Bisecting -@section Bisecting - -Also see -@ifinfo -@ref{git-bisect,,,gitman,}. -@end ifinfo -@ifhtml -@html -the <a href="http://git-scm.com/docs/git-bisect">git-bisect(1)</a> manpage. -@end html -@end ifhtml -@iftex -the git-bisect(1) manpage. -@end iftex - -@table @asis -@item @kbd{B} (@code{magit-bisect}) -@kindex B -@findex magit-bisect -This transient prefix command binds the following suffix commands -and displays them in a temporary buffer until a suffix is invoked. -@end table - -When bisecting is not in progress, then the transient features the -following suffix commands. - -@table @asis -@item @kbd{B B} (@code{magit-bisect-start}) -@kindex B B -@findex magit-bisect-start -Start a bisect session. - -Bisecting a bug means to find the commit that introduced it. -This command starts such a bisect session by asking for a known -good commit and a known bad commit. If you're bisecting a change -that isn't a regression, you can select alternate terms that are -conceptually more fitting than "bad" and "good", but the infix -arguments to do so are disabled by default. - -@item @kbd{B s} (@code{magit-bisect-run}) -@kindex B s -@findex magit-bisect-run -Bisect automatically by running commands after each step. -@end table - -When bisecting in progress, then the transient instead features the -following suffix commands. - -@table @asis -@item @kbd{B b} (@code{magit-bisect-bad}) -@kindex B b -@findex magit-bisect-bad -Mark the current commit as bad. Use this after you have asserted -that the commit does contain the bug in question. - -@item @kbd{B g} (@code{magit-bisect-good}) -@kindex B g -@findex magit-bisect-good -Mark the current commit as good. Use this after you have asserted -that the commit does not contain the bug in question. - -@item @kbd{B m} (@code{magit-bisect-mark}) -@kindex B m -@findex magit-bisect-mark -Mark the current commit with one of the bisect terms. This command -provides an alternative to @code{magit-bisect-bad} and -@code{magit-bisect-good} and is useful when using terms other than "bad" -and "good". This suffix is disabled by default. - -@item @kbd{B k} (@code{magit-bisect-skip}) -@kindex B k -@findex magit-bisect-skip -Skip the current commit. Use this if for some reason the current -commit is not a good one to test. This command lets Git choose a -different one. - -@item @kbd{B r} (@code{magit-bisect-reset}) -@kindex B r -@findex magit-bisect-reset -After bisecting, cleanup bisection state and return to original -@code{HEAD}. -@end table - -By default the status buffer shows information about the ongoing -bisect session. - -@defopt magit-bisect-show-graph -This option controls whether a graph is displayed for the log of -commits that still have to be bisected. -@end defopt - -@node Visiting Files and Blobs -@section Visiting Files and Blobs - -Magit provides several commands that visit a file or blob (the version -of a file that is stored in a certain commit). Actually it provides -several @strong{groups} of such commands and the several @strong{variants} within each -group. - -Also see @ref{Commands for Buffers Visiting Files}. - -@menu -* General-Purpose Visit Commands:: -* Visiting Files and Blobs from a Diff:: -@end menu - -@node General-Purpose Visit Commands -@subsection General-Purpose Visit Commands - -These commands can be used anywhere to open any blob. Currently no -keys are bound to these commands by default, but that is likely to -change. - -@deffn Command magit-find-file -This command reads a filename and revision from the user and visits -the respective blob in a buffer. The buffer is displayed in the -selected window. -@end deffn - -@deffn Command magit-find-file-other-window -This command reads a filename and revision from the user and visits -the respective blob in a buffer. The buffer is displayed in another -window. -@end deffn - -@deffn Command magit-find-file-other-frame -This command reads a filename and revision from the user and visits -the respective blob in a buffer. The buffer is displayed in another -frame. -@end deffn - -@node Visiting Files and Blobs from a Diff -@subsection Visiting Files and Blobs from a Diff - -These commands can only be used when point is inside a diff. - -@table @asis -@item @kbd{@key{RET}} (@code{magit-diff-visit-file}) -@kindex RET -@findex magit-diff-visit-file -This command visits the appropriate version of the file that the -diff at point is about. - -This commands visits the worktree version of the appropriate file. -The location of point inside the diff determines which file is being -visited. The visited version depends on what changes the diff is -about. - -@enumerate -@item -If the diff shows uncommitted changes (i.e., staged or unstaged -changes), then visit the file in the working tree (i.e., the -same "real" file that @code{find-file} would visit. In all other -cases visit a "blob" (i.e., the version of a file as stored -in some commit). - -@item -If point is on a removed line, then visit the blob for the -first parent of the commit that removed that line, i.e., the -last commit where that line still exists. - -@item -If point is on an added or context line, then visit the blob -that adds that line, or if the diff shows from more than a -single commit, then visit the blob from the last of these -commits. -@end enumerate - -In the file-visiting buffer this command goes to the line that -corresponds to the line that point is on in the diff. - -The buffer is displayed in the selected window. With a prefix -argument the buffer is displayed in another window instead. -@end table - -@defopt magit-diff-visit-previous-blob -This option controls whether @code{magit-diff-visit-file} may visit the -previous blob. When this is @code{t} (the default) and point is on a -removed line in a diff for a committed change, then -@code{magit-diff-visit-file} visits the blob from the last revision which -still had that line. - -Currently this is only supported for committed changes, for staged -and unstaged changes @code{magit-diff-visit-file} always visits the file in -the working tree. -@end defopt - -@table @asis -@item @kbd{C-<return>} (@code{magit-diff-visit-file-worktree}) -@kindex C-<return> -@findex magit-diff-visit-file-worktree -This command visits the worktree version of the appropriate file. -The location of point inside the diff determines which file is being -visited. Unlike @code{magit-diff-visit-file} it always visits the "real" -file in the working tree, i.e the "current version" of the file. - -In the file-visiting buffer this command goes to the line that -corresponds to the line that point is on in the diff. Lines that -were added or removed in the working tree, the index and other -commits in between are automatically accounted for. - -The buffer is displayed in the selected window. With a prefix -argument the buffer is displayed in another window instead. -@end table - -Variants of the above two commands exist that instead visit the file -in another window or in another frame. If you prefer such behavior, -then you may want to change the above key bindings, but note that the -above commands also use another window when invoked with a prefix -argument. - -@deffn Command magit-diff-visit-file-other-window -@end deffn -@deffn Command magit-diff-visit-file-other-frame -@end deffn -@deffn Command magit-diff-visit-worktree-file-other-window -@end deffn -@deffn Command magit-diff-visit-worktree-file-other-frame -@end deffn - -@node Blaming -@section Blaming - -Also see -@ifinfo -@ref{git-blame,,,gitman,}. -@end ifinfo -@ifhtml -@html -the <a href="http://git-scm.com/docs/git-blame">git-blame(1)</a> manpage. -@end html -@end ifhtml -@iftex -the git-blame(1) manpage. -@end iftex - -To start blaming, invoke the @code{magit-file-dispatch} transient prefix -command. When using the default key bindings, that can be done -by pressing @code{C-c M-g}. When using the recommended bindings, this -command is instead bound to @code{C-c f}. Also see @ref{Global Bindings}. - -The blaming suffix commands can be invoked directly from the file -dispatch transient. However if you want to set an infix argument, -then you have to enter the blaming sub-prefix first. - -@table @asis -@item @kbd{C-c f B} (@code{magit-blame}) -@itemx @kbd{C-c f b} (@code{magit-blame-addition}) -@itemx @kbd{C-c f B b} -@itemx @kbd{C-c f r} (@code{magit-blame-removal}) -@itemx @kbd{C-c f B r} -@itemx @kbd{C-c f f} (@code{magit-blame-reverse}) -@itemx @kbd{C-c f B f} -@itemx @kbd{C-c f e} (@code{magit-blame-echo}) -@itemx @kbd{C-c f B e} -@itemx @kbd{C-c f q} (@code{magit-blame-quit}) -@itemx @kbd{C-c f B q} -@kindex C-c f B -@kindex C-c f b -@kindex C-c f B b -@kindex C-c f r -@kindex C-c f B r -@kindex C-c f f -@kindex C-c f B f -@kindex C-c f e -@kindex C-c f B e -@kindex C-c f q -@kindex C-c f B q -@findex magit-blame -@findex magit-blame-addition -@findex magit-blame-removal -@findex magit-blame-reverse -@findex magit-blame-echo -@findex magit-blame-quit -Each of these commands is documented individually right below, -alongside their default key bindings. The bindings shown above -are the recommended bindings, which you can enable by following -the instructions in @ref{Global Bindings}. - -@item @kbd{C-c M-g B} (@code{magit-blame}) -@kindex C-c M-g B -@findex magit-blame -This transient prefix command binds the following suffix commands -along with the appropriate infix arguments and displays them in a -temporary buffer until a suffix is invoked. -@end table - -Note that not all of the following suffixes are available at all -times. For example if @code{magit-blame-mode} is not enabled, then the -command whose purpose is to turn off that mode would not be of any -use and therefore isn't available. - -@table @asis -@item @kbd{C-c M-g b} (@code{magit-blame-addition}) -@itemx @kbd{C-c M-g B b} -@kindex C-c M-g b -@kindex C-c M-g B b -@findex magit-blame-addition -This command augments each line or chunk of lines in the current -file-visiting or blob-visiting buffer with information about what -commits last touched these lines. - -If the buffer visits a revision of that file, then history up to -that revision is considered. Otherwise, the file's full history is -considered, including uncommitted changes. - -If Magit-Blame mode is already turned on in the current buffer then -blaming is done recursively, by visiting REVISION:FILE (using -@code{magit-find-file}), where REVISION is a parent of the revision that -added the current line or chunk of lines. - -@item @kbd{C-c M-g r} (@code{magit-blame-removal}) -@itemx @kbd{C-c M-g B r} -@kindex C-c M-g r -@kindex C-c M-g B r -@findex magit-blame-removal -This command augments each line or chunk of lines in the current -blob-visiting buffer with information about the revision that -removes it. It cannot be used in file-visiting buffers. - -Like @code{magit-blame-addition}, this command can be used recursively. - -@item @kbd{C-c M-g f} (@code{magit-blame-reverse}) -@itemx @kbd{C-c M-g B f} -@kindex C-c M-g f -@kindex C-c M-g B f -@findex magit-blame-reverse -This command augments each line or chunk of lines in the current -file-visiting or blob-visiting buffer with information about the -last revision in which a line still existed. - -Like @code{magit-blame-addition}, this command can be used recursively. - -@item @kbd{C-c M-g e} (@code{magit-blame-echo}) -@itemx @kbd{C-c M-g B e} -@kindex C-c M-g e -@kindex C-c M-g B e -@findex magit-blame-echo -This command is like @code{magit-blame-addition} except that it doesn't -turn on @code{read-only-mode} and that it initially uses the visualization -style specified by option @code{magit-blame-echo-style}. -@end table - -The following key bindings are available when Magit-Blame mode is -enabled and Read-Only mode is not enabled. These commands are also -available in other buffers; here only the behavior is described that -is relevant in file-visiting buffers that are being blamed. - -@table @asis -@item @kbd{C-c M-g q} (@code{magit-blame-quit}) -@itemx @kbd{C-c M-g B q} -@kindex C-c M-g q -@kindex C-c M-g B q -@findex magit-blame-quit -This command turns off Magit-Blame mode. If the buffer was created -during a recursive blame, then it also kills the buffer. - -@item @kbd{@key{RET}} (@code{magit-show-commit}) -@kindex RET -@findex magit-show-commit -This command shows the commit that last touched the line at point. - -@item @kbd{@key{SPC}} (@code{magit-diff-show-or-scroll-up}) -@kindex SPC -@findex magit-diff-show-or-scroll-up -This command updates the commit buffer. - -This either shows the commit that last touched the line at point in -the appropriate buffer, or if that buffer is already being displayed -in the current frame and if that buffer contains information about -that commit, then the buffer is scrolled up instead. - -@item @kbd{@key{DEL}} (@code{magit-diff-show-or-scroll-down}) -@kindex DEL -@findex magit-diff-show-or-scroll-down -This command updates the commit buffer. - -This either shows the commit that last touched the line at point in -the appropriate buffer, or if that buffer is already being displayed -in the current frame and if that buffer contains information about -that commit, then the buffer is scrolled down instead. -@end table - -The following key bindings are available when both Magit-Blame mode -and Read-Only mode are enabled. - -@table @asis -@item @kbd{b} (@code{magit-blame}) -@kindex b -@findex magit-blame -See above. - -@item @kbd{n} (@code{magit-blame-next-chunk}) -@kindex n -@findex magit-blame-next-chunk -This command moves to the next chunk. - -@item @kbd{N} (@code{magit-blame-next-chunk-same-commit}) -@kindex N -@findex magit-blame-next-chunk-same-commit -This command moves to the next chunk from the same commit. - -@item @kbd{p} (@code{magit-blame-previous-chunk}) -@kindex p -@findex magit-blame-previous-chunk -This command moves to the previous chunk. - -@item @kbd{P} (@code{magit-blame-previous-chunk-same-commit}) -@kindex P -@findex magit-blame-previous-chunk-same-commit -This command moves to the previous chunk from the same commit. - -@item @kbd{q} (@code{magit-blame-quit}) -@kindex q -@findex magit-blame-quit -This command turns off Magit-Blame mode. If the buffer was created -during a recursive blame, then it also kills the buffer. - -@item @kbd{M-w} (@code{magit-blame-copy-hash}) -@kindex M-w -@findex magit-blame-copy-hash -This command saves the hash of the current chunk's commit to the -kill ring. - -When the region is active, the command saves the region's content -instead of the hash, like @code{kill-ring-save} would. - -@item @kbd{c} (@code{magit-blame-cycle-style}) -@kindex c -@findex magit-blame-cycle-style -This command changes how blame information is visualized in the -current buffer by cycling through the styles specified using the -option @code{magit-blame-styles}. -@end table - -Blaming is also controlled using the following options. - -@defopt magit-blame-styles -This option defines a list of styles used to visualize blame -information. For now see its doc-string to learn more. -@end defopt - -@defopt magit-blame-echo-style -This option specifies the blame visualization style used by the -command @code{magit-blame-echo}. This must be a symbol that is used as the -identifier for one of the styles defined in @code{magit-blame-styles}. -@end defopt - -@defopt magit-blame-time-format -This option specifies the format string used to display times when -showing blame information. -@end defopt - -@defopt magit-blame-read-only -This option controls whether blaming a buffer also makes temporarily -read-only. -@end defopt - -@defopt magit-blame-disable-modes -This option lists incompatible minor-modes that should be disabled -temporarily when a buffer contains blame information. They are -enabled again when the buffer no longer shows blame information. -@end defopt - -@defopt magit-blame-goto-chunk-hook -This hook is run when moving between chunks. -@end defopt - -@node Manipulating -@chapter Manipulating - -@menu -* Creating Repository:: -* Cloning Repository:: -* Staging and Unstaging:: -* Applying:: -* Committing:: -* Branching:: -* Merging:: -* Resolving Conflicts:: -* Rebasing:: -* Cherry Picking:: -* Resetting:: -* Stashing:: -@end menu - -@node Creating Repository -@section Creating Repository - -@table @asis -@item @kbd{I} (@code{magit-init}) -@kindex I -@findex magit-init -This command initializes a repository and then shows the status -buffer for the new repository. - -If the directory is below an existing repository, then the user has -to confirm that a new one should be created inside. If the -directory is the root of the existing repository, then the user has -to confirm that it should be reinitialized. -@end table - -@node Cloning Repository -@section Cloning Repository - -To clone a remote or local repository use @code{C}, which is bound to the -command @code{magit-clone}. This command either act as a transient prefix -command, which binds several infix arguments and suffix commands, or -it can invoke @code{git clone} directly, depending on whether a prefix -argument is used and on the value of @code{magit-clone-always-transient}. - -@defopt magit-clone-always-transient -This option controls whether the command @code{magit-clone} always acts as -a transient prefix command, regardless of whether a prefix argument -is used or not. If @code{t}, then that command always acts as a transient -prefix. If @code{nil}, then a prefix argument has to be used for it to act -as a transient. -@end defopt - -@table @asis -@item @kbd{C} (@code{magit-clone}) -@kindex C -@findex magit-clone -This command either acts as a transient prefix command as described -above or does the same thing as @code{transient-clone-regular} as described -below. - -If it acts as a transient prefix, then it binds the following suffix -commands and several infix arguments. - -@item @kbd{C C} (@code{magit-clone-regular}) -@kindex C C -@findex magit-clone-regular -This command creates a regular clone of an existing repository. -The repository and the target directory are read from the user. - -@item @kbd{C s} (@code{magit-clone-shallow}) -@kindex C s -@findex magit-clone-shallow -This command creates a shallow clone of an existing repository. -The repository and the target directory are read from the user. -By default the depth of the cloned history is a single commit, -but with a prefix argument the depth is read from the user. - -@item @kbd{C >} (@code{magit-clone-sparse}) -@kindex C > -@findex magit-clone-sparse -This command creates a clone of an existing repository and -initializes a sparse checkout, avoiding a checkout of the full -working tree. To add more directories, use the -@code{magit-sparse-checkout} transient (see @ref{Sparse checkouts}). - -@item @kbd{C b} (@code{magit-clone-bare}) -@kindex C b -@findex magit-clone-bare -This command creates a bare clone of an existing repository. -The repository and the target directory are read from the user. - -@item @kbd{C m} (@code{magit-clone-mirror}) -@kindex C m -@findex magit-clone-mirror -This command creates a mirror of an existing repository. -The repository and the target directory are read from the user. -@end table - -The following suffixes are disabled by default. See -@ref{Enabling and Disabling Suffixes,,,transient,} for how to enable them. - -@table @asis -@item @kbd{C d} (@code{magit-clone-shallow-since}) -@kindex C d -@findex magit-clone-shallow-since -This command creates a shallow clone of an existing repository. -Only commits that were committed after a date are cloned, which -is read from the user. The repository and the target directory -are also read from the user. - -@item @kbd{C e} (@code{magit-clone-shallow-exclude}) -@kindex C e -@findex magit-clone-shallow-exclude -This command creates a shallow clone of an existing repository. -This reads a branch or tag from the user. Commits that are -reachable from that are not cloned. The repository and the target -directory are also read from the user. -@end table - -@defopt magit-clone-set-remote-head -This option controls whether cloning causes the reference -@code{refs/remotes/<remote>/HEAD} to be created in the clone. The default -is to delete the reference after running @code{git clone}, which insists on -creating it. This is because the reference has not been found to be -particularly useful as it is not automatically updated when the @code{HEAD} -of the remote changes. Setting this option to @code{t} preserves Git's -default behavior of creating the reference. -@end defopt - -@defopt magit-clone-set-remote.pushDefault -This option controls whether the value of the Git variable -@code{remote.pushDefault} is set after cloning. - -@itemize -@item -If @code{t}, then it is always set without asking. -@item -If @code{ask}, then the users are asked every time they clone a -repository. -@item -If @code{nil}, then it is never set. -@end itemize -@end defopt - -@defopt magit-clone-default-directory -This option control the default directory name used when reading the -destination for a cloning operation. - -@itemize -@item -If @code{nil} (the default), then the value of @code{default-directory} is used. -@item -If a directory, then that is used. -@item -If a function, then that is called with the remote url as the only -argument and the returned value is used. -@end itemize -@end defopt - -@defopt magit-clone-name-alist -This option maps regular expressions, which match repository names, -to repository urls, making it possible for users to enter short -names instead of urls when cloning repositories. - -Each element has the form @code{(REGEXP HOSTNAME USER)}. When the user -enters a name when a cloning command asks for a name or url, then -that is looked up in this list. The first element whose REGEXP -matches is used. - -The format specified by option @code{magit-clone-url-format} is used to -turn the name into an url, using HOSTNAME and the repository name. -If the provided name contains a slash, then that is used. Otherwise -if the name omits the owner of the repository, then the default user -specified in the matched entry is used. - -If USER contains a dot, then it is treated as a Git variable and the -value of that is used as the username. Otherwise it is used as the -username itself. -@end defopt - -@defopt magit-clone-url-format -The format specified by this option is used when turning repository -names into urls. @code{%h} is the hostname and @code{%n} is the repository -name, including the name of the owner. The value can be a string -(representing a single static format) or an alist with elements -@code{(HOSTNAME . FORMAT)} mapping hostnames to formats. When an alist -is used, the @code{t} key represents the default format. - -Example of a single format string: - -@lisp -(setq magit-clone-url-format - "git@@%h:%n.git") -@end lisp - -Example of by-hostname format strings: - -@lisp -(setq magit-clone-url-format - '(("git.example.com" . "git@@%h:~%n") - (nil . "git@@%h:%n.git"))) -@end lisp -@end defopt - -@defopt magit-post-clone-hook -Hook run after the Git process has successfully finished cloning the -repository. When the hook is called, @code{default-directory} is -let-bound to the directory where the repository has been cloned. -@end defopt - -@node Staging and Unstaging -@section Staging and Unstaging - -Like Git, Magit can of course stage and unstage complete files. -Unlike Git, it also allows users to gracefully un-/stage -individual hunks and even just part of a hunk. To stage individual -hunks and parts of hunks using Git directly, one has to use the very -modal and rather clumsy interface of a @code{git add --interactive} session. - -With Magit, on the other hand, one can un-/stage individual hunks by -just moving point into the respective section inside a diff displayed -in the status buffer or a separate diff buffer and typing @code{s} or @code{u}. To -operate on just parts of a hunk, mark the changes that should be -un-/staged using the region and then press the same key that would be -used to un-/stage. To stage multiple files or hunks at once use a -region that starts inside the heading of such a section and ends -inside the heading of a sibling section of the same type. - -Besides staging and unstaging, Magit also provides several other -"apply variants" that can also operate on a file, multiple files at -once, a hunk, multiple hunks at once, and on parts of a hunk. These -apply variants are described in the next section. - -You can also use Ediff to stage and unstage. See @ref{Ediffing}. - -@table @asis -@item @kbd{s} (@code{magit-stage}) -@kindex s -@findex magit-stage -Add the change at point to the staging area. - -With a prefix argument and an untracked file (or files) at point, -stage the file but not its content. This makes it possible to stage -only a subset of the new file's changes. - -@item @kbd{S} (@code{magit-stage-modified}) -@kindex S -@findex magit-stage-modified -Stage all changes to files modified in the worktree. Stage all new -content of tracked files and remove tracked files that no longer -exist in the working tree from the index also. With a prefix -argument also stage previously untracked (but not ignored) files. - -@item @kbd{u} (@code{magit-unstage}) -@kindex u -@findex magit-unstage -Remove the change at point from the staging area. - -Only staged changes can be unstaged. But by default this command -performs an action that is somewhat similar to unstaging, when it is -called on a committed change: it reverses the change in the index -but not in the working tree. - -@item @kbd{U} (@code{magit-unstage-all}) -@kindex U -@findex magit-unstage-all -Remove all changes from the staging area. -@end table - -@defopt magit-unstage-committed -This option controls whether @code{magit-unstage} "unstages" committed -changes by reversing them in the index but not the working tree. -The alternative is to raise an error. -@end defopt - -@table @asis -@item @kbd{M-x magit-reverse-in-index} -@findex magit-reverse-in-index -This command reverses the committed change at point in the index but -not the working tree. By default no key is bound directly to this -command, but it is indirectly called when @code{u} (@code{magit-unstage}) is -pressed on a committed change. - -This allows extracting a change from @code{HEAD}, while leaving it in the -working tree, so that it can later be committed using a separate -commit. A typical workflow would be: - -@enumerate -@item -Optionally make sure that there are no uncommitted changes. -@item -Visit the @code{HEAD} commit and navigate to the change that should -not have been included in that commit. -@item -Type @code{u} (@code{magit-unstage}) to reverse it in the index. -This assumes that @code{magit-unstage-committed} is non-nil. -@item -Type @code{c e} to extend @code{HEAD} with the staged changes, -including those that were already staged before. -@item -Optionally stage the remaining changes using @code{s} or @code{S} and then -type @code{c c} to create a new commit. -@end enumerate - -@item @kbd{M-x magit-reset-index} -@findex magit-reset-index -Reset the index to some commit. The commit is read from the user -and defaults to the commit at point. If there is no commit at -point, then it defaults to @code{HEAD}. -@end table - -@menu -* Staging from File-Visiting Buffers:: -@end menu - -@node Staging from File-Visiting Buffers -@subsection Staging from File-Visiting Buffers - -Fine-grained un-/staging has to be done from the status or a diff -buffer, but it's also possible to un-/stage all changes made to the -file visited in the current buffer right from inside that buffer. - -@table @asis -@item @kbd{M-x magit-stage-file} -@findex magit-stage-file -When invoked inside a file-visiting buffer, then stage all changes -to that file. In a Magit buffer, stage the file at point if any. -Otherwise prompt for a file to be staged. With a prefix argument -always prompt the user for a file, even in a file-visiting buffer or -when there is a file section at point. - -@item @kbd{M-x magit-unstage-file} -@findex magit-unstage-file -When invoked inside a file-visiting buffer, then unstage all changes -to that file. In a Magit buffer, unstage the file at point if any. -Otherwise prompt for a file to be unstaged. With a prefix argument -always prompt the user for a file, even in a file-visiting buffer or -when there is a file section at point. -@end table - -@node Applying -@section Applying - -Magit provides several "apply variants": stage, unstage, discard, -reverse, and "regular apply". At least when operating on a hunk they -are all implemented using @code{git apply}, which is why they are called -"apply variants". - -@itemize -@item -Stage. Apply a change from the working tree to the index. The change -also remains in the working tree. - -@item -Unstage. Remove a change from the index. The change remains in the -working tree. - -@item -Discard. On a staged change, remove it from the working tree and the -index. On an unstaged change, remove it from the working tree only. - -@item -Reverse. Reverse a change in the working tree. Both committed and -staged changes can be reversed. Unstaged changes cannot be -reversed. Discard them instead. - -@item -Apply. Apply a change to the working tree. Both committed and staged -changes can be applied. Unstaged changes cannot be applied - as -they already have been applied. -@end itemize - -The previous section described the staging and unstaging commands. -What follows are the commands which implement the remaining apply -variants. - -@table @asis -@item @kbd{a} (@code{magit-apply}) -@kindex a -@findex magit-apply -Apply the change at point to the working tree. - -With a prefix argument fallback to a 3-way merge. Doing so causes -the change to be applied to the index as well. - -@item @kbd{k} (@code{magit-discard}) -@kindex k -@findex magit-discard -Remove the change at point from the working tree. - -On a hunk or file with unresolved conflicts prompt which side to -keep (while discarding the other). If point is within the text -of a side, then keep that side without prompting. - -@item @kbd{v} (@code{magit-reverse}) -@kindex v -@findex magit-reverse -Reverse the change at point in the working tree. - -With a prefix argument fallback to a 3-way merge. Doing so causes -the change to be applied to the index as well. -@end table - -With a prefix argument all apply variants attempt a 3-way merge when -appropriate (i.e., when @code{git apply} is used internally). - -@node Committing -@section Committing - -When the user initiates a commit, Magit calls @code{git commit} without any -arguments, so Git has to get it from the user. It creates the file -@code{.git/COMMIT_EDITMSG} and then opens that file in an editor. Magit -arranges for that editor to be the Emacsclient. Once the user -finishes the editing session, the Emacsclient exits and Git creates the -commit using the file's content as message. - -@menu -* Initiating a Commit:: -* Editing Commit Messages:: -@end menu - -@node Initiating a Commit -@subsection Initiating a Commit - -Also see -@ifinfo -@ref{git-commit,,,gitman,}. -@end ifinfo -@ifhtml -@html -the <a href="http://git-scm.com/docs/git-commit">git-commit(1)</a> manpage. -@end html -@end ifhtml -@iftex -the git-commit(1) manpage. -@end iftex - -@table @asis -@item @kbd{c} (@code{magit-commit}) -@kindex c -@findex magit-commit -This transient prefix command binds the following suffix commands -along with the appropriate infix arguments and displays them in a -temporary buffer until a suffix is invoked. - -@item @kbd{c c} (@code{magit-commit-create}) -@kindex c c -@findex magit-commit-create -Create a new commit on @code{HEAD}. With a prefix argument amend to the -commit at @code{HEAD} instead. - -@item @kbd{c a} (@code{magit-commit-amend}) -@kindex c a -@findex magit-commit-amend -Amend the last commit. - -@item @kbd{c e} (@code{magit-commit-extend}) -@kindex c e -@findex magit-commit-extend -Amend the last commit, without editing the message. With a prefix -argument keep the committer date, otherwise change it. The option -@code{magit-commit-extend-override-date} can be used to inverse the meaning -of the prefix argument. - -Non-interactively respect the optional OVERRIDE-DATE argument and -ignore the option. - -@item @kbd{c w} (@code{magit-commit-reword}) -@kindex c w -@findex magit-commit-reword -Reword the last commit, ignoring staged changes. With a prefix -argument keep the committer date, otherwise change it. The option -@code{magit-commit-reword-override-date} can be used to inverse the meaning -of the prefix argument. - -Non-interactively respect the optional OVERRIDE-DATE argument and -ignore the option. - -@item @kbd{c f} (@code{magit-commit-fixup}) -@kindex c f -@findex magit-commit-fixup -Create a fixup commit. - -With a prefix argument the target commit has to be confirmed. -Otherwise the commit at point may be used without confirmation -depending on the value of option @code{magit-commit-squash-confirm}. - -@item @kbd{c F} (@code{magit-commit-instant-fixup}) -@kindex c F -@findex magit-commit-instant-fixup -Create a fixup commit and instantly rebase. - -@item @kbd{c s} (@code{magit-commit-squash}) -@kindex c s -@findex magit-commit-squash -Create a squash commit, without editing the squash message. - -With a prefix argument the target commit has to be confirmed. -Otherwise the commit at point may be used without confirmation -depending on the value of option @code{magit-commit-squash-confirm}. - -@item @kbd{c S} (@code{magit-commit-instant-squash}) -@kindex c S -@findex magit-commit-instant-squash -Create a squash commit and instantly rebase. - -@item @kbd{c A} (@code{magit-commit-augment}) -@kindex c A -@findex magit-commit-augment -Create a squash commit, editing the squash message. - -With a prefix argument the target commit has to be confirmed. -Otherwise the commit at point may be used without confirmation -depending on the value of option @code{magit-commit-squash-confirm}. -@end table - -@defopt magit-commit-ask-to-stage -Whether to ask to stage all unstaged changes when committing and nothing is -staged. -@end defopt - -@defopt magit-commit-show-diff -Whether the relevant diff is automatically shown when committing. -@end defopt - -@defopt magit-commit-extend-override-date -Whether using @code{magit-commit-extend} changes the committer date. -@end defopt - -@defopt magit-commit-reword-override-date -Whether using @code{magit-commit-reword} changes the committer date. -@end defopt - -@defopt magit-commit-squash-confirm -Whether the commit targeted by squash and fixup has to be confirmed. -When non-nil then the commit at point (if any) is used as default -choice. Otherwise it has to be confirmed. This option only affects -@code{magit-commit-squash} and @code{magit-commit-fixup}. The "instant" variants -always require confirmation because making an error while using -those is harder to recover from. -@end defopt - -@defopt magit-post-commit-hook -Hook run after creating a commit without the user editing a message. - -This hook is run by @code{magit-refresh} if @code{this-command} is a member -of @code{magit-post-commit-hook-commands}. This only includes commands -named @code{magit-commit-*} that do @strong{not} require that the user edits -the commit message in a buffer. - -Also see @code{git-commit-post-finish-hook}. -@end defopt - -@defopt magit-commit-diff-inhibit-same-window -Whether to inhibit use of same window when showing diff while -committing. - -When writing a commit, then a diff of the changes to be committed -is automatically shown. The idea is that the diff is shown in a -different window of the same frame and for most users that just -works. In other words most users can completely ignore this -option because its value doesn't make a difference for them. - -However for users who configured Emacs to never create a new -window even when the package explicitly tries to do so, then -displaying two new buffers necessarily means that the first is -immediately replaced by the second. In our case the message -buffer is immediately replaced by the diff buffer, which is of -course highly undesirable. - -A workaround is to suppress this user configuration in this -particular case. Users have to explicitly opt-in by toggling -this option. We cannot enable the workaround unconditionally -because that again causes issues for other users: if the frame -is too tiny or the relevant settings too aggressive, then the -diff buffer would end up being displayed in a new frame. - -Also see @uref{https://github.com/magit/magit/issues/4132}. -@end defopt - -@node Editing Commit Messages -@subsection Editing Commit Messages - -After initiating a commit as described in the previous section, two new -buffers appear. One shows the changes that are about to be committed, -while the other is used to write the message. - -Commit messages are edited in an edit session - in the background @code{git} -is waiting for the editor, in our case @code{emacsclient}, to save the commit -message in a file (in most cases @code{.git/COMMIT_EDITMSG}) and then return. -If the editor returns with a non-zero exit status then @code{git} does not -create the commit. So the most important commands are those for -finishing and aborting the commit. - -@table @asis -@item @kbd{C-c C-c} (@code{with-editor-finish}) -@kindex C-c C-c -@findex with-editor-finish -Finish the current editing session by returning with exit code 0. -Git then creates the commit using the message it finds in the file. - -@item @kbd{C-c C-k} (@code{with-editor-cancel}) -@kindex C-c C-k -@findex with-editor-cancel -Cancel the current editing session by returning with exit code 1. -Git then cancels the commit, but leaves the file untouched. -@end table - -In addition to being used by @code{git commit}, messages may also be stored -in a ring that persists until Emacs is closed. By default the message -is stored at the beginning and the end of an edit session (regardless -of whether the session is finished successfully or was canceled). It -is sometimes useful to bring back messages from that ring. - -@table @asis -@item @kbd{C-c M-s} (@code{git-commit-save-message}) -@kindex C-c M-s -@findex git-commit-save-message -Save the current buffer content to the commit message ring. - -@item @kbd{M-p} (@code{git-commit-prev-message}) -@kindex M-p -@findex git-commit-prev-message -Cycle backward through the commit message ring, after saving the -current message to the ring. With a numeric prefix ARG, go back -ARG comments. - -@item @kbd{M-n} (@code{git-commit-next-message}) -@kindex M-n -@findex git-commit-next-message -Cycle forward through the commit message ring, after saving the -current message to the ring. With a numeric prefix ARG, go back -ARG comments. -@end table - -By default the diff for the changes that are about to be committed are -automatically shown when invoking the commit. To prevent that, remove -@code{magit-commit-diff} from @code{server-switch-hook}. - -When amending to an existing commit it may be useful to show either -the changes that are about to be added to that commit or to show those -changes alongside those that have already been committed. - -@table @asis -@item @kbd{C-c C-d} (@code{magit-diff-while-committing}) -@kindex C-c C-d -@findex magit-diff-while-committing -While committing, show the changes that are about to be committed. -While amending, invoking the command again toggles between showing -just the new changes or all the changes that will be committed. -@end table - -@menu -* Using the Revision Stack:: -* Commit Pseudo Headers:: -* Commit Mode and Hooks:: -* Commit Message Conventions:: -@end menu - -@node Using the Revision Stack -@unnumberedsubsubsec Using the Revision Stack - -@table @asis -@item @kbd{C-c C-w} (@code{magit-pop-revision-stack}) -@kindex C-c C-w -@findex magit-pop-revision-stack -This command inserts a representation of a revision into the current -buffer. It can be used inside buffers used to write commit messages -but also in other buffers such as buffers used to edit emails or -ChangeLog files. - -By default this command pops the revision which was last added to -the @code{magit-revision-stack} and inserts it into the current buffer -according to @code{magit-pop-revision-stack-format}. Revisions can be put -on the stack using @code{magit-copy-section-value} and -@code{magit-copy-buffer-revision}. - -If the stack is empty or with a prefix argument it instead reads a -revision in the minibuffer. By using the minibuffer history this -allows selecting an item which was popped earlier or to insert an -arbitrary reference or revision without first pushing it onto the -stack. - -When reading the revision from the minibuffer, then it might not -be possible to guess the correct repository. When this command -is called inside a repository (e.g., while composing a commit -message), then that repository is used. Otherwise (e.g., while -composing an email) then the repository recorded for the top -element of the stack is used (even though we insert another -revision). If not called inside a repository and with an empty -stack, or with two prefix arguments, then read the repository in -the minibuffer too. -@end table - -@defopt magit-pop-revision-stack-format -This option controls how the command @code{magit-pop-revision-stack} -inserts a revision into the current buffer. - -The entries on the stack have the format @code{(HASH TOPLEVEL)} and this -option has the format @code{(POINT-FORMAT EOB-FORMAT INDEX-REGEXP)}, all -of which may be nil or a string (though either one of EOB-FORMAT -or POINT-FORMAT should be a string, and if INDEX-REGEXP is -non-nil, then the two formats should be too). - -First INDEX-REGEXP is used to find the previously inserted entry, -by searching backward from point. The first submatch must match -the index number. That number is incremented by one, and becomes -the index number of the entry to be inserted. If you don't want -to number the inserted revisions, then use nil for INDEX-REGEXP@. - -If INDEX-REGEXP is non-nil then both POINT-FORMAT and EOB-FORMAT -should contain \"%N\", which is replaced with the number that was -determined in the previous step. - -Both formats, if non-nil and after removing %N, are then expanded -using @code{git show --format=FORMAT ...} inside TOPLEVEL@. - -The expansion of POINT-FORMAT is inserted at point, and the -expansion of EOB-FORMAT is inserted at the end of the buffer (if the -buffer ends with a comment, then it is inserted right before that). -@end defopt - -@node Commit Pseudo Headers -@unnumberedsubsubsec Commit Pseudo Headers - -Some projects use pseudo headers in commit messages. Magit colorizes -such headers and provides some commands to insert such headers. - -@defopt git-commit-known-pseudo-headers -A list of Git pseudo headers to be highlighted. -@end defopt - -@table @asis -@item @kbd{C-c C-i} (@code{git-commit-insert-pseudo-header}) -@kindex C-c C-i -@findex git-commit-insert-pseudo-header -Insert a commit message pseudo header. - -@item @kbd{C-c C-a} (@code{git-commit-ack}) -@kindex C-c C-a -@findex git-commit-ack -Insert a header acknowledging that you have looked at the commit. - -@item @kbd{C-c C-r} (@code{git-commit-review}) -@kindex C-c C-r -@findex git-commit-review -Insert a header acknowledging that you have reviewed the commit. - -@item @kbd{C-c C-s} (@code{git-commit-signoff}) -@kindex C-c C-s -@findex git-commit-signoff -Insert a header to sign off the commit. - -@item @kbd{C-c C-t} (@code{git-commit-test}) -@kindex C-c C-t -@findex git-commit-test -Insert a header acknowledging that you have tested the commit. - -@item @kbd{C-c C-o} (@code{git-commit-cc}) -@kindex C-c C-o -@findex git-commit-cc -Insert a header mentioning someone who might be interested. - -@item @kbd{C-c C-p} (@code{git-commit-reported}) -@kindex C-c C-p -@findex git-commit-reported -Insert a header mentioning the person who reported the issue being -fixed by the commit. - -@item @kbd{C-c M-i} (@code{git-commit-suggested}) -@kindex C-c M-i -@findex git-commit-suggested -Insert a header mentioning the person who suggested the change. -@end table - -@node Commit Mode and Hooks -@unnumberedsubsubsec Commit Mode and Hooks - -@code{git-commit-mode} is a minor mode that is only used to establish certain -key bindings. This makes it possible to use an arbitrary major mode -in buffers used to edit commit messages. It is even possible to use -different major modes in different repositories, which is useful when -different projects impose different commit message conventions. - -@defopt git-commit-major-mode -The value of this option is the major mode used to edit Git commit -messages. -@end defopt - -Because @code{git-commit-mode} is a minor mode, we don't use its mode hook -to setup the buffer, except for the key bindings. All other setup -happens in the function @code{git-commit-setup}, which among other things runs -the hook @code{git-commit-setup-hook}. - -@defopt git-commit-setup-hook -Hook run at the end of @code{git-commit-setup}. -@end defopt - -@noindent -The following functions are suitable for this hook: - -@defun git-commit-save-message -Save the current buffer content to the commit message ring. -@end defun - -@defun git-commit-setup-changelog-support -After this function is called, ChangeLog entries are treated as -paragraphs. -@end defun - -@defun git-commit-turn-on-auto-fill -Turn on @code{auto-fill-mode}. -@end defun - -@defun git-commit-turn-on-flyspell -Turn on Flyspell mode. Also prevent comments from being checked and -finally check current non-comment text. -@end defun - -@defun git-commit-propertize-diff -Propertize the diff shown inside the commit message buffer. Git -inserts such diffs into the commit message template when the -@code{--verbose} argument is used. @code{magit-commit} by default does not offer -that argument because the diff that is shown in a separate buffer is -more useful. But some users disagree, which is why this function -exists. -@end defun - -@defun bug-reference-mode -Hyperlink bug references in the buffer. -@end defun - -@defun with-editor-usage-message -Show usage information in the echo area. -@end defun - -@defopt git-commit-post-finish-hook -Hook run after the user finished writing a commit message. - -This hook is only run after pressing @code{C-c C-c} in a buffer used to -edit a commit message. If a commit is created without the user -typing a message into a buffer, then this hook is not run. - -This hook is not run until the new commit has been created. If -doing so takes Git longer than one second, then this hook isn't run -at all. For certain commands such as @code{magit-rebase-continue} this -hook is never run because doing so would lead to a race condition. - -This hook is only run if @code{magit} is available. - -Also see @code{magit-post-commit-hook}. -@end defopt - -@node Commit Message Conventions -@unnumberedsubsubsec Commit Message Conventions - -Git-Commit highlights certain violations of commonly accepted commit -message conventions. Certain violations even cause Git-Commit to ask -you to confirm that you really want to do that. This nagging can of -course be turned off, but the result of doing that usually is that -instead of some code it's now the human who is reviewing your commits -who has to waste some time telling you to fix your commits. - -@defopt git-commit-summary-max-length -The intended maximal length of the summary line of commit messages. -Characters beyond this column are colorized to indicate that this -preference has been violated. -@end defopt - -@defopt git-commit-finish-query-functions -List of functions called to query before performing commit. - -The commit message buffer is current while the functions are called. -If any of them returns nil, then the commit is not performed and the -buffer is not killed. The user should then fix the issue and try -again. - -The functions are called with one argument. If it is non-nil then -that indicates that the user used a prefix argument to force -finishing the session despite issues. Functions should usually -honor this wish and return non-nil. - -By default the only member is @code{git-commit-check-style-conventions}. -@end defopt - -@defun git-commit-check-style-conventions -This function checks for violations of certain basic style -conventions. For each violation it asks users if they want to -proceed anyway. -@end defun - -@defopt git-commit-style-convention-checks -This option controls what conventions the function by the same name -tries to enforce. The value is a list of self-explanatory symbols -identifying certain conventions; @code{non-empty-second-line} and -@code{overlong-summary-line}. -@end defopt - -@node Branching -@section Branching - -@menu -* The Two Remotes:: -* Branch Commands:: -* Branch Git Variables:: -* Auxiliary Branch Commands:: -@end menu - -@node The Two Remotes -@subsection The Two Remotes - -The upstream branch of some local branch is the branch into which the -commits on that local branch should eventually be merged, usually -something like @code{origin/master}. For the @code{master} branch itself the -upstream branch and the branch it is being pushed to, are usually the -same remote branch. But for a feature branch the upstream branch and -the branch it is being pushed to should differ. - -The commits on feature branches too should @emph{eventually} end up in a -remote branch such as @code{origin/master} or @code{origin/maint}. Such a branch -should therefore be used as the upstream. But feature branches -shouldn't be pushed directly to such branches. Instead a feature -branch @code{my-feature} is usually pushed to @code{my-fork/my-feature} or if you -are a contributor @code{origin/my-feature}. After the new feature has been -reviewed, the maintainer merges the feature into @code{master}. And finally -@code{master} (not @code{my-feature} itself) is pushed to @code{origin/master}. - -But new features seldom are perfect on the first try, and so feature -branches usually have to be reviewed, improved, and re-pushed several -times. Pushing should therefore be easy to do, and for that reason -many Git users have concluded that it is best to use the remote branch -to which the local feature branch is being pushed as its upstream. - -But luckily Git has long ago gained support for a push-remote which -can be configured separately from the upstream branch, using the -variables @code{branch.<name>.pushRemote} and @code{remote.pushDefault}. So we no -longer have to choose which of the two remotes should be used as "the -remote". - -Each of the fetching, pulling, and pushing transient commands features -three suffix commands that act on the current branch and some other -branch. Of these, @code{p} is bound to a command which acts on the -push-remote, @code{u} is bound to a command which acts on the upstream, and @code{e} -is bound to a command which acts on any other branch. The status -buffer shows unpushed and unpulled commits for both the push-remote -and the upstream. - -It's fairly simple to configure these two remotes. The values of all -the variables that are related to fetching, pulling, and pushing (as -well as some other branch-related variables) can be inspected and -changed using the command @code{magit-branch-configure}, which is available -from many transient prefix commands that deal with branches. It is -also possible to set the push-remote or upstream while pushing (see -@ref{Pushing}). - -@node Branch Commands -@subsection Branch Commands - -The transient prefix command @code{magit-branch} is used to create and -checkout branches, and to make changes to existing branches. It is -not used to fetch, pull, merge, rebase, or push branches, i.e., this -command deals with branches themselves, not with the commits reachable -from them. Those features are available from separate transient -command. - -@table @asis -@item @kbd{b} (@code{magit-branch}) -@kindex b -@findex magit-branch -This transient prefix command binds the following suffix commands -and displays them in a temporary buffer until a suffix is invoked. - -By default it also binds and displays the values of some -branch-related Git variables and allows changing their values. -@end table - -@defopt magit-branch-direct-configure -This option controls whether the transient command @code{magit-branch} can -be used to directly change the values of Git variables. This defaults -to @code{t} (to avoid changing key bindings). When set to @code{nil}, then no -variables are displayed by that transient command, and its suffix -command @code{magit-branch-configure} has to be used instead to view and -change branch related variables. -@end defopt - -@table @asis -@item @kbd{b C} (@code{magit-branch-configure}) -@itemx @kbd{f C} -@itemx @kbd{F C} -@itemx @kbd{P C} -@kindex b C -@kindex f C -@kindex F C -@kindex P C -@findex magit-branch-configure -This transient prefix command binds commands that set the value of -branch-related variables and displays them in a temporary buffer -until the transient is exited. - -With a prefix argument, this command always prompts for a branch. - -Without a prefix argument this depends on whether it was invoked as -a suffix of @code{magit-branch} and on the @code{magit-branch-direct-configure} -option. If @code{magit-branch} already displays the variables for the -current branch, then it isn't useful to invoke another transient -that displays them for the same branch. In that case this command -prompts for a branch. -@end table - -The variables are described in @ref{Branch Git Variables}. - -@table @asis -@item @kbd{b b} (@code{magit-checkout}) -@kindex b b -@findex magit-checkout -Checkout a revision read in the minibuffer and defaulting to the -branch or arbitrary revision at point. If the revision is a local -branch then that becomes the current branch. If it is something -else then @code{HEAD} becomes detached. Checkout fails if the working tree -or the staging area contain changes. - -@item @kbd{b n} (@code{magit-branch-create}) -@kindex b n -@findex magit-branch-create -Create a new branch. The user is asked for a branch or arbitrary -revision to use as the starting point of the new branch. When a -branch name is provided, then that becomes the upstream branch of -the new branch. The name of the new branch is also read in the -minibuffer. - -Also see option @code{magit-branch-prefer-remote-upstream}. - -@item @kbd{b c} (@code{magit-branch-and-checkout}) -@kindex b c -@findex magit-branch-and-checkout -This command creates a new branch like @code{magit-branch-create}, but then -also checks it out. - -Also see option @code{magit-branch-prefer-remote-upstream}. - -@item @kbd{b l} (@code{magit-branch-checkout}) -@kindex b l -@findex magit-branch-checkout -This command checks out an existing or new local branch. It reads a -branch name from the user offering all local branches and a subset -of remote branches as candidates. Remote branches for which a local -branch by the same name exists are omitted from the list of -candidates. The user can also enter a completely new branch name. - -@itemize -@item -If the user selects an existing local branch, then that is checked -out. - -@item -If the user selects a remote branch, then it creates and checks -out a new local branch with the same name, and configures the -selected remote branch as the push target. - -@item -If the user enters a new branch name, then it creates and checks -that out, after also reading the starting-point from the user. -@end itemize - -In the latter two cases the upstream is also set. Whether it is set -to the chosen starting point or something else depends on the value -of @code{magit-branch-adjust-remote-upstream-alist}. - -@item @kbd{b s} (@code{magit-branch-spinoff}) -@kindex b s -@findex magit-branch-spinoff -This command creates and checks out a new branch starting at and -tracking the current branch. That branch in turn is reset to the -last commit it shares with its upstream. If the current branch has -no upstream or no unpushed commits, then the new branch is created -anyway and the previously current branch is not touched. - -This is useful to create a feature branch after work has already -began on the old branch (likely but not necessarily "master"). - -If the current branch is a member of the value of option -@code{magit-branch-prefer-remote-upstream} (which see), then the current -branch will be used as the starting point as usual, but the upstream -of the starting-point may be used as the upstream of the new branch, -instead of the starting-point itself. - -If optional FROM is non-nil, then the source branch is reset -to @code{FROM~}, instead of to the last commit it shares with its -upstream. Interactively, FROM is only ever non-nil, if the -region selects some commits, and among those commits, FROM is -the commit that is the fewest commits ahead of the source -branch. - -The commit at the other end of the selection actually does not -matter, all commits between FROM and @code{HEAD} are moved to the new -branch. If FROM is not reachable from @code{HEAD} or is reachable from the -source branch's upstream, then an error is raised. - -@item @kbd{b S} (@code{magit-branch-spinout}) -@kindex b S -@findex magit-branch-spinout -This command behaves like @code{magit-branch-spinoff}, except that it does -not change the current branch. If there are any uncommitted changes, -then it behaves exactly like @code{magit-branch-spinoff}. - -@item @kbd{b x} (@code{magit-branch-reset}) -@kindex b x -@findex magit-branch-reset -This command resets a branch, defaulting to the branch at point, to -the tip of another branch or any other commit. - -When the branch being reset is the current branch, then a hard reset -is performed. If there are any uncommitted changes, then the user -has to confirm the reset because those changes would be lost. - -This is useful when you have started work on a feature branch but -realize it's all crap and want to start over. - -When resetting to another branch and a prefix argument is used, then -the target branch is set as the upstream of the branch that is being -reset. - -@item @kbd{b k} (@code{magit-branch-delete}) -@kindex b k -@findex magit-branch-delete -Delete one or multiple branches. If the region marks multiple -branches, then offer to delete those. Otherwise, prompt for a single -branch to be deleted, defaulting to the branch at point. - -Require confirmation when deleting branches is dangerous in some -way. Option @code{magit-no-confirm} can be customized to not require -confirmation in certain cases. See its docstring to learn why -confirmation is required by default in certain cases or if a -prompt is confusing. - -@item @kbd{b m} (@code{magit-branch-rename}) -@kindex b m -@findex magit-branch-rename -Rename a branch. The branch and the new name are read in the -minibuffer. With prefix argument the branch is renamed even if that -name conflicts with an existing branch. -@end table - -@defopt magit-branch-read-upstream-first -When creating a branch, whether to read the upstream branch before -the name of the branch that is to be created. The default is @code{t}, -and I recommend you leave it at that. -@end defopt - -@defopt magit-branch-prefer-remote-upstream -This option specifies whether remote upstreams are favored over -local upstreams when creating new branches. - -When a new branch is created, then the branch, commit, or stash at -point is suggested as the starting point of the new branch, or if -there is no such revision at point the current branch. In either -case the user may choose another starting point. - -If the chosen starting point is a branch, then it may also be set -as the upstream of the new branch, depending on the value of the -Git variable `branch.autoSetupMerge'. By default this is done -for remote branches, but not for local branches. - -You might prefer to always use some remote branch as upstream. -If the chosen starting point is (1) a local branch, (2) whose -name matches a member of the value of this option, (3) the -upstream of that local branch is a remote branch with the same -name, and (4) that remote branch can be fast-forwarded to the -local branch, then the chosen branch is used as starting point, -but its own upstream is used as the upstream of the new branch. - -Members of this option's value are treated as branch names that -have to match exactly unless they contain a character that makes -them invalid as a branch name. Recommended characters to use -to trigger interpretation as a regexp are "*" and "^". Some -other characters which you might expect to be invalid, actually -are not, e.g., ".+$" are all perfectly valid. More precisely, -if @code{git check-ref-format --branch STRING} exits with a non-zero -status, then treat STRING as a regexp. - -Assuming the chosen branch matches these conditions you would end -up with with e.g.: - -@example -feature --upstream--> origin/master -@end example - -instead of - -@example -feature --upstream--> master --upstream--> origin/master -@end example - -Which you prefer is a matter of personal preference. If you do -prefer the former, then you should add branches such as @code{master}, -@code{next}, and @code{maint} to the value of this options. -@end defopt - -@defopt magit-branch-adjust-remote-upstream-alist -The value of this option is an alist of branches to be used as -the upstream when branching a remote branch. - -When creating a local branch from an ephemeral branch located on a -remote, e.g., a feature or hotfix branch, then that remote branch -should usually not be used as the upstream branch, since the -push-remote already allows accessing it and having both the upstream -and the push-remote reference the same related branch would be -wasteful. Instead a branch like "maint" or "master" should be used -as the upstream. - -This option allows specifying the branch that should be used as the -upstream when branching certain remote branches. The value is an -alist of the form @code{((UPSTREAM . RULE)...)}. The first matching -element is used, the following elements are ignored. - -UPSTREAM is the branch to be used as the upstream for branches -specified by RULE@. It can be a local or a remote branch. - -RULE can either be a regular expression, matching branches whose -upstream should be the one specified by UPSTREAM@. Or it can be a -list of the only branches that should @strong{not} use UPSTREAM; all other -branches will. Matching is done after stripping the remote part of -the name of the branch that is being branched from. - -If you use a finite set of non-ephemeral branches across all your -repositories, then you might use something like: - -@lisp -(("origin/master" . ("master" "next" "maint"))) -@end lisp - -Or if the names of all your ephemeral branches contain a slash, -at least in some repositories, then a good value could be: - -@lisp -(("origin/master" . "/")) -@end lisp - -Of course you can also fine-tune: - -@lisp -(("origin/maint" . "\\`hotfix/") - ("origin/master" . "\\`feature/")) -@end lisp - -UPSTREAM can be a local branch: - -@lisp -(("master" . ("master" "next" "maint"))) -@end lisp -@end defopt - -Because the main branch is no longer almost always named "master" -you should also account for other common names: - -@lisp -(("main" . ("main" "master" "next" "maint")) - ("master" . ("main" "master" "next" "maint"))) -@end lisp - -@deffn Command magit-branch-orphan -This command creates and checks out a new orphan branch with -contents from a given revision. -@end deffn - -@deffn Command magit-branch-or-checkout -This command is a hybrid between @code{magit-checkout} and -@code{magit-branch-and-checkout} and is intended as a replacement for the -former in @code{magit-branch}. - -It first asks the user for an existing branch or revision. If the -user input actually can be resolved as a branch or revision, then it -checks that out, just like @code{magit-checkout} would. - -Otherwise it creates and checks out a new branch using the input as -its name. Before doing so it reads the starting-point for the new -branch. This is similar to what @code{magit-branch-and-checkout} does. - -To use this command instead of @code{magit-checkout} add this to your init -file: - -@lisp -(transient-replace-suffix 'magit-branch 'magit-checkout - '("b" "dwim" magit-branch-or-checkout)) -@end lisp -@end deffn - -@node Branch Git Variables -@subsection Branch Git Variables - -These variables can be set from the transient prefix command -@code{magit-branch-configure}. By default they can also be set from -@code{magit-branch}. See @ref{Branch Commands}. - -@defvar branch.NAME.merge -Together with @code{branch.NAME.remote} this variable defines the upstream -branch of the local branch named NAME@. The value of this variable -is the full reference of the upstream @emph{branch}. -@end defvar - -@defvar branch.NAME.remote -Together with @code{branch.NAME.merge} this variable defines the upstream -branch of the local branch named NAME@. The value of this variable -is the name of the upstream @emph{remote}. -@end defvar - -@defvar branch.NAME.rebase -This variable controls whether pulling into the branch named NAME is -done by rebasing or by merging the fetched branch. - -@itemize -@item -When @code{true} then pulling is done by rebasing. -@item -When @code{false} then pulling is done by merging. -@item -When undefined then the value of @code{pull.rebase} is used. The default -of that variable is @code{false}. -@end itemize -@end defvar - -@defvar branch.NAME.pushRemote -This variable specifies the remote that the branch named NAME is -usually pushed to. The value has to be the name of an existing -remote. - -It is not possible to specify the name of @emph{branch} to push the local -branch to. The name of the remote branch is always the same as the -name of the local branch. - -If this variable is undefined but @code{remote.pushDefault} is defined, -then the value of the latter is used. By default @code{remote.pushDefault} -is undefined. -@end defvar - -@defvar branch.NAME.description -This variable can be used to describe the branch named NAME@. That -description is used, e.g., when turning the branch into a series of -patches. -@end defvar - -The following variables specify defaults which are used if the above -branch-specific variables are not set. - -@defvar pull.rebase -This variable specifies whether pulling is done by rebasing or by -merging. It can be overwritten using @code{branch.NAME.rebase}. - -@itemize -@item -When @code{true} then pulling is done by rebasing. -@item -When @code{false} (the default) then pulling is done by merging. -@end itemize - -Since it is never a good idea to merge the upstream branch into a -feature or hotfix branch and most branches are such branches, you -should consider setting this to @code{true}, and @code{branch.master.rebase} to -@code{false}. -@end defvar - -@defvar remote.pushDefault -This variable specifies what remote the local branches are usually -pushed to. This can be overwritten per branch using -@code{branch.NAME.pushRemote}. -@end defvar - -The following variables are used during the creation of a branch and -control whether the various branch-specific variables are -automatically set at this time. - -@defvar branch.autoSetupMerge -This variable specifies under what circumstances creating a branch -NAME should result in the variables @code{branch.NAME.merge} and -@code{branch.NAME.remote} being set according to the starting point used to -create the branch. If the starting point isn't a branch, then these -variables are never set. - -@itemize -@item -When @code{always} then the variables are set regardless of whether the -starting point is a local or a remote branch. -@item -When @code{true} (the default) then the variables are set when the starting -point is a remote branch, but not when it is a local branch. -@item -When @code{false} then the variables are never set. -@end itemize -@end defvar - -@defvar branch.autoSetupRebase -This variable specifies whether creating a branch NAME should result -in the variable @code{branch.NAME.rebase} being set to @code{true}. - -@itemize -@item -When @code{always} then the variable is set regardless of whether the -starting point is a local or a remote branch. -@item -When @code{local} then the variable are set when the starting point is a -local branch, but not when it is a remote branch. -@item -When @code{remote} then the variable are set when the starting point is a -remote branch, but not when it is a local branch. -@item -When @code{never} (the default) then the variable is never set. -@end itemize -@end defvar - -Note that the respective commands always change the repository-local -values. If you want to change the global value, which is used when -the local value is undefined, then you have to do so on the command -line, e.g.: - -@example -git config --global remote.autoSetupMerge always -@end example - -For more information about these variables you should also see -@ifinfo -@ref{git-config,,,gitman,}. -@end ifinfo -@ifhtml -@html -the <a href="http://git-scm.com/docs/git-config">git-config(1)</a> manpage. -@end html -@end ifhtml -@iftex -the git-config(1) manpage. -@end iftex - Also see -@ifinfo -@ref{git-branch,,,gitman,}. -@end ifinfo -@ifhtml -@html -the <a href="http://git-scm.com/docs/git-branch">git-branch(1)</a> manpage. -@end html -@end ifhtml -@iftex -the git-branch(1) manpage. -@end iftex -, -@ifinfo -@ref{git-checkout,,,gitman,}. -@end ifinfo -@ifhtml -@html -the <a href="http://git-scm.com/docs/git-checkout">git-checkout(1)</a> manpage. -@end html -@end ifhtml -@iftex -the git-checkout(1) manpage. -@end iftex - and @ref{Pushing}. - -@defopt magit-prefer-remote-upstream -This option controls whether commands that read a branch from the -user and then set it as the upstream branch, offer a local or a -remote branch as default completion candidate, when they have the -choice. - -This affects all commands that use @code{magit-read-upstream-branch} or -@code{magit-read-starting-point}, which includes all commands that change -the upstream and many which create new branches. -@end defopt - -@node Auxiliary Branch Commands -@subsection Auxiliary Branch Commands - -These commands are not available from the transient @code{magit-branch} by -default. - -@deffn Command magit-branch-shelve -This command shelves a branch. This is done by deleting the branch, -and creating a new reference "refs/shelved/BRANCH-NAME" pointing at -the same commit as the branch pointed at. If the deleted branch had -a reflog, then that is preserved as the reflog of the new reference. - -This is useful if you want to move a branch out of sight, but are -not ready to completely discard it yet. -@end deffn - -@deffn Command magit-branch-unshelve -This command unshelves a branch that was previously shelved using -@code{magit-branch-shelve}. This is done by deleting the reference -"refs/shelved/BRANCH-NAME" and creating a branch "BRANCH-NAME" -pointing at the same commit as the deleted reference pointed at. -If the deleted reference had a reflog, then that is restored as -the reflog of the branch. -@end deffn - -@node Merging -@section Merging - -Also see -@ifinfo -@ref{git-merge,,,gitman,}. -@end ifinfo -@ifhtml -@html -the <a href="http://git-scm.com/docs/git-merge">git-merge(1)</a> manpage. -@end html -@end ifhtml -@iftex -the git-merge(1) manpage. -@end iftex - For information on how to resolve -merge conflicts see the next section. - -@table @asis -@item @kbd{m} (@code{magit-merge}) -@kindex m -@findex magit-merge -This transient prefix command binds the following suffix commands -along with the appropriate infix arguments and displays them in a -temporary buffer until a suffix is invoked. -@end table - -When no merge is in progress, then the transient features the -following suffix commands. - -@table @asis -@item @kbd{m m} (@code{magit-merge-plain}) -@kindex m m -@findex magit-merge-plain -This command merges another branch or an arbitrary revision into the -current branch. The branch or revision to be merged is read in the -minibuffer and defaults to the branch at point. - -Unless there are conflicts or a prefix argument is used, then the -resulting merge commit uses a generic commit message, and the user -does not get a chance to inspect or change it before the commit is -created. With a prefix argument this does not actually create the -merge commit, which makes it possible to inspect how conflicts were -resolved and to adjust the commit message. - -@item @kbd{m e} (@code{magit-merge-editmsg}) -@kindex m e -@findex magit-merge-editmsg -This command merges another branch or an arbitrary revision into the -current branch and opens a commit message buffer, so that the user -can make adjustments. The commit is not actually created until the -user finishes with @code{C-c C-c}. - -@item @kbd{m n} (@code{magit-merge-nocommit}) -@kindex m n -@findex magit-merge-nocommit -This command merges another branch or an arbitrary revision into the -current branch, but does not actually create the merge commit. The -user can then further adjust the merge, even when automatic conflict -resolution succeeded and/or adjust the commit message. - -@item @kbd{m a} (@code{magit-merge-absorb}) -@kindex m a -@findex magit-merge-absorb -This command merges another local branch into the current branch and -then removes the former. - -Before the source branch is merged, it is first force pushed to its -push-remote, provided the respective remote branch already exists. -This ensures that the respective pull-request (if any) won't get -stuck on some obsolete version of the commits that are being merged. -Finally, if @code{magit-branch-pull-request} was used to create the merged -branch, then the respective remote branch is also removed. - -@item @kbd{m i} (@code{magit-merge-into}) -@kindex m i -@findex magit-merge-into -This command merges the current branch into another local branch and -then removes the former. The latter becomes the new current branch. - -Before the source branch is merged, it is first force pushed to its -push-remote, provided the respective remote branch already exists. -This ensures that the respective pull-request (if any) won't get -stuck on some obsolete version of the commits that are being merged. -Finally, if @code{magit-branch-pull-request} was used to create the merged -branch, then the respective remote branch is also removed. - -@item @kbd{m s} (@code{magit-merge-squash}) -@kindex m s -@findex magit-merge-squash -This command squashes the changes introduced by another branch or an -arbitrary revision into the current branch. This only applies the -changes made by the squashed commits. No information is preserved -that would allow creating an actual merge commit. Instead of this -command you should probably use a command from the apply transient. - -@item @kbd{m p} (@code{magit-merge-preview}) -@kindex m p -@findex magit-merge-preview -This command shows a preview of merging another branch or an -arbitrary revision into the current branch. - -Note that commands, that normally change how a diff is displayed, do -not work in buffers created by this command, because the underlying -Git command does not support diff arguments. -@end table - -When a merge is in progress, then the transient instead features the -following suffix commands. - -@table @asis -@item @kbd{m m} (@code{magit-merge}) -@kindex m m -@findex magit-merge -After the user resolved conflicts, this command proceeds with the -merge. If some conflicts weren't resolved, then this command fails. - -@item @kbd{m a} (@code{magit-merge-abort}) -@kindex m a -@findex magit-merge-abort -This command aborts the current merge operation. -@end table - -@node Resolving Conflicts -@section Resolving Conflicts - -When merging branches (or otherwise combining or changing history) -conflicts can occur. If you edited two completely different parts of -the same file in two branches and then merge one of these branches -into the other, then Git can resolve that on its own, but if you edit -the same area of a file, then a human is required to decide how the -two versions, or "sides of the conflict", are to be combined into one. - -Here we can only provide a brief introduction to the subject and point -you toward some tools that can help. If you are new to this, then -please also consult Git's own documentation as well as other -resources. - -If a file has conflicts and Git cannot resolve them by itself, then it -puts both versions into the affected file along with special markers -whose purpose is to denote the boundaries of the unresolved part of -the file and between the different versions. These boundary lines -begin with the strings consisting of seven times the same character, -one of @code{<}, @code{|}, @code{=} and @code{>}, and are followed by information about the source -of the respective versions, e.g.: - -@example -<<<<<<< HEAD -Take the blue pill. -======= -Take the red pill. ->>>>>>> feature -@end example - -In this case you have chosen to take the red pill on one branch and on -another you picked the blue pill. Now that you are merging these two -diverging branches, Git cannot possibly know which pill you want to -take. - -To resolve that conflict you have to create a version of the affected -area of the file by keeping only one of the sides, possibly by editing -it in order to bring in the changes from the other side, remove the -other versions as well as the markers, and then stage the result. A -possible resolution might be: - -@example -Take both pills. -@end example - -Often it is useful to see not only the two sides of the conflict but -also the "original" version from before the same area of the file was -modified twice on different branches. Instruct Git to insert that -version as well by running this command once: - -@example -git config --global merge.conflictStyle diff3 -@end example - -The above conflict might then have looked like this: - -@example -<<<<<<< HEAD -Take the blue pill. -||||||| merged common ancestors -Take either the blue or the red pill, but not both. -======= -Take the red pill. ->>>>>>> feature -@end example - -If that were the case, then the above conflict resolution would not -have been correct, which demonstrates why seeing the original version -alongside the conflicting versions can be useful. - -You can perform the conflict resolution completely by hand, but Emacs -also provides some packages that help in the process: Smerge, Ediff -(@ref{Top,,,ediff,}), and Emerge (@ref{Emerge,,,emacs,}). Magit does not provide -its own tools for conflict resolution, but it does make using Smerge -and Ediff more convenient. (Ediff supersedes Emerge, so you probably -don't want to use the latter anyway.) - -In the Magit status buffer, files with unresolved conflicts are listed -in the "Unstaged changes" and/or "Staged changes" sections. They are -prefixed with the word "unmerged", which in this context essentially -is a synonym for "unresolved". - -Pressing @code{RET} while point is on such a file section shows a buffer -visiting that file, turns on @code{smerge-mode} in that buffer, and places -point inside the first area with conflicts. You should then resolve -that conflict using regular edit commands and/or Smerge commands. - -Unfortunately Smerge does not have a manual, but you can get a list of -commands and binding @code{C-c ^ C-h} and press @code{RET} while point is on a -command name to read its documentation. - -Normally you would edit one version and then tell Smerge to keep only -that version. Use @code{C-c ^ m} (@code{smerge-keep-mine}) to keep the @code{HEAD} -version or @code{C-c ^ o} (@code{smerge-keep-other}) to keep the version that -follows "|||||||". Then use @code{C-c ^ n} to move to the next conflicting -area in the same file. Once you are done resolving conflicts, return -to the Magit status buffer. The file should now be shown as -"modified", no longer as "unmerged", because Smerge automatically -stages the file when you save the buffer after resolving the last -conflict. - -Magit now wraps the mentioned Smerge commands, allowing you to use -these key bindings without having to go to the file-visiting buffer. -Additionally @code{k} (@code{magit-discard}) on a hunk with unresolved conflicts -asks which side to keep or, if point is on a side, then it keeps it -without prompting. Similarly @code{k} on a unresolved file ask which side -to keep. - -Alternatively you could use Ediff, which uses separate buffers for the -different versions of the file. To resolve conflicts in a file using -Ediff press @code{e} while point is on such a file in the status buffer. - -Ediff can be used for other purposes as well. For more information on -how to enter Ediff from Magit, see @ref{Ediffing}. Explaining how to use -Ediff is beyond the scope of this manual, instead see @ref{Top,,,ediff,}. - -If you are unsure whether you should Smerge or Ediff, then use the -former. It is much easier to understand and use, and except for -truly complex conflicts, the latter is usually overkill. - -@node Rebasing -@section Rebasing - -Also see -@ifinfo -@ref{git-rebase,,,gitman,}. -@end ifinfo -@ifhtml -@html -the <a href="http://git-scm.com/docs/git-rebase">git-rebase(1)</a> manpage. -@end html -@end ifhtml -@iftex -the git-rebase(1) manpage. -@end iftex - For information on how to resolve -conflicts that occur during rebases see the preceding section. - -@table @asis -@item @kbd{r} (@code{magit-rebase}) -@kindex r -@findex magit-rebase -This transient prefix command binds the following suffix commands -along with the appropriate infix arguments and displays them in a -temporary buffer until a suffix is invoked. -@end table - -When no rebase is in progress, then the transient features the -following suffix commands. - -Using one of these commands @emph{starts} a rebase sequence. Git might then -stop somewhere along the way, either because you told it to do so, or -because applying a commit failed due to a conflict. When that -happens, then the status buffer shows information about the rebase -sequence which is in progress in a section similar to a log section. -See @ref{Information About In-Progress Rebase}. - -For information about the upstream and the push-remote, see @ref{The Two Remotes}. - -@table @asis -@item @kbd{r p} (@code{magit-rebase-onto-pushremote}) -@kindex r p -@findex magit-rebase-onto-pushremote -This command rebases the current branch onto its push-remote. - -With a prefix argument or when the push-remote is either not -configured or unusable, then let the user first configure the -push-remote. - -@item @kbd{r u} (@code{magit-rebase-onto-upstream}) -@kindex r u -@findex magit-rebase-onto-upstream -This command rebases the current branch onto its upstream branch. - -With a prefix argument or when the upstream is either not -configured or unusable, then let the user first configure -the upstream. - -@item @kbd{r e} (@code{magit-rebase-branch}) -@kindex r e -@findex magit-rebase-branch -This command rebases the current branch onto a branch read in the -minibuffer. All commits that are reachable from head but not from -the selected branch TARGET are being rebased. - -@item @kbd{r s} (@code{magit-rebase-subset}) -@kindex r s -@findex magit-rebase-subset -This command starts a non-interactive rebase sequence to transfer -commits from START to @code{HEAD} onto NEWBASE@. START has to be selected -from a list of recent commits. -@end table - -By default Magit uses the @code{--autostash} argument, which causes -uncommitted changes to be stored in a stash before the rebase begins. -These changes are restored after the rebase completes and if possible -the stash is removed. If the stash does not apply cleanly, then the -stash is not removed. In case something goes wrong when resolving -the conflicts, this allows you to start over. - -Even though one of the actions is dedicated to interactive rebases, -the transient also features the infix argument @code{--interactive}. This -can be used to turn one of the other, non-interactive rebase variants -into an interactive rebase. - -For example if you want to clean up a feature branch and at the same -time rebase it onto @code{master}, then you could use @code{r-iu}. But we recommend -that you instead do that in two steps. First use @code{ri} to cleanup the -feature branch, and then in a second step @code{ru} to rebase it onto @code{master}. -That way if things turn out to be more complicated than you thought -and/or you make a mistake and have to start over, then you only have -to redo half the work. - -Explicitly enabling @code{--interactive} won't have an effect on the -following commands as they always use that argument anyway, even if it -is not enabled in the transient. - -@table @asis -@item @kbd{r i} (@code{magit-rebase-interactive}) -@kindex r i -@findex magit-rebase-interactive -This command starts an interactive rebase sequence. - -@item @kbd{r f} (@code{magit-rebase-autosquash}) -@kindex r f -@findex magit-rebase-autosquash -This command combines squash and fixup commits with their intended -targets. - -@item @kbd{r m} (@code{magit-rebase-edit-commit}) -@kindex r m -@findex magit-rebase-edit-commit -This command starts an interactive rebase sequence that lets the -user edit a single older commit. - -@item @kbd{r w} (@code{magit-rebase-reword-commit}) -@kindex r w -@findex magit-rebase-reword-commit -This command starts an interactive rebase sequence that lets the -user reword a single older commit. - -@item @kbd{r k} (@code{magit-rebase-remove-commit}) -@kindex r k -@findex magit-rebase-remove-commit -This command removes a single older commit using rebase. -@end table - -When a rebase is in progress, then the transient instead features -the following suffix commands. - -@table @asis -@item @kbd{r r} (@code{magit-rebase-continue}) -@kindex r r -@findex magit-rebase-continue -This command restart the current rebasing operation. - -In some cases this pops up a commit message buffer for you do edit. -With a prefix argument the old message is reused as-is. - -@item @kbd{r s} (@code{magit-rebase-skip}) -@kindex r s -@findex magit-rebase-skip -This command skips the current commit and restarts the current -rebase operation. - -@item @kbd{r e} (@code{magit-rebase-edit}) -@kindex r e -@findex magit-rebase-edit -This command lets the user edit the todo list of the current rebase -operation. - -@item @kbd{r a} (@code{magit-rebase-abort}) -@kindex r a -@findex magit-rebase-abort -This command aborts the current rebase operation, restoring the -original branch. -@end table - -@menu -* Editing Rebase Sequences:: -* Information About In-Progress Rebase:: -@end menu - -@node Editing Rebase Sequences -@subsection Editing Rebase Sequences - -@table @asis -@item @kbd{C-c C-c} (@code{with-editor-finish}) -@kindex C-c C-c -@findex with-editor-finish -Finish the current editing session by returning with exit code 0. -Git then uses the rebase instructions it finds in the file. - -@item @kbd{C-c C-k} (@code{with-editor-cancel}) -@kindex C-c C-k -@findex with-editor-cancel -Cancel the current editing session by returning with exit code 1. -Git then forgoes starting the rebase sequence. - -@item @kbd{@key{RET}} (@code{git-rebase-show-commit}) -@kindex RET -@findex git-rebase-show-commit -Show the commit on the current line in another buffer and select -that buffer. - -@item @kbd{@key{SPC}} (@code{git-rebase-show-or-scroll-up}) -@kindex SPC -@findex git-rebase-show-or-scroll-up -Show the commit on the current line in another buffer without -selecting that buffer. If the revision buffer is already visible in -another window of the current frame, then instead scroll that window -up. - -@item @kbd{@key{DEL}} (@code{git-rebase-show-or-scroll-down}) -@kindex DEL -@findex git-rebase-show-or-scroll-down -Show the commit on the current line in another buffer without -selecting that buffer. If the revision buffer is already visible in -another window of the current frame, then instead scroll that window -down. - -@item @kbd{p} (@code{git-rebase-backward-line}) -@kindex p -@findex git-rebase-backward-line -Move to previous line. - -@item @kbd{n} (@code{forward-line}) -@kindex n -@findex forward-line -Move to next line. - -@item @kbd{M-p} (@code{git-rebase-move-line-up}) -@kindex M-p -@findex git-rebase-move-line-up -Move the current commit (or command) up. - -@item @kbd{M-n} (@code{git-rebase-move-line-down}) -@kindex M-n -@findex git-rebase-move-line-down -Move the current commit (or command) down. - -@item @kbd{r} (@code{git-rebase-reword}) -@kindex r -@findex git-rebase-reword -Edit message of commit on current line. - -@item @kbd{e} (@code{git-rebase-edit}) -@kindex e -@findex git-rebase-edit -Stop at the commit on the current line. - -@item @kbd{s} (@code{git-rebase-squash}) -@kindex s -@findex git-rebase-squash -Meld commit on current line into previous commit, and edit message. - -@item @kbd{f} (@code{git-rebase-fixup}) -@kindex f -@findex git-rebase-fixup -Meld commit on current line into previous commit, discarding the -current commit's message. - -@item @kbd{k} (@code{git-rebase-kill-line}) -@kindex k -@findex git-rebase-kill-line -Kill the current action line. - -@item @kbd{c} (@code{git-rebase-pick}) -@kindex c -@findex git-rebase-pick -Use commit on current line. - -@item @kbd{x} (@code{git-rebase-exec}) -@kindex x -@findex git-rebase-exec -Insert a shell command to be run after the proceeding commit. - -If there already is such a command on the current line, then edit -that instead. With a prefix argument insert a new command even when -there already is one on the current line. With empty input remove -the command on the current line, if any. - -@item @kbd{b} (@code{git-rebase-break}) -@kindex b -@findex git-rebase-break -Insert a break action before the current line, instructing Git to -return control to the user. - -@item @kbd{y} (@code{git-rebase-insert}) -@kindex y -@findex git-rebase-insert -Read an arbitrary commit and insert it below current line. - -@item @kbd{C-x u} (@code{git-rebase-undo}) -@kindex C-x u -@findex git-rebase-undo -Undo some previous changes. Like @code{undo} but works in read-only -buffers. -@end table - -@defopt git-rebase-auto-advance -Whether to move to next line after changing a line. -@end defopt - -@defopt git-rebase-show-instructions -Whether to show usage instructions inside the rebase buffer. -@end defopt - -@defopt git-rebase-confirm-cancel -Whether confirmation is required to cancel. -@end defopt - -When a rebase is performed with the @code{--rebase-merges} option, the -sequence will include a few other types of actions and the following -commands become relevant. - -@table @asis -@item @kbd{l} (@code{git-rebase-label}) -@kindex l -@findex git-rebase-label -This commands inserts a label action or edits the one at point. - -@item @kbd{t} (@code{git-rebase-reset}) -@kindex t -@findex git-rebase-reset -This command inserts a reset action or edits the one at point. The -prompt will offer the labels that are currently present in the -buffer. - -@item @kbd{MM} (@code{git-rebase-merge}) -@kindex MM -@findex git-rebase-merge -The command inserts a merge action or edits the one at point. The -prompt will offer the labels that are currently present in the -buffer. Specifying a message to reuse via @code{-c} or @code{-C} is not -supported; an editor will always be invoked for the merge. - -@item @kbd{Mt} (@code{git-rebase-merge-toggle-editmsg}) -@kindex Mt -@findex git-rebase-merge-toggle-editmsg -This command toggles between the @code{-C} and @code{-c} options of the merge -action at point. These options both specify a commit whose message -should be reused. The lower-case variant instructs Git to invoke -the editor when creating the merge, allowing the user to edit the -message. -@end table - -@node Information About In-Progress Rebase -@subsection Information About In-Progress Rebase - -While a rebase sequence is in progress, the status buffer features a -section that lists the commits that have already been applied as well -as the commits that still have to be applied. - -The commits are split in two halves. When rebase stops at a commit, -either because the user has to deal with a conflict or because s/he -explicitly requested that rebase stops at that commit, then point is -placed on the commit that separates the two groups, i.e., on @code{HEAD}. -The commits above it have not been applied yet, while the @code{HEAD} and the -commits below it have already been applied. In between these two -groups of applied and yet-to-be applied commits, there sometimes is a -commit which has been dropped. - -Each commit is prefixed with a word and these words are additionally -shown in different colors to indicate the status of the commits. - -The following colors are used: - -@itemize -@item -Commits that use the same foreground color as the @code{default} face have -not been applied yet. - -@item -Yellow commits have some special relationship to the commit rebase -stopped at. This is used for the words "join", "goal", "same" and -"work" (see below). - -@item -Gray commits have already been applied. - -@item -The blue commit is the @code{HEAD} commit. - -@item -The green commit is the commit the rebase sequence stopped at. If -this is the same commit as @code{HEAD} (e.g., because you haven't done -anything yet after rebase stopped at the commit, then this commit is -shown in blue, not green). There can only be a green @strong{and} a blue -commit at the same time, if you create one or more new commits after -rebase stops at a commit. - -@item -Red commits have been dropped. They are shown for reference only, -e.g., to make it easier to diff. -@end itemize - -Of course these colors are subject to the color-theme in use. - -The following words are used: - -@itemize -@item -Commits prefixed with @code{pick}, @code{reword}, @code{edit}, @code{squash}, and @code{fixup} have not -been applied yet. These words have the same meaning here as they do -in the buffer used to edit the rebase sequence. See @ref{Editing Rebase Sequences}. When the @code{--rebase-merges} option was specified, -@code{reset}, @code{label}, and @code{merge} lines may also be present. - -@item -Commits prefixed with @code{done} and @code{onto} have already been applied. -It is possible for such a commit to be the @code{HEAD}, in which case it -is blue. Otherwise it is grey. - -@itemize -@item -The commit prefixed with @code{onto} is the commit on top of which all -the other commits are being re-applied. This commit itself did -not have to be re-applied, it is the commit rebase did rewind to -before starting to re-apply other commits. - -@item -Commits prefixed with @code{done} have already been re-applied. This -includes commits that have been re-applied but also new commits -that you have created during the rebase. -@end itemize - -@item -All other commits, those not prefixed with any of the above words, -are in some way related to the commit at which rebase stopped. - -To determine whether a commit is related to the stopped-at commit -their hashes, trees and patch-ids @footnote{The patch-id is a hash of the @emph{changes} introduced by a -commit. It differs from the hash of the commit itself, which is a -hash of the result of applying that change (i.e., the resulting trees -and blobs) as well as author and committer information, the commit -message, and the hashes of the parents of the commit. The patch-id -hash on the other hand is created only from the added and removed -lines, even line numbers and whitespace changes are ignored when -calculating this hash. The patch-ids of two commits can be used to -answer the question "Do these commits make the same change?".} are being compared. -The commit message is not used for this purpose. - -Generally speaking commits that are related to the stopped-at commit -can have any of the used colors, though not all color/word -combinations are possible. - -Words used for stopped-at commits are: - -@itemize -@item -When a commit is prefixed with @code{void}, then that indicates that -Magit knows for sure that all the changes in that commit have been -applied using several new commits. This commit is no longer -reachable from @code{HEAD}, and it also isn't one of the commits that -will be applied when resuming the session. - -@item -When a commit is prefixed with @code{join}, then that indicates that the -rebase sequence stopped at that commit due to a conflict - you now -have to join (merge) the changes with what has already been -applied. In a sense this is the commit rebase stopped at, but -while its effect is already in the index and in the worktree (with -conflict markers), the commit itself has not actually been applied -yet (it isn't the @code{HEAD}). So it is shown in yellow, like the other -commits that still have to be applied. - -@item -When a commit is prefixed with @code{stop} or a @emph{blue} or @emph{green} @code{same}, then -that indicates that rebase stopped at this commit, that it is -still applied or has been applied again, and that at least its -patch-id is unchanged. - -@itemize -@item -When a commit is prefixed with @code{stop}, then that indicates that -rebase stopped at that commit because you requested that -earlier, and its patch-id is unchanged. It might even still be -the exact same commit. - -@item -When a commit is prefixed with a @emph{blue} or @emph{green} @code{same}, then that -indicates that while its tree or hash changed, its patch-id did -not. If it is blue, then it is the @code{HEAD} commit (as always for -blue). When it is green, then it no longer is @code{HEAD} because -other commit have been created since (but before continuing the -rebase). -@end itemize - -@item -When a commit is prefixed with @code{goal}, a @emph{yellow} @code{same,} or @code{work}, then -that indicates that rebase applied that commit but that you then -reset @code{HEAD} to an earlier commit (likely to split it up into -multiple commits), and that there are some uncommitted changes -remaining which likely (but not necessarily) originate from that -commit. - -@itemize -@item -When a commit is prefixed with @code{goal}, then that indicates that it -is still possible to create a new commit with the exact same -tree (the "goal") without manually editing any files, by -committing the index, or by staging all changes and then -committing that. This is the case when the original tree still -exists in the index or worktree in untainted form. - -@item -When a commit is prefixed with a yellow @code{same}, then that -indicates that it is no longer possible to create a commit with -the exact same tree, but that it is still possible to create a -commit with the same patch-id. This would be the case if you -created a new commit with other changes, but the changes from -the original commit still exist in the index or working tree in -untainted form. - -@item -When a commit is prefixed with @code{work}, then that indicates that -you reset @code{HEAD} to an earlier commit, and that there are some -staged and/or unstaged changes (likely, but not necessarily) -originating from that commit. However it is no longer possible -to create a new commit with the same tree or at least the same -patch-id because you have already made other changes. -@end itemize - -@item -When a commit is prefixed with @code{poof} or @code{gone}, then that indicates -that rebase applied that commit but that you then reset @code{HEAD} to an -earlier commit (likely to split it up into multiple commits), and -that there are no uncommitted changes. - -@itemize -@item -When a commit is prefixed with @code{poof}, then that indicates that it -is no longer reachable from @code{HEAD}, but that it has been replaced -with one or more commits, which together have the exact same -effect. - -@item -When a commit is prefixed with @code{gone}, then that indicates that it -is no longer reachable from @code{HEAD} and that we also cannot -determine whether its changes are still in effect in one or more -new commits. They might be, but if so, then there must also be -other changes which makes it impossible to know for sure. -@end itemize -@end itemize -@end itemize - -Do not worry if you do not fully understand the above. That's okay, -you will acquire a good enough understanding through practice. - -For other sequence operations such as cherry-picking, a similar section -is displayed, but they lack some of the features described above, due -to limitations in the git commands used to implement them. Most -importantly these sequences only support "picking" a commit but not -other actions such as "rewording", and they do not keep track of the -commits which have already been applied. - -@node Cherry Picking -@section Cherry Picking - -Also see -@ifinfo -@ref{git-cherry-pick,,,gitman,}. -@end ifinfo -@ifhtml -@html -the <a href="http://git-scm.com/docs/git-cherry-pick">git-cherry-pick(1)</a> manpage. -@end html -@end ifhtml -@iftex -the git-cherry-pick(1) manpage. -@end iftex - -@table @asis -@item @kbd{A} (@code{magit-cherry-pick}) -@kindex A -@findex magit-cherry-pick -This transient prefix command binds the following suffix commands -along with the appropriate infix arguments and displays them in a -temporary buffer until a suffix is invoked. -@end table - -When no cherry-pick or revert is in progress, then the transient -features the following suffix commands. - -@table @asis -@item @kbd{A A} (@code{magit-cherry-copy}) -@kindex A A -@findex magit-cherry-copy -This command copies COMMITS from another branch onto the current -branch. If the region selects multiple commits, then those are -copied, without prompting. Otherwise the user is prompted for a -commit or range, defaulting to the commit at point. - -@item @kbd{A a} (@code{magit-cherry-apply}) -@kindex A a -@findex magit-cherry-apply -This command applies the changes in COMMITS from another branch onto -the current branch. If the region selects multiple commits, then -those are used, without prompting. Otherwise the user is prompted -for a commit or range, defaulting to the commit at point. - -This command also has a top-level binding, which can be invoked -without using the transient by typing @code{a} at the top-level. -@end table - -The following commands not only apply some commits to some branch, but -also remove them from some other branch. The removal is performed -using either @code{git-update-ref} or if necessary @code{git-rebase}. Both applying -commits as well as removing them using @code{git-rebase} can lead to -conflicts. If that happens, then these commands abort and you not -only have to resolve the conflicts but also finish the process the -same way you would have to if these commands didn't exist at all. - -@table @asis -@item @kbd{A h} (@code{magit-cherry-harvest}) -@kindex A h -@findex magit-cherry-harvest -This command moves the selected COMMITS that must be located on -another BRANCH onto the current branch instead, removing them from -the former. When this command succeeds, then the same branch is -current as before. - -Applying the commits on the current branch or removing them from the -other branch can lead to conflicts. When that happens, then this -command stops and you have to resolve the conflicts and then finish -the process manually. - -@item @kbd{A d} (@code{magit-cherry-donate}) -@kindex A d -@findex magit-cherry-donate -This command moves the selected COMMITS from the current branch onto -another existing BRANCH, removing them from the former. When this -command succeeds, then the same branch is current as before. @code{HEAD} -is allowed to be detached initially. - -Applying the commits on the other branch or removing them from the -current branch can lead to conflicts. When that happens, then this -command stops and you have to resolve the conflicts and then finish -the process manually. - -@item @kbd{A n} (@code{magit-cherry-spinout}) -@kindex A n -@findex magit-cherry-spinout -This command moves the selected COMMITS from the current branch onto -a new branch BRANCH, removing them from the former. When this -command succeeds, then the same branch is current as before. - -Applying the commits on the other branch or removing them from the -current branch can lead to conflicts. When that happens, then this -command stops and you have to resolve the conflicts and then finish -the process manually. - -@item @kbd{A s} (@code{magit-cherry-spinoff}) -@kindex A s -@findex magit-cherry-spinoff -This command moves the selected COMMITS from the current branch onto -a new branch BRANCH, removing them from the former. When this -command succeeds, then the new branch is checked out. - -Applying the commits on the other branch or removing them from the -current branch can lead to conflicts. When that happens, then this -command stops and you have to resolve the conflicts and then finish -the process manually. -@end table - -When a cherry-pick or revert is in progress, then the transient -instead features the following suffix commands. - -@table @asis -@item @kbd{A A} (@code{magit-sequence-continue}) -@kindex A A -@findex magit-sequence-continue -Resume the current cherry-pick or revert sequence. - -@item @kbd{A s} (@code{magit-sequence-skip}) -@kindex A s -@findex magit-sequence-skip -Skip the stopped at commit during a cherry-pick or revert sequence. - -@item @kbd{A a} (@code{magit-sequence-abort}) -@kindex A a -@findex magit-sequence-abort -Abort the current cherry-pick or revert sequence. This discards all -changes made since the sequence started. -@end table - -@menu -* Reverting:: -@end menu - -@node Reverting -@subsection Reverting - -@table @asis -@item @kbd{V} (@code{magit-revert}) -@kindex V -@findex magit-revert -This transient prefix command binds the following suffix commands -along with the appropriate infix arguments and displays them in a -temporary buffer until a suffix is invoked. -@end table - -When no cherry-pick or revert is in progress, then the transient -features the following suffix commands. - -@table @asis -@item @kbd{V V} (@code{magit-revert-and-commit}) -@kindex V V -@findex magit-revert-and-commit -Revert a commit by creating a new commit. Prompt for a commit, -defaulting to the commit at point. If the region selects multiple -commits, then revert all of them, without prompting. - -@item @kbd{V v} (@code{magit-revert-no-commit}) -@kindex V v -@findex magit-revert-no-commit -Revert a commit by applying it in reverse to the working tree. -Prompt for a commit, defaulting to the commit at point. If the -region selects multiple commits, then revert all of them, without -prompting. -@end table - -When a cherry-pick or revert is in progress, then the transient -instead features the following suffix commands. - -@table @asis -@item @kbd{V V} (@code{magit-sequence-continue}) -@kindex V V -@findex magit-sequence-continue -Resume the current cherry-pick or revert sequence. - -@item @kbd{V s} (@code{magit-sequence-skip}) -@kindex V s -@findex magit-sequence-skip -Skip the stopped at commit during a cherry-pick or revert sequence. - -@item @kbd{V a} (@code{magit-sequence-abort}) -@kindex V a -@findex magit-sequence-abort -Abort the current cherry-pick or revert sequence. This discards all -changes made since the sequence started. -@end table - -@node Resetting -@section Resetting - -Also see -@ifinfo -@ref{git-reset,,,gitman,}. -@end ifinfo -@ifhtml -@html -the <a href="http://git-scm.com/docs/git-reset">git-reset(1)</a> manpage. -@end html -@end ifhtml -@iftex -the git-reset(1) manpage. -@end iftex - -@table @asis -@item @kbd{x} (@code{magit-reset-quickly}) -@kindex x -@findex magit-reset-quickly -Reset the @code{HEAD} and index to some commit read from the user and -defaulting to the commit at point, and possibly also reset the -working tree. With a prefix argument reset the working tree -otherwise don't. - -@item @kbd{X m} (@code{magit-reset-mixed}) -@kindex X m -@findex magit-reset-mixed -Reset the @code{HEAD} and index to some commit read from the user and -defaulting to the commit at point. The working tree is kept as-is. - -@item @kbd{X s} (@code{magit-reset-soft}) -@kindex X s -@findex magit-reset-soft -Reset the @code{HEAD} to some commit read from the user and defaulting -to the commit at point. The index and the working tree are kept -as-is. - -@item @kbd{X h} (@code{magit-reset-hard}) -@kindex X h -@findex magit-reset-hard -Reset the @code{HEAD}, index, and working tree to some commit read from the -user and defaulting to the commit at point. - -@item @kbd{X k} (@code{magit-reset-keep}) -@kindex X k -@findex magit-reset-keep -Reset the @code{HEAD}, index, and working tree to some commit read from the -user and defaulting to the commit at point. Uncommitted changes are -kept as-is. - -@item @kbd{X i} (@code{magit-reset-index}) -@kindex X i -@findex magit-reset-index -Reset the index to some commit read from the user and defaulting to -the commit at point. Keep the @code{HEAD} and working tree as-is, so if -the commit refers to the @code{HEAD}, then this effectively unstages all -changes. - -@item @kbd{X w} (@code{magit-reset-worktree}) -@kindex X w -@findex magit-reset-worktree -Reset the working tree to some commit read from the user and -defaulting to the commit at point. Keep the @code{HEAD} and index as-is. - -@item @kbd{X f} (@code{magit-file-checkout}) -@kindex X f -@findex magit-file-checkout -Update file in the working tree and index to the contents from a -revision. Both the revision and file are read from the user. -@end table - -@node Stashing -@section Stashing - -Also see -@ifinfo -@ref{git-stash,,,gitman,}. -@end ifinfo -@ifhtml -@html -the <a href="http://git-scm.com/docs/git-stash">git-stash(1)</a> manpage. -@end html -@end ifhtml -@iftex -the git-stash(1) manpage. -@end iftex - -@table @asis -@item @kbd{z} (@code{magit-stash}) -@kindex z -@findex magit-stash -This transient prefix command binds the following suffix commands -along with the appropriate infix arguments and displays them in a -temporary buffer until a suffix is invoked. - -@item @kbd{z z} (@code{magit-stash-both}) -@kindex z z -@findex magit-stash-both -Create a stash of the index and working tree. Untracked files are -included according to infix arguments. One prefix argument is -equivalent to @code{--include-untracked} while two prefix arguments are -equivalent to @code{--all}. - -@item @kbd{z i} (@code{magit-stash-index}) -@kindex z i -@findex magit-stash-index -Create a stash of the index only. Unstaged and untracked changes -are not stashed. - -@item @kbd{z w} (@code{magit-stash-worktree}) -@kindex z w -@findex magit-stash-worktree -Create a stash of unstaged changes in the working tree. Untracked -files are included according to infix arguments. One prefix -argument is equivalent to @code{--include-untracked} while two prefix -arguments are equivalent to @code{--all}. - -@item @kbd{z x} (@code{magit-stash-keep-index}) -@kindex z x -@findex magit-stash-keep-index -Create a stash of the index and working tree, keeping index intact. -Untracked files are included according to infix arguments. One -prefix argument is equivalent to @code{--include-untracked} while two -prefix arguments are equivalent to @code{--all}. - -@item @kbd{z Z} (@code{magit-snapshot-both}) -@kindex z Z -@findex magit-snapshot-both -Create a snapshot of the index and working tree. Untracked files -are included according to infix arguments. One prefix argument is -equivalent to @code{--include-untracked} while two prefix arguments are -equivalent to @code{--all}. - -@item @kbd{z I} (@code{magit-snapshot-index}) -@kindex z I -@findex magit-snapshot-index -Create a snapshot of the index only. Unstaged and untracked changes -are not stashed. - -@item @kbd{z W} (@code{magit-snapshot-worktree}) -@kindex z W -@findex magit-snapshot-worktree -Create a snapshot of unstaged changes in the working tree. -Untracked files are included according to infix arguments. One -prefix argument is equivalent to @code{--include-untracked} while two -prefix arguments are equivalent to @code{--all}-. - -@item @kbd{z a} (@code{magit-stash-apply}) -@kindex z a -@findex magit-stash-apply -Apply a stash to the working tree. - -First try @code{git stash apply --index}, which tries to preserve -the index stored in the stash, if any. This may fail because -applying the stash could result in conflicts and those have to -be stored in the index, making it impossible to also store the -stash's index there as well. - -If the above failed, then try @code{git stash apply}. This fails -(with or without @code{--index}) if there are any uncommitted -changes to files that are also modified in the stash. - -If both of the above failed, then apply using @code{git apply}. -If there are no conflicting files, use @code{--3way}. If there are -conflicting files, then using @code{--3way} requires that those -files are staged first, which may be undesirable, so prompt -the user whether to use @code{--3way} or @code{--reject}. - -Customize @code{magit-no-confirm} if you want to always use @code{--3way}, -without being prompted. - -@item @kbd{z p} (@code{magit-stash-pop}) -@kindex z p -@findex magit-stash-pop -Apply a stash to the working tree. On complete success (if the -stash can be applied without any conflicts, and while preserving -the stash's index) then remove the stash from stash list. - -First try @code{git stash pop --index}, which tries to preserve -the index stored in the stash, if any. This may fail because -applying the stash could result in conflicts and those have to -be stored in the index, making it impossible to also store the -stash's index there as well. - -If the above failed, then try @code{git stash apply}. This fails -(with or without @code{--index}) if there are any uncommitted -changes to files that are also modified in the stash. - -If both of the above failed, then apply using @code{git apply}. -If there are no conflicting files, use @code{--3way}. If there are -conflicting files, then using @code{--3way} requires that those -files are staged first, which may be undesirable, so prompt -the user whether to use @code{--3way} or @code{--reject}. - -Customize @code{magit-no-confirm} if you want to always use @code{--3way}, -without being prompted. - -@item @kbd{z k} (@code{magit-stash-drop}) -@kindex z k -@findex magit-stash-drop -Remove a stash from the stash list. When the region is active, offer -to drop all contained stashes. - -@item @kbd{z v} (@code{magit-stash-show}) -@kindex z v -@findex magit-stash-show -Show all diffs of a stash in a buffer. - -@item @kbd{z b} (@code{magit-stash-branch}) -@kindex z b -@findex magit-stash-branch -Create and checkout a new branch from an existing stash. The new -branch starts at the commit that was current when the stash was -created. - -@item @kbd{z B} (@code{magit-stash-branch-here}) -@kindex z B -@findex magit-stash-branch-here -Create and checkout a new branch from an existing stash. Use the -current branch or @code{HEAD} as the starting-point of the new branch. -Then apply the stash, dropping it if it applies cleanly. - -@item @kbd{z f} (@code{magit-stash-format-patch}) -@kindex z f -@findex magit-stash-format-patch -Create a patch from STASH@. - -@item @kbd{k} (@code{magit-stash-clear}) -@kindex k -@findex magit-stash-clear -Remove all stashes saved in REF's reflog by deleting REF@. - -@item @kbd{z l} (@code{magit-stash-list}) -@kindex z l -@findex magit-stash-list -List all stashes in a buffer. -@end table - -@defopt magit-stashes-margin -This option specifies whether the margin is initially shown in -stashes buffers and how it is formatted. - -The value has the form @code{(INIT STYLE WIDTH AUTHOR AUTHOR-WIDTH)}. - -@itemize -@item -If INIT is non-nil, then the margin is shown initially. -@item -STYLE controls how to format the author or committer date. It can -be one of @code{age} (to show the age of the commit), @code{age-abbreviated} (to -abbreviate the time unit to a character), or a string (suitable -for @code{format-time-string}) to show the actual date. Option -@code{magit-log-margin-show-committer-date} controls which date is being -displayed. -@item -WIDTH controls the width of the margin. This exists for forward -compatibility and currently the value should not be changed. -@item -AUTHOR controls whether the name of the author is also shown by -default. -@item -AUTHOR-WIDTH has to be an integer. When the name of the author -is shown, then this specifies how much space is used to do so. -@end itemize -@end defopt - -@node Transferring -@chapter Transferring - -@menu -* Remotes:: -* Fetching:: -* Pulling:: -* Pushing:: -* Plain Patches:: -* Maildir Patches:: -@end menu - -@node Remotes -@section Remotes - -@menu -* Remote Commands:: -* Remote Git Variables:: -@end menu - -@node Remote Commands -@subsection Remote Commands - -The transient prefix command @code{magit-remote} is used to add remotes and -to make changes to existing remotes. This command only deals with -remotes themselves, not with branches or the transfer of commits. -Those features are available from separate transient commands. - -Also see -@ifinfo -@ref{git-remote,,,gitman,}. -@end ifinfo -@ifhtml -@html -the <a href="http://git-scm.com/docs/git-remote">git-remote(1)</a> manpage. -@end html -@end ifhtml -@iftex -the git-remote(1) manpage. -@end iftex - -@table @asis -@item @kbd{M} (@code{magit-remote}) -@kindex M -@findex magit-remote -This transient prefix command binds the following suffix commands -and displays them in a temporary buffer until a suffix is invoked. - -By default it also binds and displays the values of some -remote-related Git variables and allows changing their values. -@end table - -@defopt magit-remote-direct-configure -This option controls whether remote-related Git variables are -accessible directly from the transient @code{magit-remote}. - -If @code{t} (the default) and a local branch is checked out, then -@code{magit-remote} features the variables for the upstream remote of that -branch, or if @code{HEAD} is detached, for @code{origin}, provided that exists. - -If @code{nil}, then @code{magit-remote-configure} has to be used to do so. -@end defopt - -@table @asis -@item @kbd{M C} (@code{magit-remote-configure}) -@kindex M C -@findex magit-remote-configure -This transient prefix command binds commands that set the value of -remote-related variables and displays them in a temporary buffer -until the transient is exited. - -With a prefix argument, this command always prompts for a remote. - -Without a prefix argument this depends on whether it was invoked as -a suffix of @code{magit-remote} and on the @code{magit-remote-direct-configure} -option. If @code{magit-remote} already displays the variables for the -upstream, then it does not make sense to invoke another transient -that displays them for the same remote. In that case this command -prompts for a remote. -@end table - -The variables are described in @ref{Remote Git Variables}. - -@table @asis -@item @kbd{M a} (@code{magit-remote-add}) -@kindex M a -@findex magit-remote-add -This command add a remote and fetches it. The remote name and url -are read in the minibuffer. - -@item @kbd{M r} (@code{magit-remote-rename}) -@kindex M r -@findex magit-remote-rename -This command renames a remote. Both the old and the new names are -read in the minibuffer. - -@item @kbd{M u} (@code{magit-remote-set-url}) -@kindex M u -@findex magit-remote-set-url -This command changes the url of a remote. Both the remote and the -new url are read in the minibuffer. - -@item @kbd{M k} (@code{magit-remote-remove}) -@kindex M k -@findex magit-remote-remove -This command deletes a remote, read in the minibuffer. - -@item @kbd{M p} (@code{magit-remote-prune}) -@kindex M p -@findex magit-remote-prune -This command removes stale remote-tracking branches for a remote -read in the minibuffer. - -@item @kbd{M P} (@code{magit-remote-prune-refspecs}) -@kindex M P -@findex magit-remote-prune-refspecs -This command removes stale refspecs for a remote read in the -minibuffer. - -A refspec is stale if there no longer exists at least one branch -on the remote that would be fetched due to that refspec. A stale -refspec is problematic because its existence causes Git to refuse -to fetch according to the remaining non-stale refspecs. - -If only stale refspecs remain, then this command offers to either -delete the remote or to replace the stale refspecs with the default -refspec ("+refs/heads/*:refs/remotes/REMOTE/*"). - -This command also removes the remote-tracking branches that were -created due to the now stale refspecs. Other stale branches are -not removed. -@end table - -@defopt magit-remote-add-set-remote.pushDefault -This option controls whether the user is asked whether they want to -set @code{remote.pushDefault} after adding a remote. - -If @code{ask}, then users is always ask. If @code{ask-if-unset}, then the user is -only if the variable isn't set already. If @code{nil}, then the user isn't -asked and the variable isn't set. If the value is a string, then -the variable is set without the user being asked, provided that the -name of the added remote is equal to that string and the variable -isn't already set. -@end defopt - -@node Remote Git Variables -@subsection Remote Git Variables - -These variables can be set from the transient prefix command -@code{magit-remote-configure}. By default they can also be set from -@code{magit-remote}. See @ref{Remote Commands}. - -@defvar remote.NAME.url -This variable specifies the url of the remote named NAME@. It can -have multiple values. -@end defvar - -@defvar remote.NAME.fetch -The refspec used when fetching from the remote named NAME@. It can -have multiple values. -@end defvar - -@defvar remote.NAME.pushurl -This variable specifies the url used for pushing to the remote -named NAME@. If it is not specified, then @code{remote.NAME.url} is used -instead. It can have multiple values. -@end defvar - -@defvar remote.NAME.push -The refspec used when pushing to the remote named NAME@. It can -have multiple values. -@end defvar - -@defvar remote.NAME.tagOpts -This variable specifies what tags are fetched by default. If the -value is @code{--no-tags} then no tags are fetched. If the value is -@code{--tags}, then all tags are fetched. If this variable has no value, -then only tags are fetched that are reachable from fetched branches. -@end defvar - -@node Fetching -@section Fetching - -Also see -@ifinfo -@ref{git-fetch,,,gitman,}. -@end ifinfo -@ifhtml -@html -the <a href="http://git-scm.com/docs/git-fetch">git-fetch(1)</a> manpage. -@end html -@end ifhtml -@iftex -the git-fetch(1) manpage. -@end iftex - For information about the upstream and the -push-remote, see @ref{The Two Remotes}. - -@table @asis -@item @kbd{f} (@code{magit-fetch}) -@kindex f -@findex magit-fetch -This transient prefix command binds the following suffix commands -along with the appropriate infix arguments and displays them in a -temporary buffer until a suffix is invoked. - -@item @kbd{f p} (@code{magit-fetch-from-pushremote}) -@kindex f p -@findex magit-fetch-from-pushremote -This command fetches from the current push-remote. - -With a prefix argument or when the push-remote is either not -configured or unusable, then let the user first configure the -push-remote. - -@item @kbd{f u} (@code{magit-fetch-from-upstream}) -@kindex f u -@findex magit-fetch-from-upstream -This command fetch from the upstream of the current branch. - -If the upstream is configured for the current branch and names -an existing remote, then use that. Otherwise try to use another -remote: If only a single remote is configured, then use that. -Otherwise if a remote named "origin" exists, then use that. - -If no remote can be determined, then this command is not available -from the @code{magit-fetch} transient prefix and invoking it directly -results in an error. - -@item @kbd{f e} (@code{magit-fetch-other}) -@kindex f e -@findex magit-fetch-other -This command fetch from a repository read from the minibuffer. - -@item @kbd{f o} (@code{magit-fetch-branch}) -@kindex f o -@findex magit-fetch-branch -This command fetches a branch from a remote, both of which are read -from the minibuffer. - -@item @kbd{f r} (@code{magit-fetch-refspec}) -@kindex f r -@findex magit-fetch-refspec -This command fetches from a remote using an explicit refspec, both -of which are read from the minibuffer. - -@item @kbd{f a} (@code{magit-fetch-all}) -@kindex f a -@findex magit-fetch-all -This command fetches from all remotes. - -@item @kbd{f m} (@code{magit-fetch-modules}) -@kindex f m -@findex magit-fetch-modules -This command fetches all submodules. With a prefix argument, it -acts as a transient prefix command, allowing the caller to set -options. -@end table - -@defopt magit-pull-or-fetch -By default fetch and pull commands are available from separate -transient prefix command. Setting this to @code{t} adds some (but not all) -of the above suffix commands to the @code{magit-pull} transient. - -If you do that, then you might also want to change the key binding -for these prefix commands, e.g.: - -@lisp -(setq magit-pull-or-fetch t) -(define-key magit-mode-map "f" 'magit-pull) ; was magit-fetch -(define-key magit-mode-map "F" nil) ; was magit-pull -@end lisp -@end defopt - -@node Pulling -@section Pulling - -Also see -@ifinfo -@ref{git-pull,,,gitman,}. -@end ifinfo -@ifhtml -@html -the <a href="http://git-scm.com/docs/git-pull">git-pull(1)</a> manpage. -@end html -@end ifhtml -@iftex -the git-pull(1) manpage. -@end iftex - For information about the upstream and the -push-remote, see @ref{The Two Remotes}. - -@table @asis -@item @kbd{F} (@code{magit-pull}) -@kindex F -@findex magit-pull -This transient prefix command binds the following suffix commands -and displays them in a temporary buffer until a suffix is invoked. - -@item @kbd{F p} (@code{magit-pull-from-pushremote}) -@kindex F p -@findex magit-pull-from-pushremote -This command pulls from the push-remote of the current branch. - -With a prefix argument or when the push-remote is either not -configured or unusable, then let the user first configure the -push-remote. - -@item @kbd{F u} (@code{magit-pull-from-upstream}) -@kindex F u -@findex magit-pull-from-upstream -This command pulls from the upstream of the current branch. - -With a prefix argument or when the upstream is either not -configured or unusable, then let the user first configure -the upstream. - -@item @kbd{F e} (@code{magit-pull-branch}) -@kindex F e -@findex magit-pull-branch -This command pulls from a branch read in the minibuffer. -@end table - -@node Pushing -@section Pushing - -Also see -@ifinfo -@ref{git-push,,,gitman,}. -@end ifinfo -@ifhtml -@html -the <a href="http://git-scm.com/docs/git-push">git-push(1)</a> manpage. -@end html -@end ifhtml -@iftex -the git-push(1) manpage. -@end iftex - For information about the upstream and the -push-remote, see @ref{The Two Remotes}. - -@table @asis -@item @kbd{P} (@code{magit-push}) -@kindex P -@findex magit-push -This transient prefix command binds the following suffix commands -along with the appropriate infix arguments and displays them in a -temporary buffer until a suffix is invoked. - -@item @kbd{P p} (@code{magit-push-current-to-pushremote}) -@kindex P p -@findex magit-push-current-to-pushremote -This command pushes the current branch to its push-remote. - -With a prefix argument or when the push-remote is either not -configured or unusable, then let the user first configure the -push-remote. - -@item @kbd{P u} (@code{magit-push-current-to-upstream}) -@kindex P u -@findex magit-push-current-to-upstream -This command pushes the current branch to its upstream branch. - -With a prefix argument or when the upstream is either not -configured or unusable, then let the user first configure -the upstream. - -@item @kbd{P e} (@code{magit-push-current}) -@kindex P e -@findex magit-push-current -This command pushes the current branch to a branch read in the -minibuffer. - -@item @kbd{P o} (@code{magit-push-other}) -@kindex P o -@findex magit-push-other -This command pushes an arbitrary branch or commit somewhere. Both -the source and the target are read in the minibuffer. - -@item @kbd{P r} (@code{magit-push-refspecs}) -@kindex P r -@findex magit-push-refspecs -This command pushes one or multiple refspecs to a remote, both of -which are read in the minibuffer. - -To use multiple refspecs, separate them with commas. Completion is -only available for the part before the colon, or when no colon is -used. - -@item @kbd{P m} (@code{magit-push-matching}) -@kindex P m -@findex magit-push-matching -This command pushes all matching branches to another repository. - -If only one remote exists, then push to that. Otherwise prompt for -a remote, offering the remote configured for the current branch as -default. - -@item @kbd{P t} (@code{magit-push-tags}) -@kindex P t -@findex magit-push-tags -This command pushes all tags to another repository. - -If only one remote exists, then push to that. Otherwise prompt for -a remote, offering the remote configured for the current branch as -default. - -@item @kbd{P T} (@code{magit-push-tag}) -@kindex P T -@findex magit-push-tag -This command pushes a tag to another repository. -@end table - -One of the infix arguments, @code{--force-with-lease}, deserves a word of -caution. It is passed without a value, which means "permit a force -push as long as the remote-tracking branches match their counterparts -on the remote end". If you've set up a tool to do automatic fetches -(Magit itself does not provide such functionality), using -@code{--force-with-lease} can be dangerous because you don't actually -control or know the state of the remote-tracking refs. In that case, -you should consider setting @code{push.useForceIfIncludes} to @code{true} -(available since Git 2.30). - -Two more push commands exist, which by default are not available from -the push transient. See their doc-strings for instructions on how to -add them to the transient. - -@deffn Command magit-push-implicitly args -This command pushes somewhere without using an explicit refspec. - -This command simply runs @code{git push -v [ARGS]}. ARGS are the infix -arguments. No explicit refspec arguments are used. Instead the -behavior depends on at least these Git variables: @code{push.default}, -@code{remote.pushDefault}, @code{branch.<branch>.pushRemote}, -@code{branch.<branch>.remote}, @code{branch.<branch>.merge}, and -@code{remote.<remote>.push}. - -If you add this suffix to a transient prefix without explicitly -specifying the description, then an attempt is made to predict -what this command will do. For example: - -@lisp -(transient-insert-suffix 'magit-push \"p\" - '(\"i\" magit-push-implicitly))" -@end lisp -@end deffn - -@deffn Command magit-push-to-remote remote args -This command pushes to the remote REMOTE without using an explicit -refspec. The remote is read in the minibuffer. - -This command simply runs @code{git push -v [ARGS] REMOTE}. ARGS are the -infix arguments. No refspec arguments are used. Instead the -behavior depends on at least these Git variables: @code{push.default}, -@code{remote.pushDefault}, @code{branch.<branch>.pushRemote}, -@code{branch.<branch>.remote}, @code{branch.<branch>.merge}, and -@code{remote.<remote>.push}. -@end deffn - -@node Plain Patches -@section Plain Patches - -@table @asis -@item @kbd{W} (@code{magit-patch}) -@kindex W -@findex magit-patch -This transient prefix command binds the following suffix commands -along with the appropriate infix arguments and displays them in a -temporary buffer until a suffix is invoked. - -@item @kbd{W c} (@code{magit-patch-create}) -@kindex W c -@findex magit-patch-create -This command creates patches for a set commits. If the region marks -several commits, then it creates patches for all of them. Otherwise -it functions as a transient prefix command, which features several -infix arguments and binds itself as a suffix command. When this -command is invoked as a suffix of itself, then it creates a patch -using the specified infix arguments. - -@item @kbd{w a} (@code{magit-patch-apply}) -@kindex w a -@findex magit-patch-apply -This command applies a patch. This is a transient prefix command, -which features several infix arguments and binds itself as a suffix -command. When this command is invoked as a suffix of itself, then -it applies a patch using the specified infix arguments. - -@item @kbd{W s} (@code{magit-patch-save}) -@kindex W s -@findex magit-patch-save -This command creates a patch from the current diff. - -Inside @code{magit-diff-mode} or @code{magit-revision-mode} buffers, @code{C-x C-w} is -also bound to this command. -@end table - -It is also possible to save a plain patch file by using @code{C-x C-w} inside -a @code{magit-diff-mode} or @code{magit-revision-mode} buffer. - -@node Maildir Patches -@section Maildir Patches - -Also see -@ifinfo -@ref{git-am,,,gitman,}. -@end ifinfo -@ifhtml -@html -the <a href="http://git-scm.com/docs/git-am">git-am(1)</a> manpage. -@end html -@end ifhtml -@iftex -the git-am(1) manpage. -@end iftex - and -@ifinfo -@ref{git-apply,,,gitman,}. -@end ifinfo -@ifhtml -@html -the <a href="http://git-scm.com/docs/git-apply">git-apply(1)</a> manpage. -@end html -@end ifhtml -@iftex -the git-apply(1) manpage. -@end iftex - -@table @asis -@item @kbd{w} (@code{magit-am}) -@kindex w -@findex magit-am -This transient prefix command binds the following suffix commands -along with the appropriate infix arguments and displays them in a -temporary buffer until a suffix is invoked. - -@item @kbd{w w} (@code{magit-am-apply-patches}) -@kindex w w -@findex magit-am-apply-patches -This command applies one or more patches. If the region marks -files, then those are applied as patches. Otherwise this command -reads a file-name in the minibuffer, defaulting to the file at -point. - -@item @kbd{w m} (@code{magit-am-apply-maildir}) -@kindex w m -@findex magit-am-apply-maildir -This command applies patches from a maildir. - -@item @kbd{w a} (@code{magit-patch-apply}) -@kindex w a -@findex magit-patch-apply -This command applies a plain patch. For a longer description see -@ref{Plain Patches}. This command is only available from the @code{magit-am} -transient for historic reasons. -@end table - -When an "am" operation is in progress, then the transient instead -features the following suffix commands. - -@table @asis -@item @kbd{w w} (@code{magit-am-continue}) -@kindex w w -@findex magit-am-continue -This command resumes the current patch applying sequence. - -@item @kbd{w s} (@code{magit-am-skip}) -@kindex w s -@findex magit-am-skip -This command skips the stopped at patch during a patch applying -sequence. - -@item @kbd{w a} (@code{magit-am-abort}) -@kindex w a -@findex magit-am-abort -This command aborts the current patch applying sequence. This -discards all changes made since the sequence started. -@end table - -@node Miscellaneous -@chapter Miscellaneous - -@menu -* Tagging:: -* Notes:: -* Submodules:: -* Subtree:: -* Worktree:: -* Sparse checkouts:: -* Bundle:: -* Common Commands:: -* Wip Modes:: -* Commands for Buffers Visiting Files:: -* Minor Mode for Buffers Visiting Blobs:: -@end menu - -@node Tagging -@section Tagging - -Also see -@ifinfo -@ref{git-tag,,,gitman,}. -@end ifinfo -@ifhtml -@html -the <a href="http://git-scm.com/docs/git-tag">git-tag(1)</a> manpage. -@end html -@end ifhtml -@iftex -the git-tag(1) manpage. -@end iftex - -@table @asis -@item @kbd{t} (@code{magit-tag}) -@kindex t -@findex magit-tag -This transient prefix command binds the following suffix commands -along with the appropriate infix arguments and displays them in a -temporary buffer until a suffix is invoked. - -@item @kbd{t t} (@code{magit-tag-create}) -@kindex t t -@findex magit-tag-create -This command creates a new tag with the given NAME at REV@. With a -prefix argument it creates an annotated tag. - -@item @kbd{t r} (@code{magit-tag-release}) -@kindex t r -@findex magit-tag-release -This commands creates a release tag. It assumes that release tags -match @code{magit-release-tag-regexp}. - -First it prompts for the name of the new tag using the highest -existing tag as initial input and leaving it to the user to -increment the desired part of the version string. If you use -unconventional release tags or version numbers (e.g., -@code{v1.2.3-custom.1}), you can set the @code{magit-release-tag-regexp} and -@code{magit-tag-version-regexp-alist} variables. - -If @code{--annotate} is enabled then it prompts for the message of the -new tag. The proposed tag message is based on the message of the -highest tag, provided that that contains the corresponding version -string and substituting the new version string for that. Otherwise -it proposes something like "Foo-Bar 1.2.3", given, for example, a -TAG "v1.2.3" and a repository located at something like -"/path/to/foo-bar". - -@item @kbd{t k} (@code{magit-tag-delete}) -@kindex t k -@findex magit-tag-delete -This command deletes one or more tags. If the region marks multiple -tags (and nothing else), then it offers to delete those. Otherwise, -it prompts for a single tag to be deleted, defaulting to the tag at -point. - -@item @kbd{t p} (@code{magit-tag-prune}) -@kindex t p -@findex magit-tag-prune -This command offers to delete tags missing locally from REMOTE, and -vice versa. -@end table - -@node Notes -@section Notes - -Also see -@ifinfo -@ref{git-notes,,,gitman,}. -@end ifinfo -@ifhtml -@html -the <a href="http://git-scm.com/docs/git-notes">git-notes(1)</a> manpage. -@end html -@end ifhtml -@iftex -the git-notes(1) manpage. -@end iftex - -@table @asis -@item @kbd{T} (@code{magit-notes}) -@kindex T -@findex magit-notes -This transient prefix command binds the following suffix commands -along with the appropriate infix arguments and displays them in a -temporary buffer until a suffix is invoked. - -@item @kbd{T T} (@code{magit-notes-edit}) -@kindex T T -@findex magit-notes-edit -Edit the note attached to a commit, defaulting to the commit at -point. - -By default use the value of Git variable @code{core.notesRef} or -"refs/notes/commits" if that is undefined. - -@item @kbd{T r} (@code{magit-notes-remove}) -@kindex T r -@findex magit-notes-remove -Remove the note attached to a commit, defaulting to the commit at -point. - -By default use the value of Git variable @code{core.notesRef} or -"refs/notes/commits" if that is undefined. - -@item @kbd{T p} (@code{magit-notes-prune}) -@kindex T p -@findex magit-notes-prune -Remove notes about unreachable commits. -@end table - -It is possible to merge one note ref into another. That may result in -conflicts which have to resolved in the temporary worktree -".git/NOTES@math{_MERGE}@math{_WORKTREE}". - -@table @asis -@item @kbd{T m} (@code{magit-notes-merge}) -@kindex T m -@findex magit-notes-merge -Merge the notes of a ref read from the user into the current notes -ref. The current notes ref is the value of Git variable -@code{core.notesRef} or "refs/notes/commits" if that is undefined. -@end table - -When a notes merge is in progress then the transient features the -following suffix commands, instead of those listed above. - -@table @asis -@item @kbd{T c} (@code{magit-notes-merge-commit}) -@kindex T c -@findex magit-notes-merge-commit -Commit the current notes ref merge, after manually resolving -conflicts. - -@item @kbd{T a} (@code{magit-notes-merge-abort}) -@kindex T a -@findex magit-notes-merge-abort -Abort the current notes ref merge. -@end table - -The following variables control what notes reference @code{magit-notes-*}, -@code{git notes} and @code{git show} act on and display. Both the local and global -values are displayed and can be modified. - -@defvar core.notesRef -This variable specifies the notes ref that is displayed by default -and which commands act on by default. -@end defvar - -@defvar notes.displayRef -This variable specifies additional notes ref to be displayed in -addition to the ref specified by @code{core.notesRef}. It can have -multiple values and may end with @code{*} to display all refs in the -@code{refs/notes/} namespace (or @code{**} if some names contain slashes). -@end defvar - -@node Submodules -@section Submodules - -Also see -@ifinfo -@ref{git-submodule,,,gitman,}. -@end ifinfo -@ifhtml -@html -the <a href="http://git-scm.com/docs/git-submodule">git-submodule(1)</a> manpage. -@end html -@end ifhtml -@iftex -the git-submodule(1) manpage. -@end iftex - -@menu -* Listing Submodules:: -* Submodule Transient:: -@end menu - -@node Listing Submodules -@subsection Listing Submodules - -The command @code{magit-list-submodules} displays a list of the current -repository's submodules in a separate buffer. It's also possible to -display information about submodules directly in the status buffer of -the super-repository by adding @code{magit-insert-modules} to the hook -@code{magit-status-sections-hook} as described in @ref{Status Module Sections}. - -@deffn Command magit-list-submodules -This command displays a list of the current repository's populated -submodules in a separate buffer. - -It can be invoked by pressing @code{RET} on the section titled "Modules". -@end deffn - -@defopt magit-submodule-list-columns -This option controls what columns are displayed by the command -@code{magit-list-submodules} and how they are displayed. - -Each element has the form @code{(HEADER WIDTH FORMAT PROPS)}. - -HEADER is the string displayed in the header. WIDTH is the width -of the column. FORMAT is a function that is called with one -argument, the repository identification (usually its basename), -and with @code{default-directory} bound to the toplevel of its working -tree. It has to return a string to be inserted or nil. PROPS is -an alist that supports the keys @code{:right-align}, @code{:pad-right} and -@code{:sort}. - -The @code{:sort} function has a weird interface described in the -docstring of @code{tabulated-list--get-sort}. Alternatively @code{<} and -@code{magit-repolist-version<} can be used as those functions are -automatically replaced with functions that satisfy the interface. -Set @code{:sort} to @code{nil} to inhibit sorting; if unspecified, then the -column is sortable using the default sorter. - -You may wish to display a range of numeric columns using just one -character per column and without any padding between columns, in -which case you should use an appropriate HEADER, set WIDTH to 1, -and set @code{:pad-right} to 9. @code{+} is substituted for numbers higher than 9. -@end defopt - -@node Submodule Transient -@subsection Submodule Transient - -@table @asis -@item @kbd{o} (@code{magit-submodule}) -@kindex o -@findex magit-submodule -This transient prefix command binds the following suffix commands -along with the appropriate infix arguments and displays them in a -temporary buffer until a suffix is invoked. -@end table - -Some of the below commands default to act on the modules that are -selected using the region. For brevity their description talk about -"the selected modules", but if no modules are selected, then they act -on the current module instead, or if point isn't on a module, then the -read a single module to act on. With a prefix argument these commands -ignore the selection and the current module and instead act on all -suitable modules. - -@table @asis -@item @kbd{o a} (@code{magit-submodule-add}) -@kindex o a -@findex magit-submodule-add -This commands adds the repository at URL as a module. Optional PATH -is the path to the module relative to the root of the super-project. -If it is nil then the path is determined based on URL@. - -@item @kbd{o r} (@code{magit-submodule-register}) -@kindex o r -@findex magit-submodule-register -This command registers the selected modules by copying their urls -from ".gitmodules" to "$GIT@math{_DIR}/config". These values can then be -edited before running @code{magit-submodule-populate}. If you don't need -to edit any urls, then use the latter directly. - -@item @kbd{o p} (@code{magit-submodule-populate}) -@kindex o p -@findex magit-submodule-populate -This command creates the working directory or directories of the -selected modules, checking out the recorded commits. - -@item @kbd{o u} (@code{magit-submodule-update}) -@kindex o u -@findex magit-submodule-update -This command updates the selected modules checking out the recorded -commits. - -@item @kbd{o s} (@code{magit-submodule-synchronize}) -@kindex o s -@findex magit-submodule-synchronize -This command synchronizes the urls of the selected modules, copying -the values from ".gitmodules" to the ".git/config" of the -super-project as well those of the modules. - -@item @kbd{o d} (@code{magit-submodule-unpopulate}) -@kindex o d -@findex magit-submodule-unpopulate -This command removes the working directory of the selected modules. - -@item @kbd{o l} (@code{magit-list-submodules}) -@kindex o l -@findex magit-list-submodules -This command displays a list of the current repository's modules. - -@item @kbd{o f} (@code{magit-fetch-modules}) -@kindex o f -@findex magit-fetch-modules -This command fetches all populated modules. With a prefix argument, -it acts as a transient prefix command, allowing the caller to set -options. - -Also fetch the super-repository, because @code{git fetch} does not -support not doing that. -@end table - -@node Subtree -@section Subtree - -Also see -@ifinfo -@ref{git-subtree,,,gitman,}. -@end ifinfo -@ifhtml -@html -the <a href="http://git-scm.com/docs/git-subtree">git-subtree(1)</a> manpage. -@end html -@end ifhtml -@iftex -the git-subtree(1) manpage. -@end iftex - -@table @asis -@item @kbd{O} (@code{magit-subtree}) -@kindex O -@findex magit-subtree -This transient prefix command binds the two sub-transients; one for -importing a subtree and one for exporting a subtree. - -@item @kbd{O i} (@code{magit-subtree-import}) -@kindex O i -@findex magit-subtree-import -This transient prefix command binds the following suffix commands -along with the appropriate infix arguments and displays them in a -temporary buffer until a suffix is invoked. - -The suffixes of this command import subtrees. - -If the @code{--prefix} argument is set, then the suffix commands use that -prefix without prompting the user. If it is unset, then they read -the prefix in the minibuffer. - -@item @kbd{O i a} (@code{magit-subtree-add}) -@kindex O i a -@findex magit-subtree-add -This command adds COMMIT from REPOSITORY as a new subtree at PREFIX@. - -@item @kbd{O i c} (@code{magit-subtree-add-commit}) -@kindex O i c -@findex magit-subtree-add-commit -This command add COMMIT as a new subtree at PREFIX@. - -@item @kbd{O i m} (@code{magit-subtree-merge}) -@kindex O i m -@findex magit-subtree-merge -This command merges COMMIT into the PREFIX subtree. - -@item @kbd{O i f} (@code{magit-subtree-pull}) -@kindex O i f -@findex magit-subtree-pull -This command pulls COMMIT from REPOSITORY into the PREFIX subtree. - -@item @kbd{O e} (@code{magit-subtree-export}) -@kindex O e -@findex magit-subtree-export -This transient prefix command binds the following suffix commands -along with the appropriate infix arguments and displays them in a -temporary buffer until a suffix is invoked. - -The suffixes of this command export subtrees. - -If the @code{--prefix} argument is set, then the suffix commands use that -prefix without prompting the user. If it is unset, then they read -the prefix in the minibuffer. - -@item @kbd{O e p} (@code{magit-subtree-push}) -@kindex O e p -@findex magit-subtree-push -This command extract the history of the subtree PREFIX and pushes it -to REF on REPOSITORY@. - -@item @kbd{O e s} (@code{magit-subtree-split}) -@kindex O e s -@findex magit-subtree-split -This command extracts the history of the subtree PREFIX@. -@end table - -@node Worktree -@section Worktree - -Also see -@ifinfo -@ref{git-worktree,,,gitman,}. -@end ifinfo -@ifhtml -@html -the <a href="http://git-scm.com/docs/git-worktree">git-worktree(1)</a> manpage. -@end html -@end ifhtml -@iftex -the git-worktree(1) manpage. -@end iftex - -@table @asis -@item @kbd{Z} (@code{magit-worktree}) -@kindex Z -@findex magit-worktree -This transient prefix command binds the following suffix commands -and displays them in a temporary buffer until a suffix is invoked. - -@item @kbd{Z b} (@code{magit-worktree-checkout}) -@kindex Z b -@findex magit-worktree-checkout -Checkout BRANCH in a new worktree at PATH@. - -@item @kbd{Z c} (@code{magit-worktree-branch}) -@kindex Z c -@findex magit-worktree-branch -Create a new BRANCH and check it out in a new worktree at PATH@. - -@item @kbd{Z m} (@code{magit-worktree-move}) -@kindex Z m -@findex magit-worktree-move -Move an existing worktree to a new PATH@. - -@item @kbd{Z k} (@code{magit-worktree-delete}) -@kindex Z k -@findex magit-worktree-delete -Delete a worktree, defaulting to the worktree at point. -The primary worktree cannot be deleted. - -@item @kbd{Z g} (@code{magit-worktree-status}) -@kindex Z g -@findex magit-worktree-status -Show the status for the worktree at point. - -If there is no worktree at point, then read one in the minibuffer. -If the worktree at point is the one whose status is already being -displayed in the current buffer, then show it in Dired instead. -@end table - -@node Sparse checkouts -@section Sparse checkouts - -Sparse checkouts provide a way to restrict the working tree to a -subset of directories. See -@ifinfo -@ref{git-sparse-checkout,,,gitman,}. -@end ifinfo -@ifhtml -@html -the <a href="http://git-scm.com/docs/git-sparse-checkout">git-sparse-checkout(1)</a> manpage. -@end html -@end ifhtml -@iftex -the git-sparse-checkout(1) manpage. -@end iftex - -@strong{Warning}: Git introduced the @code{git sparse-checkout} command in version -2.25 and still advertises it as experimental and subject to change. -Magit's interface should be considered the same. In particular, if -Git introduces a backward incompatible change, Magit's sparse checkout -functionality may be updated in a way that requires a more recent Git -version. - -@table @asis -@item @kbd{>} (@code{magit-sparse-checkout}) -@kindex > -@findex magit-sparse-checkout -This transient prefix command binds the following suffix commands -and displays them in a temporary buffer until a suffix is invoked. - -@item @kbd{> e} (@code{magit-sparse-checkout-enable}) -@kindex > e -@findex magit-sparse-checkout-enable -This command initializes a sparse checkout that includes only the -files in the top-level directory. - -Note that @code{magit-sparse-checkout-set} and -@code{magit-sparse-checkout-add} automatically initialize a sparse -checkout if necessary. However, you may want to call -@code{magit-sparse-checkout-enable} explicitly to re-initialize a sparse -checkout after calling @code{magit-sparse-checkout-disable}, to pass -additional arguments to @code{git sparse-checkout init}, or to execute -the initialization asynchronously. - -@item @kbd{> s} (@code{magit-sparse-checkout-set}) -@kindex > s -@findex magit-sparse-checkout-set -This command takes a list of directories and configures the sparse -checkout to include only files in those subdirectories. Any -previously included directories are excluded unless they are in the -provided list of directories. - -@item @kbd{> a} (@code{magit-sparse-checkout-add}) -@kindex > a -@findex magit-sparse-checkout-add -This command is like @code{magit-sparse-checkout-set}, but instead adds -the specified list of directories to the set of directories that is -already included in the sparse checkout. - -@item @kbd{> r} (@code{magit-sparse-checkout-reapply}) -@kindex > r -@findex magit-sparse-checkout-reapply -This command applies the currently configured sparse checkout -patterns to the working tree. This is useful to call if excluded -files have been checked out after operations such as merging or -rebasing. - -@item @kbd{> d} (@code{magit-sparse-checkout-disable}) -@kindex > d -@findex magit-sparse-checkout-disable -This command restores the full checkout. To return to the previous -sparse checkout, call @code{magit-sparse-checkout-enable}. -@end table - -A sparse checkout can also be initiated when cloning a repository by -using the @code{magit-clone-sparse} command in the @code{magit-clone} transient -(see @ref{Cloning Repository}). - -If you want the status buffer to indicate when a sparse checkout is -enabled, add the function @code{magit-sparse-checkout-insert-header} to -@code{magit-status-headers-hook}. - -@node Bundle -@section Bundle - -Also see -@ifinfo -@ref{git-bundle,,,gitman,}. -@end ifinfo -@ifhtml -@html -the <a href="http://git-scm.com/docs/git-bundle">git-bundle(1)</a> manpage. -@end html -@end ifhtml -@iftex -the git-bundle(1) manpage. -@end iftex - -@deffn Command magit-bundle -This transient prefix command binds several suffix commands for -running @code{git bundle} subcommands and displays them in a temporary -buffer until a suffix is invoked. -@end deffn - -@node Common Commands -@section Common Commands - -@deffn Command magit-switch-to-repository-buffer -@end deffn -@deffn Command magit-switch-to-repository-buffer-other-window -@end deffn -@deffn Command magit-switch-to-repository-buffer-other-frame -@end deffn -@deffn Command magit-display-repository-buffer -These commands read any existing Magit buffer that belongs to the -current repository from the user and then switch to the selected -buffer (without refreshing it). - -The last variant uses @code{magit-display-buffer} to do so and thus -respects @code{magit-display-buffer-function}. -@end deffn - -These are some of the commands that can be used in all buffers whose -major-modes derive from @code{magit-mode}. There are other common commands -beside the ones below, but these didn't fit well anywhere else. - -@table @asis -@item @kbd{C-w} (@code{magit-copy-section-value}) -@kindex C-w -@findex magit-copy-section-value -This command saves the value of the current section to the -@code{kill-ring}, and, provided that the current section is a commit, -branch, or tag section, it also pushes the (referenced) revision to -the @code{magit-revision-stack}. - -When the current section is a branch or a tag, and a prefix argument -is used, then it saves the revision at its tip to the @code{kill-ring} -instead of the reference name. - -When the region is active, this command saves that to the -@code{kill-ring}, like @code{kill-ring-save} would, instead of behaving as -described above. If a prefix argument is used and the region is -within a hunk, then it strips the diff marker column and keeps -only either the added or removed lines, depending on the sign of -the prefix argument. - -@item @kbd{M-w} (@code{magit-copy-buffer-revision}) -@kindex M-w -@findex magit-copy-buffer-revision -This command saves the revision being displayed in the current buffer -to the @code{kill-ring} and also pushes it to the @code{magit-revision-stack}. It -is mainly intended for use in @code{magit-revision-mode} buffers, the only -buffers where it is always unambiguous exactly which revision should -be saved. - -Most other Magit buffers usually show more than one revision, in -some way or another, so this command has to select one of them, and -that choice might not always be the one you think would have been -the best pick. -@end table - -Outside of Magit @code{M-w} and @code{C-w} are usually bound to @code{kill-ring-save} and -@code{kill-region}, and these commands would also be useful in Magit buffers. -Therefore when the region is active, then both of these commands -behave like @code{kill-ring-save} instead of as described above. - -@node Wip Modes -@section Wip Modes - -Git keeps @strong{committed} changes around long enough for users to recover -changes they have accidentally deleted. It does so by not garbage -collecting any committed but no longer referenced objects for a -certain period of time, by default 30 days. - -But Git does @strong{not} keep track of @strong{uncommitted} changes in the working tree -and not even the index (the staging area). Because Magit makes it so -convenient to modify uncommitted changes, it also makes it easy to -shoot yourself in the foot in the process. - -For that reason Magit provides a global mode that saves @strong{tracked} files -to work-in-progress references after or before certain actions. (At -present untracked files are never saved and for technical reasons -nothing is saved before the first commit has been created). - -Two separate work-in-progress references are used to track the state -of the index and of the working tree: @code{refs/wip/index/<branchref>} and -@code{refs/wip/wtree/<branchref>}, where @code{<branchref>} is the full ref of the -current branch, e.g., @code{refs/heads/master}. When the @code{HEAD} is detached -then @code{HEAD} is used in place of @code{<branchref>}. - -Checking out another branch (or detaching @code{HEAD}) causes the use of -different wip refs for subsequent changes. - -@defopt magit-wip-mode -When this mode is enabled, then uncommitted changes are committed -to dedicated work-in-progress refs whenever appropriate (i.e., when -dataloss would be a possibility otherwise). - -Setting this variable directly does not take effect; either use the -Custom interface to do so or call the respective mode function. - -For historic reasons this mode is implemented on top of four other -@code{magit-wip-*} modes, which can also be used individually, if you want -finer control over when the wip refs are updated; but that is -discouraged. See @ref{Legacy Wip Modes}. -@end defopt - -To view the log for a branch and its wip refs use the commands -@code{magit-wip-log} and @code{magit-wip-log-current}. You should use @code{--graph} when -using these commands. - -@deffn Command magit-wip-log -This command shows the log for a branch and its wip refs. -With a negative prefix argument only the worktree wip ref is shown. - -The absolute numeric value of the prefix argument controls how many -"branches" of each wip ref are shown. This is only relevant if the -value of @code{magit-wip-merge-branch} is @code{nil}. -@end deffn - -@deffn Command magit-wip-log-current -This command shows the log for the current branch and its wip refs. -With a negative prefix argument only the worktree wip ref is shown. - -The absolute numeric value of the prefix argument controls how many -"branches" of each wip ref are shown. This is only relevant if the -value of @code{magit-wip-merge-branch} is @code{nil}. -@end deffn - -@table @asis -@item @kbd{X w} (@code{magit-reset-worktree}) -@kindex X w -@findex magit-reset-worktree -This command resets the working tree to some commit read from the -user and defaulting to the commit at point, while keeping the @code{HEAD} -and index as-is. - -This can be used to restore files to the state committed to a wip -ref. Note that this will discard any unstaged changes that might -have existed before invoking this command (but of course only after -committing that to the working tree wip ref). -@end table - -Note that even if you enable @code{magit-wip-mode} this won't give you -perfect protection. The most likely scenario for losing changes -despite the use of @code{magit-wip-mode} is making a change outside Emacs and -then destroying it also outside Emacs. In some such a scenario, -Magit, being an Emacs package, didn't get the opportunity to keep you -from shooting yourself in the foot. - -When you are unsure whether Magit did commit a change to the wip refs, -then you can explicitly request that all changes to all tracked files -are being committed. - -@table @asis -@item @kbd{M-x magit-wip-commit} -@findex magit-wip-commit -This command commits all changes to all tracked files to the index -and working tree work-in-progress refs. Like the modes described above, -it does not commit untracked files, but it does check all tracked -files for changes. Use this command when you suspect that the modes -might have overlooked a change made outside Emacs/Magit. -@end table - -@defopt magit-wip-namespace -The namespace used for work-in-progress refs. It has to end with -a slash. The wip refs are named @code{<namespace>index/<branchref>} and -@code{<namespace>wtree/<branchref>}. When snapshots are created while -the @code{HEAD} is detached then @code{HEAD} is used in place of @code{<branchref>}. -@end defopt - -@defopt magit-wip-mode-lighter -Mode-line lighter for @code{magit-wip--mode}. -@end defopt - -@menu -* Wip Graph:: -* Legacy Wip Modes:: -@end menu - -@node Wip Graph -@subsection Wip Graph - -@defopt magit-wip-merge-branch -This option controls whether the current branch is merged into the -wip refs after a new commit was created on the branch. - -If non-nil and the current branch has new commits, then it is -merged into the wip ref before creating a new wip commit. This -makes it easier to inspect wip history and the wip commits are -never garbage collected. - -If nil and the current branch has new commits, then the wip ref -is reset to the tip of the branch before creating a new wip -commit. With this setting wip commits are eventually garbage -collected. -@end defopt - -When @code{magit-wip-merge-branch} is @code{t}, then the history looks like this: - -@example - *--*--*--*--*--* refs/wip/index/refs/heads/master - / / / -A-----B-----C refs/heads/master -@end example - -When @code{magit-wip-merge-branch} is @code{nil}, then creating a commit on the real -branch and then making a change causes the wip refs to be recreated to -fork from the new commit. But the old commits on the wip refs are not -lost. They are still available from the reflog. To make it easier to -see when the fork point of a wip ref was changed, an additional commit -with the message "restart autosaving" is created on it (@code{xxO} commits -below are such boundary commits). - -Starting with - -@example - BI0---BI1 refs/wip/index/refs/heads/master - / -A---B refs/heads/master - \ - BW0---BW1 refs/wip/wtree/refs/heads/master -@end example - -and committing the staged changes and editing and saving a file would -result in - -@example - BI0---BI1 refs/wip/index/refs/heads/master - / -A---B---C refs/heads/master - \ \ - \ CW0---CW1 refs/wip/wtree/refs/heads/master - \ - BW0---BW1 refs/wip/wtree/refs/heads/master@@@{2@} -@end example - -The fork-point of the index wip ref is not changed until some change -is being staged. Likewise just checking out a branch or creating a -commit does not change the fork-point of the working tree wip ref. The -fork-points are not adjusted until there actually is a change that -should be committed to the respective wip ref. - -@node Legacy Wip Modes -@subsection Legacy Wip Modes - -It is recommended that you use the mode @code{magit-wip-mode} (which see) and -ignore the existence of the following modes, which are preserved for -historic reasons. - -Setting the following variables directly does not take effect; either -use the Custom interface to do so or call the respective mode -functions. - -@defopt magit-wip-after-save-mode -When this mode is enabled, then saving a buffer that visits a file -tracked in a Git repository causes its current state to be committed -to the working tree wip ref for the current branch. -@end defopt - -@defopt magit-wip-after-apply-mode -When this mode is enabled, then applying (i.e., staging, unstaging, -discarding, reversing, and regularly applying) a change to a file -tracked in a Git repository causes its current state to be committed -to the index and/or working tree wip refs for the current branch. -@end defopt - -If you only ever edit files using Emacs and only ever interact with -Git using Magit, then the above two modes should be enough to protect -each and every change from accidental loss. In practice nobody does -that. Two additional modes exists that do commit to the wip refs -before making changes that could cause the loss of earlier changes. - -@defopt magit-wip-before-change-mode -When this mode is enabled, then certain commands commit the existing -changes to the files they are about to make changes to. -@end defopt - -@defopt magit-wip-initial-backup-mode -When this mode is enabled, then the current version of a file is -committed to the worktree wip ref before the buffer visiting that -file is saved for the first time since the buffer was created. - -This backs up the same version of the file that @code{backup-buffer} would -save. While @code{backup-buffer} uses a backup file, this mode uses the -same worktree wip ref as used by the other Magit Wip modes. Like -@code{backup-buffer}, it only does this once; unless you kill the buffer -and visit the file again only one backup will be created per Emacs -session. - -This mode ignores the variables that affect @code{backup-buffer} and can be -used along-side that function, which is recommended because it only -backs up files that are tracked in a Git repository. -@end defopt - -@defopt magit-wip-after-save-local-mode-lighter -Mode-line lighter for @code{magit-wip-after-save-local-mode}. -@end defopt - -@defopt magit-wip-after-apply-mode-lighter -Mode-line lighter for @code{magit-wip-after-apply-mode}. -@end defopt - -@defopt magit-wip-before-change-mode-lighter -Mode-line lighter for @code{magit-wip-before-change-mode}. -@end defopt - -@defopt magit-wip-initial-backup-mode-lighter -Mode-line lighter for @code{magit-wip-initial-backup-mode}. -@end defopt - -@node Commands for Buffers Visiting Files -@section Commands for Buffers Visiting Files - -By default Magit defines a few global key bindings. These bindings -are a compromise between providing no bindings at all and providing -the better bindings I would have liked to use instead. Magit cannot -provide the set of recommended bindings by default because those key -sequences are strictly reserved for bindings added by the user. -Also see @ref{Global Bindings} and @ref{Key Binding Conventions,,,elisp,}. - -To use the recommended bindings, add this to your init file and -restart Emacs. - -@lisp -(setq magit-define-global-key-bindings 'recommended) -@end lisp - -If you don't want Magit to add any bindings to the global keymap at -all, add this to your init file and restart Emacs. - -@lisp -(setq magit-define-global-key-bindings nil) -@end lisp - -@table @asis -@item @kbd{C-c f} (@code{magit-file-dispatch}) -@itemx @kbd{C-c f s} (@code{magit-stage-file}) -@itemx @kbd{C-c f s} (@code{magit-stage-buffer-file}) -@itemx @kbd{C-c f u} (@code{magit-unstage-file}) -@itemx @kbd{C-c f u} (@code{magit-unstage-buffer-file}) -@itemx @kbd{C-c f , x} (@code{magit-file-untrack}) -@itemx @kbd{C-c f , r} (@code{magit-file-rename}) -@itemx @kbd{C-c f , k} (@code{magit-file-delete}) -@itemx @kbd{C-c f , c} (@code{magit-file-checkout}) -@itemx @kbd{C-c f D} (@code{magit-diff}) -@itemx @kbd{C-c f d} (@code{magit-diff-buffer-file}) -@itemx @kbd{C-c f L} (@code{magit-log}) -@itemx @kbd{C-c f l} (@code{magit-log-buffer-file}) -@itemx @kbd{C-c f t} (@code{magit-log-trace-definition}) -@itemx @kbd{C-c f M} (@code{magit-log-merged}) -@itemx @kbd{C-c f B} (@code{magit-blame}) -@itemx @kbd{C-c f b} (@code{magit-blame-additions}) -@itemx @kbd{C-c f r} (@code{magit-blame-removal}) -@itemx @kbd{C-c f f} (@code{magit-blame-reverse}) -@itemx @kbd{C-c f m} (@code{magit-blame-echo}) -@itemx @kbd{C-c f q} (@code{magit-blame-quit}) -@itemx @kbd{C-c f p} (@code{magit-blob-previous}) -@itemx @kbd{C-c f n} (@code{magit-blob-next}) -@itemx @kbd{C-c f v} (@code{magit-find-file}) -@itemx @kbd{C-c f V} (@code{magit-blob-visit-file}) -@itemx @kbd{C-c f g} (@code{magit-status-here}) -@itemx @kbd{C-c f G} (@code{magit-display-repository-buffer}) -@itemx @kbd{C-c f c} (@code{magit-commit}) -@itemx @kbd{C-c f e} (@code{magit-edit-line-commit}) -@kindex C-c f -@kindex C-c f s -@kindex C-c f s -@kindex C-c f u -@kindex C-c f u -@kindex C-c f , x -@kindex C-c f , r -@kindex C-c f , k -@kindex C-c f , c -@kindex C-c f D -@kindex C-c f d -@kindex C-c f L -@kindex C-c f l -@kindex C-c f t -@kindex C-c f M -@kindex C-c f B -@kindex C-c f b -@kindex C-c f r -@kindex C-c f f -@kindex C-c f m -@kindex C-c f q -@kindex C-c f p -@kindex C-c f n -@kindex C-c f v -@kindex C-c f V -@kindex C-c f g -@kindex C-c f G -@kindex C-c f c -@kindex C-c f e -@findex magit-file-dispatch -@findex magit-stage-file -@findex magit-stage-buffer-file -@findex magit-unstage-file -@findex magit-unstage-buffer-file -@findex magit-file-untrack -@findex magit-file-rename -@findex magit-file-delete -@findex magit-file-checkout -@findex magit-diff -@findex magit-diff-buffer-file -@findex magit-log -@findex magit-log-buffer-file -@findex magit-log-trace-definition -@findex magit-log-merged -@findex magit-blame -@findex magit-blame-additions -@findex magit-blame-removal -@findex magit-blame-reverse -@findex magit-blame-echo -@findex magit-blame-quit -@findex magit-blob-previous -@findex magit-blob-next -@findex magit-find-file -@findex magit-blob-visit-file -@findex magit-status-here -@findex magit-display-repository-buffer -@findex magit-commit -@findex magit-edit-line-commit -Each of these commands is documented individually right below, -alongside their default key bindings. The bindings shown above -are the recommended bindings, which you can enable by following -the instructions further up. - -@item @kbd{C-c M-g} (@code{magit-file-dispatch}) -@kindex C-c M-g -@findex magit-file-dispatch -This transient prefix command binds the following suffix commands -and displays them in a temporary buffer until a suffix is invoked. - -@item @kbd{C-c M-g s} (@code{magit-stage-file}) -@itemx @kbd{C-c M-g s} (@code{magit-stage-buffer-file}) -@kindex C-c M-g s -@kindex C-c M-g s -@findex magit-stage-file -@findex magit-stage-buffer-file -Stage all changes to the file being visited in the current buffer. -When not visiting a file, then the first command is used, which -prompts for a file. - -@item @kbd{C-c M-g u} (@code{magit-unstage-file}) -@itemx @kbd{C-c M-g u} (@code{magit-unstage-buffer-file}) -@kindex C-c M-g u -@kindex C-c M-g u -@findex magit-unstage-file -@findex magit-unstage-buffer-file -Unstage all changes to the file being visited in the current buffer. -When not visiting a file, then the first command is used, which -prompts for a file. - -@item @kbd{C-c M-g , x} (@code{magit-file-untrack}) -@kindex C-c M-g , x -@findex magit-file-untrack -This command untracks a file read from the user, defaulting to the -visited file. - -@item @kbd{C-c M-g , r} (@code{magit-file-rename}) -@kindex C-c M-g , r -@findex magit-file-rename -This command renames a file read from the user, defaulting to the -visited file. - -@item @kbd{C-c M-g , k} (@code{magit-file-delete}) -@kindex C-c M-g , k -@findex magit-file-delete -This command deletes a file read from the user, defaulting to the -visited file. - -@item @kbd{C-c M-g , c} (@code{magit-file-checkout}) -@kindex C-c M-g , c -@findex magit-file-checkout -This command updates a file in the working tree and index to the -contents from a revision. Both the revision and file are read -from the user. - -@item @kbd{C-c M-g D} (@code{magit-diff}) -@kindex C-c M-g D -@findex magit-diff -This transient prefix command binds several diff suffix commands and -infix arguments and displays them in a temporary buffer until a -suffix is invoked. See @ref{Diffing}. - -This is the same command that @code{d} is bound to in Magit buffers. -If this command is invoked from a file-visiting buffer, then the -initial value of the option (@code{--}) that limits the diff to certain -file(s) is set to the visited file. - -@item @kbd{C-c M-g d} (@code{magit-diff-buffer-file}) -@kindex C-c M-g d -@findex magit-diff-buffer-file -This command shows the diff for the file of blob that the current -buffer visits. -@end table - -@defopt magit-diff-buffer-file-locked -This option controls whether @code{magit-diff-buffer-file} uses a dedicated -buffer. See @ref{Modes and Buffers}. -@end defopt - -@table @asis -@item @kbd{C-c M-g L} (@code{magit-log}) -@kindex C-c M-g L -@findex magit-log -This transient prefix command binds several log suffix commands and -infix arguments and displays them in a temporary buffer until a -suffix is invoked. See @ref{Logging}. - -This is the same command that @code{l} is bound to in Magit buffers. -If this command is invoked from a file-visiting buffer, then the -initial value of the option (@code{--}) that limits the log to certain -file(s) is set to the visited file. - -@item @kbd{C-c M-g l} (@code{magit-log-buffer-file}) -@kindex C-c M-g l -@findex magit-log-buffer-file -This command shows the log for the file of blob that the current -buffer visits. Renames are followed when a prefix argument is used -or when @code{--follow} is an active log argument. When the region is -active, the log is restricted to the selected line range. -@end table - -@defopt magit-log-buffer-file-locked -This option controls whether @code{magit-log-buffer-file} uses a dedicated -buffer. See @ref{Modes and Buffers}. -@end defopt - -@table @asis -@item @kbd{C-c M-g t} (@code{magit-log-trace-definition}) -@kindex C-c M-g t -@findex magit-log-trace-definition -This command shows the log for the definition at point. - -@item @kbd{C-c M-g M} (@code{magit-log-merged}) -@kindex C-c M-g M -@findex magit-log-merged -This command reads a commit and a branch in shows a log concerning -the merge of the former into the latter. This shows multiple commits -even in case of a fast-forward merge. - -@item @kbd{C-c M-g B} (@code{magit-blame}) -@kindex C-c M-g B -@findex magit-blame -This transient prefix command binds all blaming suffix commands -along with the appropriate infix arguments and displays them in a -temporary buffer until a suffix is invoked. - -For more information about this and the following commands also see -@ref{Blaming}. - -In addition to the @code{magit-blame} sub-transient, the dispatch transient -also binds several blaming suffix commands directly. See @ref{Blaming} -for information about those commands and bindings. - -@item @kbd{C-c M-g p} (@code{magit-blob-previous}) -@kindex C-c M-g p -@findex magit-blob-previous -This command visits the previous blob which modified the current -file. - -@item @kbd{C-c M-g n} (@code{magit-blob-next}) -@kindex C-c M-g n -@findex magit-blob-next -This command visits the next blob which modified the current file. - -@item @kbd{C-c M-g v} (@code{magit-find-file}) -@kindex C-c M-g v -@findex magit-find-file -This command reads a revision and file and visits the respective -blob. - -@item @kbd{C-c M-g V} (@code{magit-blob-visit-file}) -@kindex C-c M-g V -@findex magit-blob-visit-file -This command visits the file from the working tree, corresponding -to the current blob. When visiting a blob or the version from the -index, then it goes to the same location in the respective file in -the working tree. - -@item @kbd{C-c M-g g} (@code{magit-status-here}) -@kindex C-c M-g g -@findex magit-status-here -This command displays the status of the current repository in a -buffer, like @code{magit-status} does. Additionally it tries to go to -the position in that buffer, which corresponds to the position -in the current file-visiting buffer (if any). - -@item @kbd{C-c M-g G} (@code{magit-display-repository-buffer}) -@kindex C-c M-g G -@findex magit-display-repository-buffer -This command reads and displays a Magit buffer belonging to the -current repository, without refreshing it. - -@item @kbd{C-c M-g c} (@code{magit-commit}) -@kindex C-c M-g c -@findex magit-commit -This transient prefix command binds the following suffix commands -along with the appropriate infix arguments and displays them in a -temporary buffer until a suffix is invoked. See @ref{Initiating a Commit}. - -@item @kbd{C-c M-g e} (@code{magit-edit-line-commit}) -@kindex C-c M-g e -@findex magit-edit-line-commit -This command makes the commit editable that added the current line. - -With a prefix argument it makes the commit editable that removes the -line, if any. The commit is determined using @code{git blame} and made -editable using @code{git rebase --interactive} if it is reachable from -@code{HEAD}, or by checking out the commit (or a branch that points at it) -otherwise. -@end table - -@node Minor Mode for Buffers Visiting Blobs -@section Minor Mode for Buffers Visiting Blobs - -The @code{magit-blob-mode} enables certain Magit features in blob-visiting -buffers. Such buffers can be created using @code{magit-find-file} and some -of the commands mentioned below, which also take care of turning on -this minor mode. Currently this mode only establishes a few key -bindings, but this might be extended. - -@table @asis -@item @kbd{p} (@code{magit-blob-previous}) -@kindex p -@findex magit-blob-previous -Visit the previous blob which modified the current file. - -@item @kbd{n} (@code{magit-blob-next}) -@kindex n -@findex magit-blob-next -Visit the next blob which modified the current file. - -@item @kbd{q} (@code{magit-kill-this-buffer}) -@kindex q -@findex magit-kill-this-buffer -Kill the current buffer. -@end table - -@node Customizing -@chapter Customizing - -Both Git and Emacs are highly customizable. Magit is both a Git -porcelain as well as an Emacs package, so it makes sense to customize -it using both Git variables as well as Emacs options. However this -flexibility doesn't come without problems, including but not limited -to the following. - -@itemize -@item -Some Git variables automatically have an effect in Magit without -requiring any explicit support. Sometimes that is desirable - in -other cases, it breaks Magit. - -When a certain Git setting breaks Magit but you want to keep using -that setting on the command line, then that can be accomplished by -overriding the value for Magit only by appending something like -@code{("-c" "some.variable=compatible-value")} to -@code{magit-git-global-arguments}. - -@item -Certain settings like @code{fetch.prune=true} are respected by Magit -commands (because they simply call the respective Git command) but -their value is not reflected in the respective transient buffers. -In this case the @code{--prune} argument in @code{magit-fetch} might be active or -inactive, but that doesn't keep the Git variable from being honored -by the suffix commands anyway. So pruning might happen despite the -@code{--prune} arguments being displayed in a way that seems to indicate -that no pruning will happen. -@end itemize - -I intend to address these and similar issues in a future release. - -@menu -* Per-Repository Configuration:: -* Essential Settings:: -@end menu - -@node Per-Repository Configuration -@section Per-Repository Configuration - -Magit can be configured on a per-repository level using both Git -variables as well as Emacs options. - -To set a Git variable for one repository only, simply set it in -@code{/path/to/repo/.git/config} instead of @code{$HOME/.gitconfig} or -@code{/etc/gitconfig}. See -@ifinfo -@ref{git-config,,,gitman,}. -@end ifinfo -@ifhtml -@html -the <a href="http://git-scm.com/docs/git-config">git-config(1)</a> manpage. -@end html -@end ifhtml -@iftex -the git-config(1) manpage. -@end iftex - -Similarly, Emacs options can be set for one repository only by editing -@code{/path/to/repo/.dir-locals.el}. See @ref{Directory Variables,,,emacs,}. -For example to disable automatic refreshes of file-visiting buffers in -just one huge repository use this: - -@itemize -@item -@code{/path/to/huge/repo/.dir-locals.el} - -@lisp -((nil . ((magit-refresh-buffers . nil)))) -@end lisp -@end itemize - -It might only be costly to insert certain information into Magit -buffers for repositories that are exceptionally large, in which case -you can disable the respective section inserters just for that -repository: - -@itemize -@item -@code{/path/to/tag/invested/repo/.dir-locals.el} - -@lisp -((magit-status-mode - . ((eval . (magit-disable-section-inserter 'magit-insert-tags-header))))) -@end lisp -@end itemize - -@defun magit-disable-section-inserter fn -This function disables the section inserter FN in the current -repository. It is only intended for use in @code{.dir-locals.el} and -@code{.dir-locals-2.el}. -@end defun - -If you want to apply the same settings to several, but not all, -repositories then keeping the repository-local config files in sync -would quickly become annoying. To avoid that you can create config -files for certain classes of repositories (e.g., "huge repositories") -and then include those files in the per-repository config files. -For example: - -@itemize -@item -@code{/path/to/huge/repo/.git/config} - -@example -[include] - path = /path/to/huge-gitconfig -@end example - -@item -@code{/path/to/huge-gitconfig} - -@example -[status] - showUntrackedFiles = no -@end example - -@item -@code{$HOME/.emacs.d/init.el} - -@lisp -(dir-locals-set-class-variables 'huge-git-repository - '((nil . ((magit-refresh-buffers . nil))))) - -(dir-locals-set-directory-class - "/path/to/huge/repo/" 'huge-git-repository) -@end lisp -@end itemize - -@node Essential Settings -@section Essential Settings - -The next three sections list and discuss several variables that many -users might want to customize, for safety and/or performance reasons. - -@menu -* Safety:: -* Performance:: -* Global Bindings:: -@end menu - -@node Safety -@subsection Safety - -This section discusses various variables that you might want to -change (or @strong{not} change) for safety reasons. - -Git keeps @strong{committed} changes around long enough for users to recover -changes they have accidentally been deleted. It does not do the same -for @strong{uncommitted} changes in the working tree and not even the index -(the staging area). Because Magit makes it so easy to modify -uncommitted changes, it also makes it easy to shoot yourself in the -foot in the process. For that reason Magit provides three global -modes that save @strong{tracked} files to work-in-progress references after or -before certain actions. See @ref{Wip Modes}. - -These modes are not enabled by default because of performance -concerns. Instead a lot of potentially destructive commands require -confirmation every time they are used. In many cases this can be -disabled by adding a symbol to @code{magit-no-confirm} (see @ref{Completion and Confirmation}). If you enable the various wip modes then you should -add @code{safe-with-wip} to this list. - -Similarly it isn't necessary to require confirmation before moving a -file to the system trash - if you trashed a file by mistake then you -can recover it from there. Option @code{magit-delete-by-moving-to-trash} -controls whether the system trash is used, which is the case by default. -Nevertheless, @code{trash} isn't a member of @code{magit-no-confirm} - you -might want to change that. - -By default buffers visiting files are automatically reverted when the -visited file changes on disk. This isn't as risky as it might seem, -but to make an informed decision you should see @ref{Risk of Reverting Automatically}. - -@node Performance -@subsection Performance - -After Magit has run @code{git} for side-effects, it also refreshes the -current Magit buffer and the respective status buffer. This is -necessary because otherwise outdated information might be displayed -without the user noticing. Magit buffers are updated by recreating -their content from scratch, which makes updating simpler and less -error-prone, but also more costly. Keeping it simple and just -re-creating everything from scratch is an old design decision and -departing from that will require major refactoring. - -Meanwhile you can tell Magit to only automatically refresh the current -Magit buffer, but not the status buffer. If you do that, then the -status buffer is only refreshed automatically if it is the -current buffer. - -@lisp -(setq magit-refresh-status-buffer nil) -@end lisp - -You should also check whether any third-party packages have added -anything to @code{magit-refresh-buffer-hook}, @code{magit-pre-refresh-hook}, and -@code{magit-post-refresh-hook}. If so, then check whether those additions -impact performance significantly. - -Magit can be told to refresh buffers verbosely using @code{M-x -magit-toggle-verbose-refresh}. Enabling this helps figuring out which -sections are bottlenecks. Each line printed to the @code{*Messages*} buffer -contains a section name, the number of seconds it took to show this -section, and from 0 to 2 exclamation marks: the more exclamation marks -the slower the section is. - -Magit also reverts buffers for visited files located inside the -current repository when the visited file changes on disk. That is -implemented on top of @code{auto-revert-mode} from the built-in library -@code{autorevert}. To figure out whether that impacts performance, check -whether performance is significantly worse, when many buffers exist -and/or when some buffers visit files using TRAMP@. If so, then this -should help. - -@lisp -(setq auto-revert-buffer-list-filter - 'magit-auto-revert-repository-buffer-p) -@end lisp - -For alternative approaches see @ref{Automatic Reverting of File-Visiting Buffers}. - -If you have enabled any features that are disabled by default, then -you should check whether they impact performance significantly. It's -likely that they were not enabled by default because it is known that -they reduce performance at least in large repositories. - -If performance is only slow inside certain unusually large -repositories, then you might want to disable certain features on a -per-repository or per-repository-class basis only. See -@ref{Per-Repository Configuration}. For example it takes a long time to -determine the next and current tag in repository with exceptional -numbers of tags. It would therefore be a good idea to disable -@code{magit-insert-tags-headers}, as explained at the mentioned node. - -@menu -* Microsoft Windows Performance:: -* MacOS Performance:: -@end menu - -@anchor{Log Performance} -@subsubheading Log Performance - -When showing logs, Magit limits the number of commits initially shown -in the hope that this avoids unnecessary work. When @code{--graph} is -used, then this unfortunately does not have the desired effect for -large histories. Junio, Git's maintainer, said on the Git mailing -list (@uref{https://www.spinics.net/lists/git/msg232230.html}): "@code{--graph} wants -to compute the whole history and the max-count only affects the output -phase after @code{--graph} does its computation". - -In other words, it's not that Git is slow at outputting the -differences, or that Magit is slow at parsing the output - the problem -is that Git first goes outside and has a smoke. - -We actually work around this issue by limiting the number of commits -not only by using @code{-<N>} but by also using a range. But unfortunately -that's not always possible. - -When more than a few thousand commits are shown, then the use of -@code{--graph} can slow things down. - -Using @code{--color --graph} is even slower. Magit uses code that is part of -Emacs to turn control characters into faces. That code is pretty slow -and this is quite noticeable when showing a log with many branches and -merges. For that reason @code{--color} is not enabled by default anymore. -Consider leaving it at that. - -@anchor{Diff Performance} -@subsubheading Diff Performance - -If diffs are slow, then consider turning off some optional diff -features by setting all or some of the following variables to @code{nil}: -@code{magit-diff-highlight-indentation}, @code{magit-diff-highlight-trailing}, -@code{magit-diff-paint-whitespace}, @code{magit-diff-highlight-hunk-body}, and -@code{magit-diff-refine-hunk}. - -When showing a commit instead of some arbitrary diff, then some -additional information is displayed. Calculating this information -can be quite expensive given certain circumstances. If looking at -a commit using @code{magit-revision-mode} takes considerably more time than -looking at the same commit in @code{magit-diff-mode}, then consider setting -@code{magit-revision-insert-related-refs} to @code{nil}. - -When you are often confronted with diffs that contain deleted files, -then you might want to enable the @code{--irreversible-delete} argument. If -you do that then diffs still show that a file was deleted but without -also showing the complete deleted content of the file. This argument -is not available by default, see @ref{Enabling and Disabling Suffixes,,,transient,}. Once you have done that you should enable it and save that -setting, see @ref{Saving Values,,,transient,}. You should do this in both -the diff (@code{d}) and the diff refresh (@code{D}) transient popups. - -@anchor{Refs Buffer Performance} -@subsubheading Refs Buffer Performance - -When refreshing the "references buffer" is slow, then that's usually -because several hundred refs are being displayed. The best way to -address that is to display fewer refs, obviously. - -If you are not, or only mildly, interested in seeing the list of tags, -then start by not displaying them: - -@lisp -(remove-hook 'magit-refs-sections-hook 'magit-insert-tags) -@end lisp - -Then you should also make sure that the listed remote branches -actually all exist. You can do so by pruning branches which no longer -exist using @code{f-pa}. - -@anchor{Committing Performance} -@subsubheading Committing Performance - -When you initiate a commit, then Magit by default automatically shows -a diff of the changes you are about to commit. For large commits this -can take a long time, which is especially distracting when you are -committing large amounts of generated data which you don't actually -intend to inspect before committing. This behavior can be turned off -using: - -@lisp -(remove-hook 'server-switch-hook 'magit-commit-diff) -(remove-hook 'with-editor-filter-visit-hook 'magit-commit-diff) -@end lisp - -Then you can type @code{C-c C-d} to show the diff when you actually want to -see it, but only then. Alternatively you can leave the hook alone and -just type @code{C-g} in those cases when it takes too long to generate the -diff. If you do that, then you will end up with a broken diff buffer, -but doing it this way has the advantage that you usually get to see -the diff, which is useful because it increases the odds that you spot -potential issues. - -@node Microsoft Windows Performance -@unnumberedsubsubsec Microsoft Windows Performance - -In order to update the status buffer, @code{git} has to be run a few dozen -times. That is problematic on Microsoft Windows, because that -operating system is exceptionally slow at starting processes. Sadly -this is an issue that can only be fixed by Microsoft itself, and they -don't appear to be particularly interested in doing so. - -Beside the subprocess issue, there are also other Windows-specific -performance issues. Some of these have workarounds. The -maintainers of "Git for Windows" try to improve performance on Windows. -Always use the latest release in order to benefit from the latest -performance tweaks. Magit too tries to work around some -Windows-specific issues. - -According to some sources, setting the following Git variables can also -help. - -@example -git config --global core.preloadindex true # default since v2.1 -git config --global core.fscache true # default since v2.8 -git config --global gc.auto 256 -@end example - -You should also check whether an anti-virus program is affecting -performance. - -@node MacOS Performance -@unnumberedsubsubsec MacOS Performance - -Before Emacs 26.1 child processes were created using @code{fork} on macOS@. -That needlessly copied GUI resources, which is expensive. The result -was that forking took about 30 times as long on Darwin than on Linux, -and because Magit starts many @code{git} processes that made quite a -difference. - -So make sure that you are using at least Emacs 26.1, in which case the -faster @code{vfork} will be used. (The creation of child processes still -takes about twice as long on Darwin compared to Linux.) See @footnote{@uref{https://lists.gnu.org/archive/html/bug-gnu-emacs/2017-04/msg00201.html}} -for more information. - -Additionally, @code{git} installed from a package manager like @code{brew} or @code{nix} -seems to be slower than the native executable. Profile the @code{git} -executable you're running against the one at @code{/usr/bin/git}, and if -you notice a notable difference try using the latter as -@code{magit-git-executable}. - -@node Global Bindings -@subsection Global Bindings - -@defopt magit-define-global-key-bindings -This option controls which set of Magit key bindings, if any, may -be added to the global keymap, even before Magit is first used in -the current Emacs session. - -@itemize -@item -If the value is @code{nil}, no bindings are added. - -@item -If @code{default}, maybe add: - -@multitable {aaaaaaaaa} {aaaaaaaaaaaaaaaaaaaaa} -@item @code{C-x g} -@tab @code{magit-status} -@item @code{C-x M-g} -@tab @code{magit-dispatch} -@item @code{C-c M-g} -@tab @code{magit-file-dispatch} -@end multitable - -@item -If @code{recommended}, maybe add: - -@multitable {aaaaaaa} {aaaaaaaaaaaaaaaaaaaaa} -@item @code{C-x g} -@tab @code{magit-status} -@item @code{C-c g} -@tab @code{magit-dispatch} -@item @code{C-c f} -@tab @code{magit-file-dispatch} -@end multitable - -These bindings are strongly recommended, but we cannot use -them by default, because the @code{C-c <LETTER>} namespace is -strictly reserved for bindings added by the user (see -@ref{Key Binding Conventions,,,elisp,}). -@end itemize - -The bindings in the chosen set may be added when -@code{after-init-hook} is run. Each binding is added if, and only -if, at that time no other key is bound to the same command, -and no other command is bound to the same key. In other words -we try to avoid adding bindings that are unnecessary, as well -as bindings that conflict with other bindings. - -Adding these bindings is delayed until @code{after-init-hook} is -run to allow users to set the variable anywhere in their init -file (without having to make sure to do so before @code{magit} is -loaded or autoloaded) and to increase the likelihood that all -the potentially conflicting user bindings have already been -added. - -To set this variable use either @code{setq} or the Custom interface. -Do not use the function @code{customize-set-variable} because doing -that would cause Magit to be loaded immediately, when that form -is evaluated (this differs from @code{custom-set-variables}, which -doesn't load the libraries that define the customized variables). - -Setting this variable has no effect if @code{after-init-hook} has -already been run. -@end defopt - -@node Plumbing -@chapter Plumbing - -The following sections describe how to use several of Magit's core -abstractions to extend Magit itself or implement a separate extension. - -A few of the low-level features used by Magit have been factored out -into separate libraries/packages, so that they can be used by other -packages, without having to depend on Magit. See @ref{Top,,,with-editor,} for -information about @code{with-editor}. @code{transient} doesn't have a manual yet. - -If you are trying to find an unused key that you can bind to a -command provided by your own Magit extension, then checkout -@uref{https://github.com/magit/magit/wiki/Plugin-Dispatch-Key-Registry}. - -@menu -* Calling Git:: -* Section Plumbing:: -* Refreshing Buffers:: -* Conventions:: -@end menu - -@node Calling Git -@section Calling Git - -Magit provides many specialized functions for calling Git. All of -these functions are defined in either @code{magit-git.el} or @code{magit-process.el} -and have one of the prefixes @code{magit-run-}, @code{magit-call-}, @code{magit-start-}, -or @code{magit-git-} (which is also used for other things). - -All of these functions accept an indefinite number of arguments, which -are strings that specify command line arguments for Git (or in some -cases an arbitrary executable). These arguments are flattened before -being passed on to the executable; so instead of strings they can also -be lists of strings and arguments that are @code{nil} are silently dropped. -Some of these functions also require a single mandatory argument -before these command line arguments. - -Roughly speaking, these functions run Git either to get some value or -for side-effects. The functions that return a value are useful to -collect the information necessary to populate a Magit buffer, while -the others are used to implement Magit commands. - -The functions in the value-only group always run synchronously, and -they never trigger a refresh. The function in the side-effect group -can be further divided into subgroups depending on whether they run -Git synchronously or asynchronously, and depending on whether they -trigger a refresh when the executable has finished. - -@menu -* Getting a Value from Git:: -* Calling Git for Effect:: -@end menu - -@node Getting a Value from Git -@subsection Getting a Value from Git - -These functions run Git in order to get a value, an exit -status, or output. Of course you could also use them to run Git -commands that have side-effects, but that should be avoided. - -@defun magit-git-exit-code &rest args -Executes git with ARGS and returns its exit code. -@end defun - -@defun magit-git-success &rest args -Executes git with ARGS and returns @code{t} if the exit code is @code{0}, @code{nil} -otherwise. -@end defun - -@defun magit-git-failure &rest args -Executes git with ARGS and returns @code{t} if the exit code is @code{1}, @code{nil} -otherwise. -@end defun - -@defun magit-git-true &rest args -Executes git with ARGS and returns @code{t} if the first line printed by -git is the string "true", @code{nil} otherwise. -@end defun - -@defun magit-git-false &rest args -Executes git with ARGS and returns @code{t} if the first line printed by -git is the string "false", @code{nil} otherwise. -@end defun - -@defun magit-git-insert &rest args -Executes git with ARGS and inserts its output at point. -@end defun - -@defun magit-git-string &rest args -Executes git with ARGS and returns the first line of its output. If -there is no output or if it begins with a newline character, then -this returns @code{nil}. -@end defun - -@defun magit-git-lines &rest args -Executes git with ARGS and returns its output as a list of lines. -Empty lines anywhere in the output are omitted. -@end defun - -@defun magit-git-items &rest args -Executes git with ARGS and returns its null-separated output as a -list. Empty items anywhere in the output are omitted. - -If the value of option @code{magit-git-debug} is non-nil and git exits with -a non-zero exit status, then warn about that in the echo area and -add a section containing git's standard error in the current -repository's process buffer. -@end defun - -@defun magit-process-git destination &rest args -Calls Git synchronously in a separate process, returning its exit -code. DESTINATION specifies how to handle the output, like for -@code{call-process}, except that file handlers are supported. Enables -Cygwin's "noglob" option during the call and ensures unix eol -conversion. -@end defun - -@defun magit-process-file process &optional infile buffer display &rest args -Processes files synchronously in a separate process. Identical to -@code{process-file} but temporarily enables Cygwin's "noglob" option during -the call and ensures unix eol conversion. -@end defun - -If an error occurs when using one of the above functions, then that -is usually due to a bug, i.e., using an argument which is not -actually supported. Such errors are usually not reported, but when -they occur we need to be able to debug them. - -@defopt magit-git-debug -Whether to report errors that occur when using @code{magit-git-insert}, -@code{magit-git-string}, @code{magit-git-lines}, or @code{magit-git-items}. This does -not actually raise an error. Instead a message is shown in the echo -area, and git's standard error is insert into a new section in the -current repository's process buffer. -@end defopt - -@defun magit-git-str &rest args -This is a variant of @code{magit-git-string} that ignores the option -@code{magit-git-debug}. It is mainly intended to be used while handling -errors in functions that do respect that option. Using such a -function while handing an error could cause yet another error and -therefore lead to an infinite recursion. You probably won't ever -need to use this function. -@end defun - -@node Calling Git for Effect -@subsection Calling Git for Effect - -These functions are used to run git to produce some effect. Most -Magit commands that actually run git do so by using such a function. - -Because we do not need to consume git's output when using these -functions, their output is instead logged into a per-repository -buffer, which can be shown using @code{$} from a Magit buffer or @code{M-x -magit-process} elsewhere. - -These functions can have an effect in two distinct ways. Firstly, -running git may change something, i.e., create or push a new commit. -Secondly, that change may require that Magit buffers are refreshed to -reflect the changed state of the repository. But refreshing isn't -always desirable, so only some of these functions do perform such a -refresh after git has returned. - -Sometimes it is useful to run git asynchronously. For example, when -the user has just initiated a push, then there is no reason to make -her wait until that has completed. In other cases it makes sense to -wait for git to complete before letting the user do something else. -For example after staging a change it is useful to wait until after -the refresh because that also automatically moves to the next change. - -@defun magit-call-git &rest args -Calls git synchronously with ARGS@. -@end defun - -@defun magit-call-process program &rest args -Calls PROGRAM synchronously with ARGS@. -@end defun - -@defun magit-run-git &rest args -Calls git synchronously with ARGS and then refreshes. -@end defun - -@defun magit-run-git-with-input &rest args -Calls git synchronously with ARGS and sends it the content of the -current buffer on standard input. - -If the current buffer's @code{default-directory} is on a remote -filesystem, this function actually runs git asynchronously. But -then it waits for the process to return, so the function itself is -synchronous. -@end defun - -@defun magit-git &rest args -Calls git synchronously with ARGS for side-effects only. This -function does not refresh the buffer. -@end defun - -@defun magit-git-wash washer &rest args -Execute Git with ARGS, inserting washed output at point. Actually -first insert the raw output at point. If there is no output call -@code{magit-cancel-section}. Otherwise temporarily narrow the buffer to -the inserted text, move to its beginning, and then call function -WASHER with ARGS as its sole argument. -@end defun - -And now for the asynchronous variants. - -@defun magit-run-git-async &rest args -Start Git, prepare for refresh, and return the process object. -ARGS is flattened and then used as arguments to Git. - -Display the command line arguments in the echo area. - -After Git returns some buffers are refreshed: the buffer that was -current when this function was called (if it is a Magit buffer and -still alive), as well as the respective Magit status buffer. -Unmodified buffers visiting files that are tracked in the current -repository are reverted if @code{magit-revert-buffers} is non-nil. -@end defun - -@defun magit-run-git-with-editor &rest args -Export GIT@math{_EDITOR} and start Git. Also prepare for refresh and -return the process object. ARGS is flattened and then used as -arguments to Git. - -Display the command line arguments in the echo area. - -After Git returns some buffers are refreshed: the buffer that was -current when this function was called (if it is a Magit buffer and -still alive), as well as the respective Magit status buffer. -@end defun - -@defun magit-start-git input &rest args -Start Git, prepare for refresh, and return the process object. - -If INPUT is non-nil, it has to be a buffer or the name of an -existing buffer. The buffer content becomes the processes -standard input. - -Option @code{magit-git-executable} specifies the Git executable and option -@code{magit-git-global-arguments} specifies constant arguments. The -remaining arguments ARGS specify arguments to Git. They are -flattened before use. - -After Git returns, some buffers are refreshed: the buffer that was -current when this function was called (if it is a Magit buffer and -still alive), as well as the respective Magit status buffer. -Unmodified buffers visiting files that are tracked in the current -repository are reverted if @code{magit-revert-buffers} is non-nil. -@end defun - -@defun magit-start-process &rest args -Start PROGRAM, prepare for refresh, and return the process object. - -If optional argument INPUT is non-nil, it has to be a buffer or -the name of an existing buffer. The buffer content becomes the -processes standard input. - -The process is started using @code{start-file-process} and then setup to -use the sentinel @code{magit-process-sentinel} and the filter -@code{magit-process-filter}. Information required by these functions is -stored in the process object. When this function returns the -process has not started to run yet so it is possible to override the -sentinel and filter. - -After the process returns, @code{magit-process-sentinel} refreshes the -buffer that was current when @code{magit-start-process} was called (if it -is a Magit buffer and still alive), as well as the respective Magit -status buffer. Unmodified buffers visiting files that are tracked -in the current repository are reverted if @code{magit-revert-buffers} is -non-nil. -@end defun - -@defvar magit-this-process -The child process which is about to start. This can be used to -change the filter and sentinel. -@end defvar - -@defvar magit-process-raise-error -When this is non-nil, then @code{magit-process-sentinel} raises an error if -git exits with a non-zero exit status. For debugging purposes. -@end defvar - -@node Section Plumbing -@section Section Plumbing - -@menu -* Creating Sections:: -* Section Selection:: -* Matching Sections:: -@end menu - -@node Creating Sections -@subsection Creating Sections - -@defmac magit-insert-section &rest args -Insert a section at point. - -TYPE is the section type, a symbol. Many commands that act on the -current section behave differently depending on that type. Also if -a variable @code{magit-TYPE-section-map} exists, then use that as the -text-property @code{keymap} of all text belonging to the section (but this -may be overwritten in subsections). TYPE can also have the form -@code{(eval FORM)} in which case FORM is evaluated at runtime. - -Optional VALUE is the value of the section, usually a string that is -required when acting on the section. - -When optional HIDE is non-nil collapse the section body by default, -i.e., when first creating the section, but not when refreshing the -buffer. Otherwise, expand it by default. This can be overwritten using -@code{magit-section-set-visibility-hook}. When a section is recreated -during a refresh, then the visibility of predecessor is inherited -and HIDE is ignored (but the hook is still honored). - -BODY is any number of forms that actually insert the section's -heading and body. Optional NAME, if specified, has to be a symbol, -which is then bound to the struct of the section being inserted. - -Before BODY is evaluated the @code{start} of the section object is set to -the value of @code{point} and after BODY was evaluated its @code{end} is set to -the new value of @code{point}; BODY is responsible for moving @code{point} -forward. - -If it turns out inside BODY that the section is empty, then -@code{magit-cancel-section} can be used to abort and remove all traces of -the partially inserted section. This can happen when creating a -section by washing Git's output and Git didn't actually output -anything this time around. -@end defmac - -@defun magit-insert-heading &rest args -Insert the heading for the section currently being inserted. - -This function should only be used inside @code{magit-insert-section}. - -When called without any arguments, then just set the @code{content} slot of -the object representing the section being inserted to a marker at -@code{point}. The section should only contain a single line when this -function is used like this. - -When called with arguments ARGS, which have to be strings, then -insert those strings at point. The section should not contain any -text before this happens and afterwards it should again only contain -a single line. If the @code{face} property is set anywhere inside any of -these strings, then insert all of them unchanged. Otherwise use the -@code{magit-section-heading} face for all inserted text. - -The @code{content} property of the section struct is the end of the heading -(which lasts from @code{start} to @code{content}) and the beginning of the body -(which lasts from @code{content} to @code{end}). If the value of @code{content} is nil, -then the section has no heading and its body cannot be collapsed. -If a section does have a heading then its height must be exactly one -line, including a trailing newline character. This isn't enforced; -you are responsible for getting it right. The only exception is -that this function does insert a newline character if necessary. -@end defun - -@defun magit-cancel-section -Cancel the section currently being inserted. This exits the -innermost call to @code{magit-insert-section} and removes all traces of -what has already happened inside that call. -@end defun - -@defun magit-define-section-jumper sym title &optional value -Define an interactive function to go to section SYM@. TITLE is the -displayed title of the section. -@end defun - -@node Section Selection -@subsection Section Selection - -@defun magit-current-section -Return the section at point. -@end defun - -@defun magit-region-sections &optional condition multiple -Return a list of the selected sections. - -When the region is active and constitutes a valid section -selection, then return a list of all selected sections. This is -the case when the region begins in the heading of a section and -ends in the heading of the same section or in that of a sibling -section. If optional MULTIPLE is non-nil, then the region cannot -begin and end in the same section. - -When the selection is not valid, then return nil. In this case, -most commands that can act on the selected sections will instead -act on the section at point. - -When the region looks like it would in any other buffer then -the selection is invalid. When the selection is valid then the -region uses the @code{magit-section-highlight} face. This does not -apply to diffs where things get a bit more complicated, but even -here if the region looks like it usually does, then that's not -a valid selection as far as this function is concerned. - -If optional CONDITION is non-nil, then the selection not only -has to be valid; all selected sections additionally have to match -CONDITION, or nil is returned. See @code{magit-section-match} for the -forms CONDITION can take. -@end defun - -@defun magit-region-values &optional condition multiple -Return a list of the values of the selected sections. - -Return the values that themselves would be returned by -@code{magit-region-sections} (which see). -@end defun - -@node Matching Sections -@subsection Matching Sections - -@table @asis -@item @kbd{M-x magit-describe-section-briefly} -@findex magit-describe-section-briefly -Show information about the section at point. This command is -intended for debugging purposes. -@end table - -@defun magit-section-ident section -Return an unique identifier for SECTION@. The return value has the -form @code{((TYPE . VALUE)...)}. -@end defun - -@defun magit-get-section ident &optional root -Return the section identified by IDENT@. IDENT has to be a list as -returned by @code{magit-section-ident}. -@end defun - -@defun magit-section-match condition &optional section -Return @code{t} if SECTION matches CONDITION@. -SECTION defaults to the section at point. If SECTION is not -specified and there also is no section at point, then return -@code{nil}. - -CONDITION can take the following forms: -@itemize -@item -@code{(CONDITION...)} - -matches if any of the CONDITIONs matches. - -@item -@code{[CLASS...]} - -matches if the section's class is the same -as the first CLASS or a subclass of that; -the section's parent class matches the -second CLASS; and so on. - -@item -@code{[* CLASS...]} - -matches sections that match @code{[CLASS...]} and -also recursively all their child sections. - -@item -@code{CLASS} - -matches if the section's class is the same -as CLASS or a subclass of that; regardless -of the classes of the parent sections. -@end itemize - -Each CLASS should be a class symbol, identifying a class that -derives from @code{magit-section}. For backward compatibility CLASS -can also be a "type symbol". A section matches such a symbol -if the value of its @code{type} slot is @code{eq}. If a type symbol has -an entry in @code{magit--section-type-alist}, then a section also -matches that type if its class is a subclass of the class that -corresponds to the type as per that alist. - -Note that it is not necessary to specify the complete section -lineage as printed by @code{magit-describe-section-briefly}, unless -of course you want to be that precise. -@end defun - -@defun magit-section-value-if condition &optional section -If the section at point matches CONDITION, then return its value. - -If optional SECTION is non-nil then test whether that matches -instead. If there is no section at point and SECTION is nil, -then return nil. If the section does not match, then return -nil. - -See @code{magit-section-match} for the forms CONDITION can take. -@end defun - -@defun magit-section-case &rest clauses -Choose among clauses on the type of the section at point. - -Each clause looks like (CONDITION BODY@dots{}). The type of the -section is compared against each CONDITION; the BODY forms of the -first match are evaluated sequentially and the value of the last -form is returned. Inside BODY the symbol @code{it} is bound to the -section at point. If no clause succeeds or if there is no -section at point return nil. - -See @code{magit-section-match} for the forms CONDITION can take. -Additionally a CONDITION of t is allowed in the final clause and -matches if no other CONDITION match, even if there is no section at -point. -@end defun - -@defvar magit-root-section -The root section in the current buffer. All other sections are -descendants of this section. The value of this variable is set by -@code{magit-insert-section} and you should never modify it. -@end defvar - -For diff related sections a few additional tools exist. - -@defun magit-diff-type &optional section -Return the diff type of SECTION@. - -The returned type is one of the symbols @code{staged}, @code{unstaged}, @code{committed}, -or @code{undefined}. This type serves a similar purpose as the general -type common to all sections (which is stored in the @code{type} slot of the -corresponding @code{magit-section} struct) but takes additional information -into account. When the SECTION isn't related to diffs and the -buffer containing it also isn't a diff-only buffer, then return nil. - -Currently the type can also be one of @code{tracked} and @code{untracked}, but -these values are not handled explicitly in every place they should -be. A possible fix could be to just return nil here. - -The section has to be a @code{diff} or @code{hunk} section, or a section whose -children are of type @code{diff}. If optional SECTION is nil, return the -diff type for the current section. In buffers whose major mode is -@code{magit-diff-mode} SECTION is ignored and the type is determined using -other means. In @code{magit-revision-mode} buffers the type is always -@code{committed}. -@end defun - -@defun magit-diff-scope &optional section strict -Return the diff scope of SECTION or the selected section(s). - -A diff's "scope" describes what part of a diff is selected, it is a -symbol, one of @code{region}, @code{hunk}, @code{hunks}, @code{file}, @code{files}, or @code{list}. Do not -confuse this with the diff "type", as returned by @code{magit-diff-type}. - -If optional SECTION is non-nil, then return the scope of that, -ignoring the sections selected by the region. Otherwise return the -scope of the current section, or if the region is active and selects -a valid group of diff related sections, the type of these sections, -i.e., @code{hunks} or @code{files}. If SECTION (or if the current section that -is nil) is a @code{hunk} section and the region starts and ends inside -the body of a that section, then the type is @code{region}. - -If optional STRICT is non-nil then return nil if the diff type of -the section at point is @code{untracked} or the section at point is not -actually a @code{diff} but a @code{diffstat} section. -@end defun - -@node Refreshing Buffers -@section Refreshing Buffers - -All commands that create a new Magit buffer or change what is being -displayed in an existing buffer do so by calling @code{magit-mode-setup}. -Among other things, that function sets the buffer local values of -@code{default-directory} (to the top-level of the repository), -@code{magit-refresh-function}, and @code{magit-refresh-args}. - -Buffers are refreshed by calling the function that is the local value -of @code{magit-refresh-function} (a function named @code{magit-*-refresh-buffer}, -where @code{*} may be something like @code{diff}) with the value of -@code{magit-refresh-args} as arguments. - -@defmac magit-mode-setup buffer switch-func mode refresh-func &optional refresh-args -This function displays and selects BUFFER, turns on MODE, and -refreshes a first time. - -This function displays and optionally selects BUFFER by calling -@code{magit-mode-display-buffer} with BUFFER, MODE and SWITCH-FUNC as -arguments. Then it sets the local value of @code{magit-refresh-function} -to REFRESH-FUNC and that of @code{magit-refresh-args} to REFRESH-ARGS@. -Finally it creates the buffer content by calling REFRESH-FUNC with -REFRESH-ARGS as arguments. - -All arguments are evaluated before switching to BUFFER@. -@end defmac - -@defun magit-mode-display-buffer buffer mode &optional switch-function -This function display BUFFER in some window and select it. BUFFER -may be a buffer or a string, the name of a buffer. The buffer is -returned. - -Unless BUFFER is already displayed in the selected frame, store the -previous window configuration as a buffer local value, so that it -can later be restored by @code{magit-mode-bury-buffer}. - -The buffer is displayed and selected using SWITCH-FUNCTION@. If that -is @code{nil} then @code{pop-to-buffer} is used if the current buffer's major mode -derives from @code{magit-mode}. Otherwise @code{switch-to-buffer} is used. -@end defun - -@defvar magit-refresh-function -The value of this buffer-local variable is the function used to -refresh the current buffer. It is called with @code{magit-refresh-args} as -arguments. -@end defvar - -@defvar magit-refresh-args -The list of arguments used by @code{magit-refresh-function} to refresh the -current buffer. @code{magit-refresh-function} is called with these -arguments. - -The value is usually set using @code{magit-mode-setup}, but in some cases -it's also useful to provide commands that can change the value. For -example, the @code{magit-diff-refresh} transient can be used to change any -of the arguments used to display the diff, without having to specify -again which differences should be shown, but @code{magit-diff-more-context}, -@code{magit-diff-less-context} and @code{magit-diff-default-context} change just -the @code{-U<N>} argument. In both case this is done by changing the value -of this variable and then calling this @code{magit-refresh-function}. -@end defvar - -@node Conventions -@section Conventions - -Also see @ref{Completion and Confirmation}. - -@menu -* Theming Faces:: -@end menu - -@node Theming Faces -@subsection Theming Faces - -The default theme uses blue for local branches, green for remote -branches, and goldenrod (brownish yellow) for tags. When creating a -new theme, you should probably follow that example. If your theme -already uses other colors, then stick to that. - -In older releases these reference faces used to have a background -color and a box around them. The basic default faces no longer do so, -to make Magit buffers much less noisy, and you should follow that -example at least with regards to boxes. (Boxes were used in the past -to work around a conflict between the highlighting overlay and text -property backgrounds. That's no longer necessary because highlighting no -longer causes other background colors to disappear.) Alternatively -you can keep the background color and/or box, but then have to take -special care to adjust @code{magit-branch-current} accordingly. By default -it looks mostly like @code{magit-branch-local}, but with a box (by default -the former is the only face that uses a box, exactly so that it sticks -out). If the former also uses a box, then you have to make sure that -it differs in some other way from the latter. - -The most difficult faces to theme are those related to diffs, -headings, highlighting, and the region. There are faces that fall -into all four groups - expect to spend some time getting this right. - -The @code{region} face in the default theme, in both the light and dark -variants, as well as in many other themes, distributed with Emacs or -by third-parties, is very ugly. It is common to use a background -color that really sticks out, which is ugly but if that were the only -problem then it would be acceptable. Unfortunately many themes also -set the foreground color, which ensures that all text within the -region is readable. Without doing that there might be cases where -some foreground color is too close to the region background color to -still be readable. But it also means that text within the region -loses all syntax highlighting. - -I consider the work that went into getting the @code{region} face right to be -a good indicator for the general quality of a theme. My -recommendation for the @code{region} face is this: use a background color -slightly different from the background color of the @code{default} face, and -do not set the foreground color at all. So for a light theme you -might use a light (possibly tinted) gray as the background color of -@code{default} and a somewhat darker gray for the background of @code{region}. -That should usually be enough to not collide with the foreground color -of any other face. But if some other faces also set a light gray as -background color, then you should also make sure it doesn't collide -with those (in some cases it might be acceptable though). - -Magit only uses the @code{region} face when the region is "invalid" by its -own definition. In a Magit buffer the region is used to either select -multiple sibling sections, so that commands which support it act on -all of these sections instead of just the current section, or to -select lines within a single hunk section. In all other cases, the -section is considered invalid and Magit won't act on it. But such -invalid sections happen, either because the user has not moved point -enough yet to make it valid or because she wants to use a non-magit -command to act on the region, e.g., @code{kill-region}. - -So using the regular @code{region} face for invalid sections is a feature. It -tells the user that Magit won't be able to act on it. It's acceptable -if that face looks a bit odd and even (but less so) if it collides -with the background colors of section headings and other things that -have a background color. - -Magit highlights the current section. If a section has subsections, -then all of them are highlighted. This is done using faces that have -"highlight" in their names. For most sections, @code{magit-section-highlight} -is used for both the body and the heading. Like the @code{region} face, it -should only set the background color to something similar to that of -@code{default}. The highlight background color must be different from both -the @code{region} background color and the @code{default} background color. - -For diff related sections Magit uses various faces to -highlight different parts of the selected section(s). Note that hunk -headings, unlike all other section headings, by default have a -background color, because it is useful to have very visible separators -between hunks. That face @code{magit-diff-hunk-heading}, should be different -from both @code{magit-diff-hunk-heading-highlight} and -@code{magit-section-highlight}, as well as from @code{magit-diff-context} and -@code{magit-diff-context-highlight}. By default we do that by changing the -foreground color. Changing the background color would lead to -complications, and there are already enough we cannot get around. -(Also note that it is generally a good idea for section headings to -always be bold, but only for sections that have subsections). - -When there is a valid region selecting diff-related sibling sections, -i.e., multiple files or hunks, then the bodies of all these sections -use the respective highlight faces, but additionally the headings -instead use one of the faces @code{magit-diff-file-heading-selection} or -@code{magit-diff-hunk-heading-selection}. These faces have to be different -from the regular highlight variants to provide explicit visual -indication that the region is active. - -When theming diff related faces, start by setting the option -@code{magit-diff-refine-hunk} to @code{all}. You might personally prefer to only -refine the current hunk or not use hunk refinement at all, but some of -the users of your theme want all hunks to be refined, so you have to -cater to that. - -(Also turn on @code{magit-diff-highlight-indentation}, -@code{magit-diff-highlight-trailing}, and @code{magit-diff-paint-whitespace}; and -insert some whitespace errors into the code you use for testing.) - -For added lines you have to adjust three faces: -@code{magit-diff-added}, @code{magit-diff-added-highlight}, and -@code{diff-refined-added}. Make sure that the latter works well with both -of the former, as well as @code{smerge-other} and @code{diff-added}. Then do the -same for the removed lines, context lines, lines added by us, and -lines added by them. Also make sure the respective added, removed, -and context faces use approximately the same saturation for both the -highlighted and unhighlighted variants. Also make sure the file and -diff headings work nicely with context lines (e.g., make them look -different). Line faces should set both the foreground and the -background color. For example, for added lines use two different -greens. - -It's best if the foreground color of both the highlighted and the -unhighlighted variants are the same, so you will need to have to find -a color that works well on the highlight and unhighlighted background, -the refine background, and the highlight context background. When -there is an hunk internal region, then the added- and removed-lines -background color is used only within that region. Outside the region -the highlighted context background color is used. This makes it -easier to see what is being staged. With an hunk internal region the -hunk heading is shown using @code{magit-diff-hunk-heading-selection}, and so -are the thin lines that are added around the lines that fall within -the region. The background color of that has to be distinct enough -from the various other involved background colors. - -Nobody said this would be easy. If your theme restricts itself to a -certain set of colors, then you should make an exception here. -Otherwise it would be impossible to make the diffs look good in each -and every variation. Actually you might want to just stick to the -default definitions for these faces. You have been warned. Also -please note that if you do not get this right, this will in some cases -look to users like bugs in Magit - so please do it right or not at -all. - -@node FAQ -@appendix FAQ - -The next two nodes lists frequently asked questions. For a list of -frequently @strong{and recently} asked questions, i.e., questions that haven't -made it into the manual yet, see -@uref{https://github.com/magit/magit/wiki/FAQ}. - -Please also see @ref{Debugging Tools}. - -@menu -* FAQ - How to @dots{}?:: -* FAQ - Issues and Errors:: -@end menu - -@node FAQ - How to @dots{}? -@appendixsec FAQ - How to @dots{}? - -@menu -* How to pronounce Magit?:: -* How to show git's output?:: -* How to install the gitman info manual?:: -* How to show diffs for gpg-encrypted files?:: -* How does branching and pushing work?:: -* Should I disable VC@?:: -@end menu - -@node How to pronounce Magit? -@appendixsubsec How to pronounce Magit? - -Either @code{mu[m's] git} or @code{magi@{c => t@}} is fine. - -The slogan is "It's Magit! The magical Git client", so it makes sense -to pronounce Magit like magic, while taking into account that C and T -do not sound the same. - -The German "Magie" is not pronounced the same as the English "magic", -so if you speak German then you can use the above rationale to justify -using the former pronunciation; @code{Mag@{ie => it@}}. - -You can also choose to use the former pronunciation just because you -like it better. - -Also see @uref{https://magit.vc/assets/videos/magic.mp4}. -Also see @uref{https://emacs.stackexchange.com/questions/13696}. - -@node How to show git's output? -@appendixsubsec How to show git's output? - -To show the output of recently run git commands, press @code{$} (or, if that -isn't available, @code{M-x magit-process-buffer}). This will show a buffer -containing a section per git invocation; as always press @code{TAB} to expand -or collapse them. - -By default, git's output is only inserted into the process buffer if it -is run for side-effects. When the output is consumed in some way, -also inserting it into the process buffer would be too expensive. For -debugging purposes, it's possible to do so anyway by setting -@code{magit-git-debug} to @code{t}. - -@node How to install the gitman info manual? -@appendixsubsec How to install the gitman info manual? - -Git's manpages can be exported as an info manual called @code{gitman}. -Magit's own info manual links to nodes in that manual instead of the -actual manpages because Info doesn't support linking to manpages. - -Unfortunately some distributions do not install the @code{gitman} manual by -default and you will have to install a separate documentation package -to get it. - -Magit patches Info adding the ability to visit links to the @code{gitman} -Info manual by instead viewing the respective manpage. If you prefer -that approach, then set the value of @code{magit-view-git-manual-method} to -one of the supported packages @code{man} or @code{woman}, e.g.: - -@lisp -(setq magit-view-git-manual-method 'man) -@end lisp - -@node How to show diffs for gpg-encrypted files? -@appendixsubsec How to show diffs for gpg-encrypted files? - -Git supports showing diffs for encrypted files, but has to be told to -do so. Since Magit just uses Git to get the diffs, configuring Git -also affects the diffs displayed inside Magit. - -@example -git config --global diff.gpg.textconv "gpg --no-tty --decrypt" -echo "*.gpg filter=gpg diff=gpg" > .gitattributes -@end example - -@node How does branching and pushing work? -@appendixsubsec How does branching and pushing work? - -Please see @ref{Branching} and @uref{https://emacsair.me/2016/01/17/magit-2.4} - -@node Should I disable VC@? -@appendixsubsec Should I disable VC@? - -If you don't use VC (the built-in version control interface) then -you might be tempted to disable it, not least because we used to -recommend that you do that. - -We no longer recommend that you disable VC@. Doing so would break -useful third-party packages (such as @code{diff-hl}), which depend on VC -being enabled. - -If you choose to disable VC anyway, then you can do so by changing -the value of @code{vc-handled-backends}. - -@node FAQ - Issues and Errors -@appendixsec FAQ - Issues and Errors - -@menu -* Magit is slow:: -* I changed several thousand files at once and now Magit is unusable:: -* I am having problems committing:: -* I am using MS Windows and cannot push with Magit:: -* I am using macOS and SOMETHING works in shell, but not in Magit: I am using macOS and SOMETHING works in shell but not in Magit. -* Expanding a file to show the diff causes it to disappear:: -* Point is wrong in the @code{COMMIT_EDITMSG} buffer:: -* The mode-line information isn't always up-to-date:: -* A branch and tag sharing the same name breaks SOMETHING:: -* My Git hooks work on the command-line but not inside Magit:: -* @code{git-commit-mode} isn't used when committing from the command-line:: -* Point ends up inside invisible text when jumping to a file-visiting buffer:: -* I am no longer able to save popup defaults:: -@end menu - -@node Magit is slow -@appendixsubsec Magit is slow - -See @ref{Performance} and @ref{I changed several thousand files at once and now Magit is unusable}. - -@node I changed several thousand files at once and now Magit is unusable -@appendixsubsec I changed several thousand files at once and now Magit is unusable - -Magit is currently not expected to work well under such conditions. -It sure would be nice if it did. Reaching satisfactory performance -under such conditions will require some heavy refactoring. This is no -small task but I hope to eventually find the time to make it happen. - -But for now we recommend you use the command line to complete this one -commit. Also see @ref{Performance}. - -@node I am having problems committing -@appendixsubsec I am having problems committing - -That likely means that Magit is having problems finding an appropriate -emacsclient executable. See @ref{Configuring With-Editor,,,with-editor,} -and @ref{Debugging,,,with-editor,}. - -@node I am using MS Windows and cannot push with Magit -@appendixsubsec I am using MS Windows and cannot push with Magit - -It's almost certain that Magit is only incidental to this issue. It -is much more likely that this is a configuration issue, even if you -can push on the command line. - -Detailed setup instructions can be found at -@uref{https://github.com/magit/magit/wiki/Pushing-with-Magit-from-Windows}. - -@node I am using macOS and SOMETHING works in shell but not in Magit -@appendixsubsec I am using macOS and SOMETHING works in shell, but not in Magit - -This usually occurs because Emacs doesn't have the same environment -variables as your shell. Try installing and configuring -@uref{https://github.com/purcell/exec-path-from-shell}. By default it -synchronizes @code{$PATH}, which helps Magit find the same @code{git} as the one you -are using on the shell. - -If SOMETHING is "passphrase caching with gpg-agent for commit and/or -tag signing", then you'll also need to synchronize @code{$GPG_AGENT_INFO}. - -@node Expanding a file to show the diff causes it to disappear -@appendixsubsec Expanding a file to show the diff causes it to disappear - -This is probably caused by a customization of a @code{diff.*} Git variable. -You probably set that variable for a reason, and should therefore only -undo that setting in Magit by customizing @code{magit-git-global-arguments}. - -@node Point is wrong in the @code{COMMIT_EDITMSG} buffer -@appendixsubsec Point is wrong in the @code{COMMIT_EDITMSG} buffer - -Neither Magit nor @code{git-commit.el} fiddle with point in the buffer used -to write commit messages, so something else must be doing it. - -You have probably globally enabled a mode which restores point in -file-visiting buffers. It might be a bit surprising, but when you -write a commit message, then you are actually editing a file. - -So you have to figure out which package is doing it. @code{saveplace}, -@code{pointback}, and @code{session} are likely candidates. These snippets might -help: - -@lisp -(setq session-name-disable-regexp "\\(?:\\`'\\.git/[A-Z_]+\\'\\)") - -(with-eval-after-load 'pointback - (lambda () - (when (or git-commit-mode git-rebase-mode) - (pointback-mode -1)))) -@end lisp - -@node The mode-line information isn't always up-to-date -@appendixsubsec The mode-line information isn't always up-to-date - -Magit is not responsible for the version control information that is -being displayed in the mode-line and looks something like @code{Git-master}. -The built-in "Version Control" package, also known as "VC", updates -that information, and can be told to do so more often: - -@lisp -(setq auto-revert-check-vc-info t) -@end lisp - -But doing so isn't good for performance. For more (overly optimistic) -information see @ref{VC Mode Line,,,emacs,}. - -If you don't really care about seeing this information in the -mode-line, but just don't want to see @emph{incorrect} information, -then consider simply not displaying it in the mode-line: - -@lisp -(setq-default mode-line-format - (delete '(vc-mode vc-mode) mode-line-format)) -@end lisp - -@node A branch and tag sharing the same name breaks SOMETHING -@appendixsubsec A branch and tag sharing the same name breaks SOMETHING - -Or more generally, ambiguous refnames break SOMETHING@. - -Magit assumes that refs are named non-ambiguously across the -"refs/heads/", "refs/tags/", and "refs/remotes/" namespaces (i.e., all -the names remain unique when those prefixes are stripped). We -consider ambiguous refnames unsupported and recommend that you use a -non-ambiguous naming scheme. However, if you do work with a -repository that has ambiguous refnames, please report any issues you -encounter, so that we can investigate whether there is a simple fix. - -@node My Git hooks work on the command-line but not inside Magit -@appendixsubsec My Git hooks work on the command-line but not inside Magit - -When Magit calls @code{git} it adds a few global arguments including -@code{--literal-pathspecs} and the @code{git} process started by Magit then passes -that setting on to other @code{git} process it starts itself. It does so by -setting the environment variable @code{GIT_LITERAL_PATHSPECS}, not by calling -subprocesses with the @code{--literal-pathspecs} argument. You can therefore -override this setting in hook scripts using @code{unset -GIT_LITERAL_PATHSPECS}. - -@node @code{git-commit-mode} isn't used when committing from the command-line -@appendixsubsec @code{git-commit-mode} isn't used when committing from the command-line - -The reason for this is that @code{git-commit.el} has not been loaded yet -and/or that the server has not been started yet. These things have -always already been taken care of when you commit from Magit because -in order to do so, Magit has to be loaded and doing that involves -loading @code{git-commit} and starting the server. - -If you want to commit from the command-line, then you have to take -care of these things yourself. Your @code{init.el} file should contain: - -@lisp -(require 'git-commit) -(server-mode) -@end lisp - -Instead of `(require 'git-commit)` you may also use: - -@lisp -(load "/path/to/magit-autoloads.el") -@end lisp - -You might want to do that because loading @code{git-commit} causes large -parts of Magit to be loaded. - -There are also some variations of @code{(server-mode)} that you might want to -try. Personally I use: - -@lisp -(use-package server - :config (or (server-running-p) (server-mode))) -@end lisp - -Now you can use: - -@example -$ emacs& -$ EDITOR=emacsclient git commit -@end example - -However you cannot use: - -@example -$ killall emacs -$ EDITOR="emacsclient --alternate-editor emacs" git commit -@end example - -This will actually end up using @code{emacs}, not @code{emacsclient}. If you do -this, then you can still edit the commit message but @code{git-commit-mode} -won't be used and you have to exit @code{emacs} to finish the process. - -Tautology ahead. If you want to be able to use @code{emacsclient} to connect -to a running @code{emacs} instance, even though no @code{emacs} instance is running, -then you cannot use @code{emacsclient} directly. - -Instead you have to create a script that does something like this: - -Try to use @code{emacsclient} (without using @code{--alternate-editor}). If that -succeeds, do nothing else. Otherwise start @code{emacs &} (and @code{init.el} must -call @code{server-start}) and try to use @code{emacsclient} again. - -@node Point ends up inside invisible text when jumping to a file-visiting buffer -@appendixsubsec Point ends up inside invisible text when jumping to a file-visiting buffer - -This can happen when you type @code{RET} on a hunk to visit the respective -file at the respective position. One solution to this problem is to -use @code{global-reveal-mode}. It makes sure that text around point is -always visible. If that is too drastic for your taste, then you may -instead use @code{magit-diff-visit-file-hook} to reveal the text, possibly -using @code{reveal-post-command} or for Org buffers @code{org-reveal}. - -@node I am no longer able to save popup defaults -@appendixsubsec I am no longer able to save popup defaults - -Magit used to use Magit-Popup to implement the transient popup menus. -Now it used Transient instead, which is Magit-Popup's successor. - -In the older Magit-Popup menus, it was possible to save user settings -(e.g., setting the gpg signing key for commits) by using @code{C-c C-c} in -the popup buffer. This would dismiss the popup, but save the settings -as the defaults for future popups. - -When switching to Transient menus, this functionality is now available -via @code{C-x C-s} instead; the @code{C-x} prefix has other options as well when -using Transient, which will be displayed when it is typed. See -@uref{https://magit.vc/manual/transient/Saving-Values.html#Saving-Values} for -more details. - -@node Debugging Tools -@chapter Debugging Tools - -Magit and its dependencies provide a few debugging tools, and we -appreciate it very much if you use those tools before reporting an -issue. Please include all relevant output when reporting an -issue. - -@table @asis -@item @kbd{M-x magit-version} -@findex magit-version -This command shows the currently used versions of Magit, Git, and -Emacs in the echo area. Non-interactively this just returns the -Magit version. - -@item @kbd{M-x magit-emacs-Q-command} -@findex magit-emacs-Q-command -This command shows a debugging shell command in the echo area and -adds it to the kill ring. Paste that command into a shell and run -it. - -This shell command starts @code{emacs} with only @code{magit} and its -dependencies loaded. Neither your configuration nor other installed -packages are loaded. This makes it easier to determine whether some -issue lays with Magit or something else. - -If you run Magit from its Git repository, then you should be able to -use @code{make emacs-Q} instead of the output of this command. - -@item @kbd{M-x magit-toggle-git-debug} -@findex magit-toggle-git-debug -This command toggles whether additional git errors are reported. - -Magit basically calls git for one of these two reasons: for -side-effects or to do something with its standard output. - -When git is run for side-effects then its output, including error -messages, go into the process buffer which is shown when using @code{$}. - -When git's output is consumed in some way, then it would be too -expensive to also insert it into this buffer, but when this -option is non-nil and git returns with a non-zero exit status, -then at least its standard error is inserted into this buffer. - -This is only intended for debugging purposes. Do not enable this -permanently, that would negatively affect performance. Also note -that just because git exits with a non-zero exit status and prints -an error message that usually doesn't mean that it is an error as -far as Magit is concerned, which is another reason we usually hide -these error messages. Whether some error message is relevant in -the context of some unexpected behavior has to be judged on a case -by case basis. - -@item @kbd{M-x magit-toggle-verbose-refresh} -@findex magit-toggle-verbose-refresh -This command toggles whether Magit refreshes buffers verbosely. -Enabling this helps figuring out which sections are bottlenecks. -The additional output can be found in the @code{*Messages*} buffer. - -@item @kbd{M-x magit-debug-git-executable} -@findex magit-debug-git-executable -This command displays a buffer containing information about the -available and used @code{git} executable(s), and can be useful when -investigating @code{exec-path} issues. - -Also see @ref{Git Executable}. - -@item @kbd{M-x with-editor-debug} -@findex with-editor-debug -This command displays a buffer containing information about the -available and used @code{emacsclient} executable(s), and can be useful -when investigating why Magit (or rather @code{with-editor}) cannot find -an appropriate @code{emacsclient} executable. - -Also see @ref{Debugging,,,with-editor,}. -@end table - -@noindent -Please also see @ref{FAQ}. - -@node Keystroke Index -@appendix Keystroke Index - -@printindex ky - -@node Function and Command Index -@appendix Function and Command Index - -@printindex fn - -@node Variable Index -@appendix Variable Index - -@printindex vr - -@bye |
