From 8c4e09dff83847ac7f07bf1da7751e9328006c4d Mon Sep 17 00:00:00 2001 From: Jack Jamison Date: Thu, 30 Jul 2026 20:09:00 -0400 Subject: actual final changes and get rid of junk in lisp dir actually works fine --- .config/emacs/lisp/magit/docs/magit.org | 9641 ------------------------------- 1 file changed, 9641 deletions(-) delete mode 100644 .config/emacs/lisp/magit/docs/magit.org (limited to '.config/emacs/lisp/magit/docs/magit.org') diff --git a/.config/emacs/lisp/magit/docs/magit.org b/.config/emacs/lisp/magit/docs/magit.org deleted file mode 100644 index 62912c2..0000000 --- a/.config/emacs/lisp/magit/docs/magit.org +++ /dev/null @@ -1,9641 +0,0 @@ -#+title: Magit User Manual -:PREAMBLE: -#+author: Jonas Bernoulli -#+email: emacs.magit@jonas.bernoulli.dev -#+date: 2015-{{{year}}} - -#+texinfo_dir_category: Emacs -#+texinfo_dir_title: Magit: (magit). -#+texinfo_dir_desc: Using Git from Emacs with Magit. -#+subtitle: for version 4.5.0 - -#+setupfile: .orgconfig - -# Emacs on GNU ELPA build server is too old, so all "man:" links -# will be broken, but this at least allows us to generate the manual. -#+options: broken-links:mark - -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. - -#+texinfo: @noindent -This manual is for Magit version 4.5.0. - -#+texinfo: @insertcopying -:END: -* 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 (~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 ~s~ or ~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 ~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 [[https://github.com/emacs-evil/evil][Evil]], the "Extensible VI Layer for Emacs", -and [[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: ~add~, ~am~, ~bisect~, ~blame~, ~branch~, ~checkout~, ~cherry~, -~cherry-pick~, ~clean~, ~clone~, ~commit~, ~config~, ~describe~, ~diff~, ~fetch~, -~format-patch~, ~init~, ~log~, ~merge~, ~merge-tree~, ~mv~, ~notes~, ~pull~, ~rebase~, -~reflog~, ~remote~, ~request-pull~, ~reset~, ~revert~, ~rm~, ~show~, ~stash~, -~submodule~, ~subtree~, ~tag~, and ~worktree.~ Many more Magit porcelain -commands are implemented on top of Git plumbing commands. - -* Installation - -Magit can be installed using Emacs' package manager or manually from -its development repository. - -** 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 -[[info:emacs#Packages]]. Then add one of the archives to -~package-archives~: - -- To use Melpa: - -#+begin_src emacs-lisp - (require 'package) - (add-to-list 'package-archives - '("melpa" . "https://melpa.org/packages/") t) -#+end_src - -- To use Melpa-Stable: - -#+begin_src emacs-lisp - (require 'package) - (add-to-list 'package-archives - '("melpa-stable" . "https://stable.melpa.org/packages/") t) -#+end_src - -Once you have added your preferred archive, you need to update the -local package list using: - -#+begin_example - M-x package-refresh-contents RET -#+end_example - -Once you have done that, you can install Magit and its dependencies -using: - -#+begin_example - M-x package-install RET magit RET -#+end_example - -Now see [[*Post-Installation Tasks]]. - -** Installing from the Git Repository - -Magit depends on the ~compat~, ~cond-let~, ~llama~, ~seq~ (the built-in version -is enough when using Emacs >= 29.1), ~transient~ and ~with-editor~ libraries -which are available from Melpa and Melpa-Stable. Install them using -~M-x package-install RET RET~. Of course you may also install -them manually from their repository. - -Then clone the Magit repository: - -#+begin_src shell-script - $ git clone https://github.com/magit/magit.git ~/.emacs.d/site-lisp/magit - $ cd ~/.emacs.d/site-lisp/magit -#+end_src - -Then compile the libraries and generate the info manuals: - -#+begin_src shell-script - $ make -#+end_src - -If you haven't installed ~compat~, ~cond-let~, ~llama~, ~seq~ -(only for Emacs 28), ~transient~ and ~with-editor~ from Melpa, or at -~/path/to/magit/../~, then you have to tell ~make~ where to find -them. To do so create the file ~/path/to/magit/config.mk~ with the -following content before running ~make~: - -#+begin_src makefile - LOAD_PATH = -L ~/.emacs.d/site-lisp/magit/lisp - LOAD_PATH += -L ~/.emacs.d/site-lisp/compat - LOAD_PATH += -L ~/.emacs.d/site-lisp/cond-let - LOAD_PATH += -L ~/.emacs.d/site-lisp/llama - LOAD_PATH += -L ~/.emacs.d/site-lisp/seq - LOAD_PATH += -L ~/.emacs.d/site-lisp/transient/lisp - LOAD_PATH += -L ~/.emacs.d/site-lisp/with-editor/lisp -#+end_src - -Finally add this to your init file: - -#+begin_src emacs-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/docs/")) -#+end_src - -Of course if you installed the dependencies manually as well, then -you have to tell Emacs about them too, by prefixing the above with: - -#+begin_src emacs-lisp - (add-to-list 'load-path "~/.emacs.d/site-lisp/compat") - (add-to-list 'load-path "~/.emacs.d/site-lisp/cond-let") - (add-to-list 'load-path "~/.emacs.d/site-lisp/llama") - (add-to-list 'load-path "~/.emacs.d/site-lisp/seq") - (add-to-list 'load-path "~/.emacs.d/site-lisp/transient/lisp") - (add-to-list 'load-path "~/.emacs.d/site-lisp/with-editor") -#+end_src - -Note that you have to add the ~lisp~ subdirectory to the ~load-path~, not -the top-level of the repository, and that elements of ~load-path~ should -not end with a slash, while those of ~Info-directory-list~ should. - -Instead of requiring the feature ~magit~, you could load just the -autoload definitions, by loading the file ~magit-autoloads.el~. - -#+begin_src emacs-lisp - (load "/path/to/magit/lisp/magit-autoloads") -#+end_src - -Instead of running Magit directly from the repository by adding that -to the ~load-path~, you might want to instead install it in some other -directory using ~sudo make install~ and setting ~load-path~ accordingly. - -To update Magit use: - -#+begin_src shell-script - $ git pull - $ make -#+end_src - -At times it might be necessary to run ~make clean all~ instead. - -To view all available targets use ~make help~. - -Now see [[*Post-Installation Tasks]]. - -** 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 ~load-path~. - -#+begin_example - M-x magit-version RET -#+end_example - -should display something like - -#+begin_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 [[*Essential Settings]]. - -To be able to follow cross references to Git manpages found in this -manual, you might also have to manually install the ~gitman~ info manual, -or advice ~Info-follow-nearest-node~ to instead open the actual manpage. -See [[*How to install the gitman info manual?]]. - -If you are completely new to Magit then see [[*Getting Started]]. - -If you run into problems, then please see the [[*FAQ]]. Also see the -[[*Debugging Tools]]. - -And last but not least please consider making a donation, to ensure -that I can keep working on Magit. See https://magit.vc/donate. -for various donation options. - -* 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 ~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 ~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 ~C-x g~. (When the status buffer, or any Magit buffer for -that matter, is the current buffer, then you can also use just ~g~ to -refresh it). - -Move between sections using ~p~ and ~n~. Note that the bodies of some -sections are hidden. Type ~TAB~ to expand or collapse the section at -point. You can also use ~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 ~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 ~TAB~, move to -one of the hunks using ~n~, and unstage just that by typing ~u~. Note how -the staging (~s~) and unstaging (~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 ~C-n~), set the mark using ~C-SPC~ and move down -until some added and/or removed lines fall inside the region but not -all of them. Again type ~s~ to stage. - -It is also possible to un-/stage multiple files at once. Move to a -file section, type ~C-SPC~, move to the next file using ~n~, and then ~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 ~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 ~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 ~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 ~P~ to show all the available push commands -and arguments and then ~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 -~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 ~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 ~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 ~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 ~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 ~C-c g~ and ~C-c f~ instead, but -cannot use those key sequences by default because they are strictly -reserved for bindings added by the user. See [[*Global Bindings]], if you -want to explicitly opt-in to the recommended key bindings. - -Magit also provides context menus and other mouse commands, see [[*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. - -* Interface Concepts -** 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 *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 ~magit-mode~. - -- Key: M-x 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. - -*** Switching Buffers - -- Function: magit-display-buffer buffer &optional display-function :: - - This function is a wrapper around ~display-buffer~ and is used to - display any Magit buffer. It displays BUFFER in some window and, - unlike ~display-buffer~, also selects that window, provided - ~magit-display-buffer-noselect~ is ~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 ~nil~ and the function specified - by ~magit-display-buffer-function~ is used. - -- Variable: magit-display-buffer-noselect :: - - When this is non-~nil~, then ~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. - -- User Option: magit-display-buffer-function :: - - The function specified here is called by ~magit-display-buffer~ with - one argument, a buffer, to actually display that buffer. This - function should call ~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 ~display-buffer~, that function - itself can be used here, in which case the display actions have to - be specified by adding them to ~display-buffer-alist~ instead. - - To learn about display actions, see [[info:elisp#Choosing Window]]. - -- Function: magit-display-buffer-traditional buffer :: - - This function is the current default value of the option - ~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). - -- Function: 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 ~magit-diff-mode~ or - ~magit-process-mode~, it is displayed in another window. - -- Function: magit-display-buffer-fullframe-status-v1 :: - - This function fills the entire frame when displaying a status - buffer. Otherwise, it behaves like - ~magit-display-buffer-traditional~. - -- Function: magit-display-buffer-fullframe-status-topleft-v1 :: - - This function fills the entire frame when displaying a status - buffer. It behaves like ~magit-display-buffer-fullframe-status-v1~ - except that it displays buffers that derive from ~magit-diff-mode~ - or ~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 - ~magit-display-buffer-traditional~ were in use. - -- Function: 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 ~magit-process-mode~, - or (2) the buffer's mode derives from ~magit-diff-mode~, provided - that the mode of the current buffer derives from ~magit-log-mode~ or - ~magit-cherry-mode~. - -- User Option: magit-pre-display-buffer-hook :: - - This hook is run by ~magit-display-buffer~ before displaying the - buffer. - -- Function: magit-save-window-configuration :: - - This function saves the current window configuration. Later when - the buffer is buried, it may be restored by - ~magit-restore-window-configuration~. - -- User Option: magit-post-display-buffer-hook :: - - This hook is run by ~magit-display-buffer~ after displaying the - buffer. - -- Function: 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 ~magit-mode-quit-window~, to determine - whether the window should be deleted when its last Magit buffer is - buried. - -*** Naming Buffers - -- User Option: magit-generate-buffer-name-function :: - - The function used to generate the names of Magit buffers. - - Such a function should take the options ~magit-uniquify-buffer-names~ - as well as ~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 - ~magit-buffer-name-format~, then its own doc-string should describe - the additions. - -- Function: 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 ~default-directory~ is located. - - This function uses ~magit-buffer-name-format~ and supporting all of - the %-sequences mentioned the documentation of that option. It also - respects the option ~magit-uniquify-buffer-names~. - -- User Option: magit-buffer-name-format :: - - The format string used to name Magit buffers. - - At least the following %-sequences are supported: - - - ~%m~ - - The name of the major-mode, but with the ~-mode~ suffix removed. - - - ~%M~ - - Like ~%m~ but abbreviate ~magit-status-mode~ as ~magit~. - - - ~%v~ - - The value the buffer is locked to, in parentheses, or an empty - string if the buffer is not locked to a value. - - - ~%V~ - - Like ~%v~, but the string is prefixed with a space, unless it is an - empty string. - - - ~%t~ - - The top-level directory of the working tree of the repository, or - if ~magit-uniquify-buffer-names~ is non-~nil~ an abbreviation of that. - - - ~%x~ - - If ~magit-uniquify-buffer-names~ is ~nil~ "*", otherwise the empty - string. Due to limitations of the ~uniquify~ package, buffer names - must end with the path. - - The value should always contain ~%m~ or ~%M~, ~%v~ or ~%V~, and ~%t~. If - ~magit-uniquify-buffer-names~ is non-~nil~, then the value must end with - ~%t~ or ~%t%x~. See issue #2841. - -- User Option: 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 ~uniquify~ package; customize its options to - control how buffer names are uniquified. - -*** Quitting Windows - -- Key: q (magit-mode-bury-buffer) :: - - This command buries or kills the current Magit buffer. The function - specified by option ~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. - -- User Option: magit-bury-buffer-function :: - - The function used to actually bury or kill the current buffer. - - ~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 ~magit-mode-quit-window~. - -- Function: magit-restore-window-configuration kill-buffer :: - - Bury or kill the current buffer using ~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. - -- Function: magit-mode-quit-window kill-buffer :: - - Bury or kill the current buffer using ~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. - -*** 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: - -#+begin_src emacs-lisp - (with-eval-after-load 'magit-mode - (add-hook 'after-save-hook 'magit-after-save-refresh-status t)) -#+end_src - -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. - -- Key: g (magit-refresh) :: - - This command refreshes the current buffer if its major mode derives - from ~magit-mode~ as well as the corresponding status buffer. - - If the option ~magit-revert-buffers~ calls for it, then it also - reverts all unmodified buffers that visit files being tracked in the - current repository. - -- Key: G (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 - ~magit-revert-buffers~ is ~nil~. - -- User Option: 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. - -- User Option: 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. - -- Function: magit-after-save-refresh-status :: - - This function is intended to be added to ~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. - -*** 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 ~g~ (~magit-refresh~) to save and -refresh explicitly. - -- User Option: 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 ~dontask~ then this is done without user - intervention. If it is ~t~ then the user has to confirm each save. - -*** 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 ~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 ~M-x revert-buffer RET RET~ in -the visiting buffer before you could continue making changes. - -- User Option: 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. - -- User Option: 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 /instead of/ ~magit-auto-revert-mode~. - -- User Option: magit-auto-revert-immediately :: - - This option controls whether Magit reverts buffers immediately. - - If this is non-~nil~ and either ~global-auto-revert-mode~ or - ~magit-auto-revert-mode~ is enabled, then Magit immediately reverts - buffers by explicitly calling ~auto-revert-buffers~ after running Git - for side-effects. - - If ~auto-revert-use-notify~ is non-~nil~ (and file notifications are - actually supported), then ~magit-auto-revert-immediately~ does not - have to be non-~nil~, because the reverts happen immediately anyway. - - If ~magit-auto-revert-immediately~ and ~auto-revert-use-notify~ are both - ~nil~, then reverts happen after ~auto-revert-interval~ seconds of user - inactivity. That is not desirable. - -- User Option: auto-revert-use-notify :: - - This option controls whether file notification functions should be - used. Note that this variable unfortunately defaults to ~t~ even on - systems on which file notifications cannot be used. - -- User Option: magit-auto-revert-tracked-only :: - - This option controls whether ~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. - -- User Option: auto-revert-mode :: - - The global mode ~magit-auto-revert-mode~ works by turning on this - local mode in the appropriate buffers (but ~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. - -- User Option: auto-revert-stop-on-user-input :: - - This option controls whether the arrival of user input suspends the - automatic reverts for ~auto-revert-interval~ seconds. - -- User Option: auto-revert-interval :: - - This option controls how many seconds Emacs waits for before - resuming suspended reverts. - -- User Option: auto-revert-buffer-list-filter :: - - This option specifies an additional filter used by - ~auto-revert-buffers~ to determine whether a buffer should be reverted - or not. - - This option is provided by Magit, which also advises - ~auto-revert-buffers~ to respect it. Magit users who do not turn on - the local mode ~auto-revert-mode~ themselves, are best served by - setting the value to ~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 ~auto-revert-mode~ in buffers in which Magit - doesn't do that for them, should likely not use any filter. Users - who turn on ~global-auto-revert-mode~, do not have to worry about this - option, because it is disregarded if the global mode is enabled. - -- User Option: auto-revert-verbose :: - - This option controls whether Emacs reports when a buffer has been - reverted. - -The options with the ~auto-revert-~ prefix are located in the Custom -group named ~auto-revert~. The other, Magit-specific, options are -located in the ~magit~ group. - -**** Risk of Reverting Automatically -:PROPERTIES: -:TEXINFO-NODE: t -:END: - -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 ~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). - -** 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. - -*** Section Movement - -To move within a section use the usual keys (~C-p~, ~C-n~, ~C-b~, ~C-f~ etc), -whose global bindings are not shadowed. To move to another section use -the following commands. - -The section movement commands described here run the hook -~magit-section-movement-hook~. Note that they explicitly run that hook -and that arbitrary other movement, defined in Emacs and other packages, -do not run that hook. That hook, and hook functions that can be added -to it, or are part of its default value, are described below. - -- Key: p (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. - -- Key: n (magit-section-forward) :: - - Move to the beginning of the next visible section. - -- Key: M-p (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. - -- Key: M-n (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. - -- Key: ^ (magit-section-up) :: - - Move to the beginning of the parent of the current section. - -The above commands all call the hook ~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 -~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: - -#+begin_src emacs-lisp - (with-eval-after-load 'magit-diff - (remove-hook 'magit-section-movement-hook - 'magit-hunk-set-window-start)) -#+end_src - -- Variable: magit-section-movement-hook :: - - This hook is run by all of the above section movement commands, - after arriving at the destination. It is *not* run by arbitrary other - movement commands (such as ~next-line~), which are provided by Emacs - or third-party packages. - -- Function: magit-hunk-set-window-start :: - - This hook function ensures that the beginning of the current section - is visible, provided it is a ~hunk~ section. Otherwise, it does - nothing. - - Loading ~magit-diff~ adds this function to the hook. - -- Function: 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 - ~magit-section-movement-hook~, then you must remove the hunk-only - variant in turn. - -- Function: magit-log-maybe-show-more-commits :: - - This hook function only has an effect in log buffers, and ~point~ is - on the "show more" section. If that is the case, then it doubles - the number of commits that are being shown. - - Loading ~magit-log~ adds this function to the hook. - -- Function: 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 ~magit-log~ adds this function to the hook. - -- Function: 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. - -- Function: 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. - -- Function: 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. - -- Function: 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. - -- Function: 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. - -- User Option: magit-update-other-window-delay :: - - Delay before automatically updating the other window. - - When moving around in certain buffers using Magit's own section - movement commands (but not other movement commands), 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. - -*** Section Visibility - -Magit provides many commands for changing the visibility of sections, -but all you need to get started are the next two. - -- Key: TAB (magit-section-toggle) :: - - Toggle the visibility of the body of the current section. - -- Key: C-c TAB (magit-section-cycle) :: -- Key: C- (magit-section-cycle) :: - - Cycle the visibility of current section and its children. - - If this command is invoked using ~C-~ and that is globally bound - to ~tab-next~, then this command pivots to behave like that command, - and you must instead use ~C-c TAB~ to cycle section visibility. - - If you would like to keep using ~C-~ to cycle section visibility - but also want to use ~tab-bar-mode~, then you have to prevent that mode - from using this key and instead bind another key to ~tab-next~. Because - ~tab-bar-mode~ does not use a mode map but instead manipulates the - global map, this involves advising ~tab-bar--define-keys~. - -- Key: M- (magit-section-cycle-diffs) :: - - Cycle the visibility of diff-related sections in the current buffer. - -- Key: S- (magit-section-cycle-global) :: - - Cycle the visibility of all sections in the current buffer. - -- Key: 1 (magit-section-show-level-1) :: -- Key: 2 (magit-section-show-level-2) :: -- Key: 3 (magit-section-show-level-3) :: -- Key: 4 (magit-section-show-level-4) :: - - Show sections surrounding the current section up to level N. - -- Key: M-1 (magit-section-show-level-1-all) :: -- Key: M-2 (magit-section-show-level-2-all) :: -- Key: M-3 (magit-section-show-level-3-all) :: -- Key: M-4 (magit-section-show-level-4-all) :: - - Show all sections up to level N. - -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. - -- Command: magit-section-show :: - - Show the body of the current section. - -- Command: magit-section-hide :: - - Hide the body of the current section. - -- 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. - -- 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. - -- Command: magit-section-hide-children :: - - Recursively hide the bodies of children of the current section. - -- Command: magit-section-toggle-children :: - - Toggle visibility of bodies of children of the current section. - -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 -~magit-section-set-visibility-hook~. - -- User Option: 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 ~show~ or ~hide~, or a function that returns one of these - symbols. A function is called with the section as the only argument. - - Use the command ~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 ~magit-section-match~. - -- User Option: 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 ~magit-section-cached-visibility~ is - a member of ~magit-section-set-visibility-hook~. - -- Variable: 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 ~hide~ or ~show~, or to leave the visibility - undefined ~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 ~magit-insert-section--oldroot~ is non-~nil~, - then the buffer is being refreshed and these functions should - immediately return ~nil~. - -- User Option: magit-section-visibility-indicators :: - - This option controls whether and how to indicate that a section can - be expanded/collapsed. - - If ~nil~, then don't show any indicators. Otherwise the value has to - be a list with two elements. The first controls the indicators used - in graphical frames, the second the indicators in terminal frames. - For graphical frames all of the following forms are valid, while - terminal frames do not have fringes and thus do not support the first - form. - - - ~(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 - ~left-fringe-width~ in ~magit-mode-hook~, e.g.: - - #+BEGIN_SRC emacs-lisp - (add-hook 'magit-mode-hook - (lambda () (setq left-fringe-width 20))) - #+END_SRC - - - ~(EXPANDABLE-CHAR . COLLAPSIBLE-CHAR)~ - - In this case every section that can be expanded or collapsed - gets an indicator in the left margin. - - - ~(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. - -*** 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 ~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 ~magit-TYPE-sections-hook~ exists. This hook should be -changed using ~magit-add-section-hook~. Avoid using ~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". - -- Function: 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 - ~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. - -To remove a function from a section hook, use ~remove-hook~. - -*** Section Types and Values - -Each section has a type, for example ~hunk~, ~file~, and ~commit~. -Instances of certain section types also have a value. The value of a -section of type ~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. - -- Key: H (magit-describe-section) :: - - This command shows information about the section at point in a - separate buffer. - -- Command: magit-describe-section-briefly :: - - This command shows information about the section at point in the - echo area, as ~#~. - -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 *might* be defined, named -~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. - -*** 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. - -- User Option: 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. - -** Transient Commands - -Many Magit commands are implemented as *transient* commands. First the -user invokes a *prefix* command, which causes its *infix* arguments and -*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 ~transient~. Earlier Magit releases -used the package ~magit-popup~ and even earlier versions library -~magit-key-mode~. - -Transient is documented in [[info:transient]]. - -- Key: C-x M-g (magit-dispatch) :: -- Key: C-c g (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 ~magit-dispatch~. - - This command is also, or especially, useful outside Magit buffers, - so Magit by default binds it to ~C-c M-g~ in the global keymap. - ~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 [[*Global - Bindings]] to learn more default and recommended key bindings. - -** Transient Arguments and Buffer Variables - -The infix arguments of many of Magit's transient prefix commands cease -to have an effect once the ~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 -[[info:transient#Saving Values]]. It is also possible to cycle through -previously used sets of arguments using ~C-M-p~ and ~C-M-n~, see -[[info:transient#Using History]]. - -However the infix arguments of many other transient commands continue -to have an effect even after the ~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 -~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 ~D~ and ~L~. (~d~ and ~l~ on the other hand are -intended to change *what* diff or log is being displayed. It is -possible to also change *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 *changing* the arguments used in the current buffer, -they *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 ~magit-show-commit~ is usually invoked by typing ~RET~ while -point is on a commit in a log, but it can also be invoked from the -~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 ~RET~ in a -log to display the commit at point in a different buffer and then use -~D~ to change how the diff is displayed in that buffer. And then you -press ~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. - -- User Option: 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 ~magit-diff~ and ~magit-log~ transient prefix commands are affected - by this option. - -- User Option: 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. - -#+texinfo: @noindent -Valid values for both of the above options are: - - - ~always~: Always use the set of arguments that is currently active - in the respective buffer, provided that buffer exists of course. - - ~selected~ or ~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. - - ~current~: Use the set of arguments from the respective buffer, but - only if it is the current buffer. - - ~never~: Never use the set of arguments from the respective buffer. - -#+texinfo: @noindent -I am afraid it gets more complicated still: - -- The global diff and log arguments are set for each supported mode - individually. The diff arguments for example have different values - in ~magit-diff-mode~, ~magit-revision-mode~, ~magit-merge-preview-mode~ - and ~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. - -- When ~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. - -- Even though they are suffixes of the diff prefix ~magit-show-commit~ - and ~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. - -- The log prefix also features reflog commands, but these commands do - not use the log arguments. - -- If ~magit-show-refs~ is invoked from a ~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 ~magit-prefix-use-buffer-arguments~. If it is invoked - elsewhere without a prefix argument, then it acts as a direct - command and therefore respects ~magit-direct-use-buffer-arguments~. - -** Completion, Confirmation and the Selection -*** 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 ~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. - -- User Option: 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. - - - Applying changes: - - - ~discard~ Discarding one or more changes (i.e., hunks or the - complete diff for a file) loses that change, obviously. - - - ~reverse~ Reverting one or more changes can usually be undone by - reverting the reversion. - - - ~stage-all-changes~, ~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. - - - Files: - - - ~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. - - - ~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 ~magit-delete-by-moving-to-trash~. - - - ~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. - - - ~untrack~ Untracking a file can be undone by tracking it again. - - - ~rename~ Renaming a file can easily be undone. - - - Sequences: - - - ~reset-bisect~ Aborting (known to Git as "resetting") a bisect - operation loses all information collected so far. - - - ~abort-cherry-pick~ Aborting a cherry-pick throws away all - conflict resolutions which have already been carried out by the - user. - - - ~abort-revert~ Aborting a revert throws away all conflict - resolutions which have already been carried out by the user. - - - ~abort-rebase~ Aborting a rebase throws away all already modified - commits, but it's possible to restore those from the reflog. - - - ~abort-merge~ Aborting a merge throws away all conflict - resolutions which have already been carried out by the user. - - - ~merge-dirty~ Merging with a dirty worktree can make it hard to go - back to the state before the merge was initiated. - - - References: - - - ~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. - - - ~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 ~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. - - - ~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. - - - Publishing: - - - ~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. - - - 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 ~magit-published-branches~. - - - ~amend-published~ Affects most commands that amend to "HEAD". - - - ~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. - - - ~edit-published~ Affects the commands ~magit-edit-line-commit~ and - ~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. - - To disable confirmation completely, add all three symbols here or - set ~magit-published-branches~ to ~nil~. - - - Various: - - - ~stash-apply-3way~ When a stash cannot be applied using ~git stash - apply~, then Magit uses ~git apply~ instead, possibly using the - ~--3way~ argument, which isn't always perfectly safe. See also - ~magit-stash-apply~. - - - ~kill-process~ There seldom is a reason to kill a process. - - - 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 ~magit-wip-before-change-mode~ is enabled, then the following - actions can be undone fairly easily: ~discard~, ~reverse~, - ~stage-all-changes~, and ~unstage-all-changes~. If and only if - this mode is enabled, then ~safe-with-wip~ has the same effect as - adding all of these symbols individually. - -*** 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 ~RET~ or abort using ~C-g~. This is similar to a ~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 -~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. - -- User Option: magit-dwim-selection :: - -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 ~((COMMAND nil|PROMPT DEFAULT)...)~. - -- COMMAND is the command that should not prompt for a choice. - To have an effect, the command has to use the function - ~magit-completing-read~ or a utility function which in turn uses - that function. - -- If the command uses ~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 ~magit-completing-read~. - -- DEFAULT specifies how to use the default. If it is ~t~, then - the DEFAULT argument passed to ~magit-completing-read~ is used - without confirmation. If it is ~ask~, then the user is given - a chance to abort. DEFAULT can also be ~nil~, in which case the - entry has no effect. - -*** 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 *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 *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. - -- Variable: 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. - -*** 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 *body* of a -hunk section and end in the body of the *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. - -*** Support for Completion Frameworks - -The built-in option ~completing-read-function~ specifies the low-level -function used by ~completing-read~ to ask a user to select from a list -of choices. Its default value is ~completing-read-default~. -Alternative completion frameworks typically activate themselves by -substituting their own implementation. - -Mostly for historic reasons Magit provides a similar option named -~magit-completing-read-function~, which only controls the low-level -function used by ~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 -~ivy-mode~, then Magit will respect that, and if you enable ~helm-mode~, -then you are done too. - -- User Option: magit-completing-read-function :: - - The value of this variable is the low-level function used to perform - completion by code that uses ~magit-completing-read~ (as opposed to - the built-in ~completing-read~). - - The default value, ~magit-builtin-completing-read~, is suitable for - the standard completion mechanism, ~ivy-mode~, and ~helm-mode~ at least. - - The built-in ~completing-read~ and ~completing-read-default~ are *not* - suitable to be used here. ~magit-builtin-completing-read~ performs - some additional work, and any function used in its place has to do - the same. - -- Function: magit-builtin-completing-read prompt choices &optional predicate require-match initial-input hist def :: - - This function performs completion using the built-in ~completing-read~ - and does some additional magit-specific work. - -- Function: 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 ~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, ~this-command~ and ~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 ~completing-read~, except for the following: - - - COLLECTION must be a list of choices. A function is not - supported. - - - If REQUIRE-MATCH is ~nil~ and the user exits without a choice, then - ~nil~ is returned instead of an empty string. - - - If REQUIRE-MATCH is ~any~, then do not require a match but - do require non-empty input (or non-~nil~ DEFAULT, since that - is substituted for empty input). - - - If REQUIRE-MATCH is non-~nil~ and the users exits without a choice, - an user-error is raised. - - - FALLBACK specifies a secondary default that is only used if the - primary default DEF is ~nil~. The secondary default is not subject - to ~magit-dwim-selection~ — if DEF is ~nil~ but FALLBACK is not, then - this function always asks the user to choose a candidate, just as - if both defaults were ~nil~. - - - ~format-prompt~ is called on PROMPT and DEF (or FALLBACK if - DEF is ~nil~). This appends ": " to the prompt and may also - add the default to the prompt, using the format specified by - ~minibuffer-default-prompt-format~ and depending on - ~magit-completing-read-default-prompt-predicate~. - -*** Additional Completion Options - -- User Option: 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 ~--sort~ flag of ~git - for-each-ref~. By default, refs are sorted alphabetically by their - full name (e.g., "refs/heads/master"). - -** 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 ~context-menu-mode~. If you use an -older Emacs release, set ~magit-section-show-context-menu-for-emacs<28~. - -** Running Git -*** 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 -~magit-process-buffer~ command, when things don't go as expected. - -The output/errors for up to ~magit-process-log-max~ Git commands are -retained. - -- Key: $ (magit-process-buffer) :: - - This commands displays the process buffer for the current - repository. - -Inside that buffer, the usual key bindings for navigating and showing -sections are available. There is one additional command. - -- Key: k (magit-process-kill) :: - - This command kills the process represented by the section at point. - -- Key: M-x 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 ~$~. - - When git's output is consumed in some way, then it would be too - expensive to also insert it into this buffer, but with this command - that can be enabled temporarily. In that case, if git returns with - a non-zero exit status, then at least its standard error is inserted - into this buffer. - - Also note that just because git exits with a non-zero 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. - -*** Git Process Status - -When a Git process is running for side-effects, Magit displays an -indicator in the mode line, using the ~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 ~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, -set ~magit-process-display-mode-line-error~ to ~nil~. - -Process errors are displayed at the top of the status buffer and in -the echo area. In both places a hint is appended, which informs users -that they can see the full output in the process buffer and how to -display that buffer. However, once you are aware of that, you might -want to set ~magit-show-process-buffer-hint~ to ~nil~. - -*** 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. - -- Key: ! (magit-run) :: - - This transient prefix command binds the following suffix commands - and displays them in a temporary buffer until a suffix is invoked. - -- Key: ! ! (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. - -- Key: : (magit-git-command) :: -- Key: ! p :: - - This command reads a command from the user and executes it in - ~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. - -- Key: ! s (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. - -- Key: ! S (magit-shell-command) :: - - This command reads a command from the user and executes it in - ~default-directory~. With a prefix argument the command is executed - in the top-level directory of the current working tree instead. - -- User Option: 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. - -These suffix commands start external gui tools. - -- Key: ! k (magit-run-gitk) :: - - This command runs ~gitk~ in the current repository. - -- Key: ! a (magit-run-gitk-all) :: - - This command runs ~gitk --all~ in the current repository. - -- Key: ! b (magit-run-gitk-branches) :: - - This command runs ~gitk --branches~ in the current repository. - -- Key: ! g (magit-run-git-gui) :: - - This command runs ~git gui~ in the current repository. - -- Key: ! m (magit-git-mergetool) :: - - This command runs =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. - -*** Git Executable - -When Magit calls Git, then it may do so using the absolute path to the -~git~ executable, or using just its name. - -When running ~git~ locally and the ~system-type~ is ~windows-nt~ (any -Windows version) or ~darwin~ (macOS) then ~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 ~git~ binary, which are also -placed on ~$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 ~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. - -- User Option: magit-git-executable :: - - The ~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. - -- User Option: magit-remote-git-executable :: - - The ~git~ executable used by Magit on remote machines over Tramp. - Normally this should be just the string "git". Consider customizing - ~tramp-remote-path~ instead of this option. - -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 ~exec-path~ or ~tramp-remote-path~ is correct. - -Note that ~exec-path~ is set based on the value of the ~PATH~ environment -variable that is in effect when Emacs is started. If you set ~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 ~exec-path-from-shell~ package -can help; though honestly I consider that a kludge too. - -The command ~magit-debug-git-executable~ can be useful to find out where -Emacs is searching for ~git~. - -- Key: M-x magit-debug-git-executable :: - - This command displays a buffer with information about - ~magit-git-executable~ and ~magit-remote-git-executable~. - -- Key: M-x 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. - -*** Global Git Arguments - -- User Option: 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 ~git HERE... COMMAND REST~. For - valid arguments see [[man:git]] - - 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. - -* 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. - -** 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 ~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 ~C-x g~: - -#+begin_src emacs-lisp - (global-set-key (kbd "C-x g") 'magit-status) -#+end_src - -- Key: C-x g (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 ~magit-repository-directories~, and - the status for the selected repository is shown instead. - - - If that option specifies any existing repositories, then the user - is asked to select one of them. - - - 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. - - - Otherwise the user is offered to initialize the selected directory - as a new repository. After creating the repository its status - buffer is shown. - - These fallback behaviors can also be forced using one or more - prefix arguments: - - - 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 ~magit-init~. - - - 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 - ~magit-repository-directories~, then the behavior is the same as with - two prefix arguments. - -- User Option: magit-repository-directories :: - - List of directories that are Git repositories or contain Git - repositories. - - Each element has the form ~(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 - ~magit-list-repositories~. It also affects ~magit-status~ (which see) - in potentially surprising ways (see above). - -- Command: magit-status-quick :: - - This command is an alternative to ~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 ~magit-status~, - and additionally cause the buffer to be refresh. - - To use this command add this to your init file: - - #+BEGIN_SRC emacs-lisp - (global-set-key (kbd "C-x g") 'magit-status-quick). - #+END_SRC - - If you do that and then for once want to redisplay the buffer and - also immediately refresh it, then type ~C-x g~ followed by ~g~. - - A possible alternative command is ~magit-display-repository-buffer~. - It supports displaying any existing Magit buffer that belongs to the - current repository; not just the status buffer. - -*** Status Sections - -The contents of status buffers is controlled using the hook -~magit-status-sections-hook~. See [[*Section Hooks]] to learn about such -hooks and how to customize them. - -- User Option: magit-status-sections-hook :: - - This hook is run to insert sections into a status buffer. - - The functions described in this section, and the functions - ~magit-insert-status-headers~ and ~magit-insert-untracked-files~, - which are described in subsequent sections, are members of this - hook. - - Some additional functions that can be added to this hook, but are by - default added to another hooks, are listed in [[*References Buffer]]. - -- Function: magit-insert-status-headers :: - - Insert header sections appropriate for ~magit-status-mode~ buffers. - The sections are inserted by running the functions on the hook - ~magit-status-headers-hook~. See [[*Status Header Sections]]. - -- Function: 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. - -- Function: magit-insert-rebase-sequence :: - - Insert section for the on-going rebase sequence. - If no such sequence is in progress, do nothing. - -- Function: magit-insert-am-sequence :: - - Insert section for the on-going patch applying sequence. - If no such sequence is in progress, do nothing. - -- Function: magit-insert-sequencer-sequence :: - - Insert section for the on-going cherry-pick or revert sequence. - If no such sequence is in progress, do nothing. - -- Function: magit-insert-bisect-output :: - - While bisecting, insert section with output from ~git bisect~. - -- Function: magit-insert-bisect-rest :: - - While bisecting, insert section visualizing the bisect state. - -- Function: magit-insert-bisect-log :: - - While bisecting, insert section logging bisect progress. - -- Function: magit-insert-unstaged-changes :: - - Insert section showing unstaged changes. - -- Function: magit-insert-staged-changes :: - - Insert section showing staged changes. - -- Function: magit-insert-stashes &optional ref heading :: - - Insert the ~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:". - -- Function: magit-insert-unpulled-from-upstream :: - - Insert section showing commits that haven't been pulled from the - upstream branch yet. - -- Function: magit-insert-unpulled-from-pushremote :: - - Insert section showing commits that haven't been pulled from the - push-remote branch yet. - -- Function: magit-insert-unpushed-to-upstream-or-recent :: - - Insert section showing unpushed or other recent commits. - If an upstream is configured for the current branch and it is - behind of the current branch, then show the commits that have - not yet been pushed into the upstream branch. If no upstream is - configured or if the upstream is not behind of the current branch, - then show the last ~magit-log-section-commit-count~ commits. - -- Function: magit-insert-unpushed-to-upstream :: - - Insert section showing commits that haven't been pushed to the - upstream yet. - -- Function: magit-insert-unpushed-to-pushremote :: - - Insert section showing commits that haven't been pushed to the - push-remote yet. - -*** Status File List Sections - -These functions honor the buffer's file filter, which can be set using -~D - -~. - -- Function: magit-insert-untracked-files :: - - This function may insert a list of untracked files. Whether it - actually does so, depends on the option described next. - -- User Option: magit-status-show-untracked-files :: - - This option controls whether the above function inserts a list of - untracked files in the status buffer. - - - If ~nil~, do not list any untracked files. - - If ~t~, list untracked files, but if a directory does not contain any - tracked files, then only list that directory, not the contained - untracked files. - - If ~all~, then list each individual untracked files. This is can be - very slow and is discouraged. - - The corresponding values for the Git variable are "no", "normal" - and "all". - - To disable listing untracked files in a specific repository only, - add the following to ~.dir-locals.el~: - - #+begin_src emacs-lisp - ((magit-status-mode - (magit-status-show-untracked-files . "no"))) - #+end_src - - Alternatively (and mostly for historic reasons), it is possible to - use ~git config~ to set the repository-local value: - - #+begin_src shell-script - git config set --local status.showUntrackedFiles no - #+end_src - - This does *not* override the (if any) local value of this Lisp variable, - but it does override its global value. - - See the last section in the git-status(1) manpage, to speed up the part - of the work Git is responsible for. Turning that list into sections is - also not free, so Magit only lists ~magit-status-file-list-limit~ files. - -- User Option: magit-status-file-list-limit :: - - This option controls many files are listed at most in each section - that lists files in the status buffer. For performance reasons, it - is recommended that you do not increase this limit. - -While the above function is a member of ~magit-status-section-hook~ by -default, the following functions have to be explicitly added by the -user. Because that negatively affects performance, it is recommended -that you don't do that. - -- Function: magit-insert-tracked-files :: - - Insert a list of tracked files. - -- Function: magit-insert-ignored-files :: - - Insert a list of ignored files. - -- Function: magit-insert-skip-worktree-files :: - - Insert a list of skip-worktree files. - -- Function: magit-insert-assume-unchanged-files :: - - Insert a list of files that are assumed to be unchanged. - -*** Status Log Sections - -- Function: 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 ~magit-log-section-commit-count~ - commits. - -- Function: magit-insert-recent-commits :: - - Insert section showing the last ~magit-log-section-commit-count~ - commits. - -- User Option: magit-log-section-commit-count :: - - How many recent commits ~magit-insert-recent-commits~ and - ~magit-insert-unpulled-or-recent-commits~ (provided there are no - unpulled commits) show. - -- Function: magit-insert-unpulled-cherries :: - - Insert section showing unpulled commits. - Like ~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 "-". - -- Function: magit-insert-unpushed-cherries :: - - Insert section showing unpushed commits. - Like ~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 "-". - -*** Status Header Sections - -The contents of status buffers is controlled using the hook -~magit-status-sections-hook~ (see [[*Status Sections]]). - -By default ~magit-insert-status-headers~ is the first member of that -hook variable. - -- Function: magit-insert-status-headers :: - - Insert headers sections appropriate for ~magit-status-mode~ buffers. - The sections are inserted by running the functions on the hook - ~magit-status-headers-hook~. - -- User Option: magit-status-headers-hook :: - - Hook run to insert headers sections into the status buffer. - - This hook is run by ~magit-insert-status-headers~, which in turn has - to be a member of ~magit-status-sections-hook~ to be used at all. - -By default the following functions are members of the above hook: - -- Function: 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. - -- Function: magit-insert-diff-filter-header :: - - Insert a header line showing the effective diff filters. - -- Function: magit-insert-head-branch-header :: - - Insert a header line about the current branch or detached ~HEAD~. - -- Function: magit-insert-upstream-branch-header :: - - Insert a header line about the branch that is usually pulled into - the current branch. - -- Function: magit-insert-push-branch-header :: - - Insert a header line about the branch that the current branch is - usually pushed to. - -- Function: 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 ~HEAD~. - -The following functions can also be added to the above hook: - -- Function: magit-insert-repo-header :: - - Insert a header line showing the path to the repository top-level. - -- Function: 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. - -- Function: magit-insert-user-header :: - - Insert a header line about the current user. - -*** Status Module Sections - -The contents of status buffers is controlled using the hook -~magit-status-sections-hook~ (see [[*Status Sections]]). - -By default ~magit-insert-modules~ is /not/ a member of that hook -variable. - -- Function: magit-insert-modules :: - - Insert submodule sections. - - Hook ~magit-module-sections-hook~ controls which module sections are - inserted, and option ~magit-module-sections-nested~ controls whether - they are wrapped in an additional section. - -- User Option: magit-module-sections-hook :: - - Hook run by ~magit-insert-modules~. - -- User Option: magit-module-sections-nested :: - - This option controls whether ~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 ~magit-module-sections-hook~ - become top-level sections. - -- Function: magit-insert-modules-overview :: - - Insert sections for all submodules. For each section insert the - path, the branch, and the output of ~git describe --tags~, - or, failing that, the abbreviated HEAD commit hash. - - Press ~RET~ on such a submodule section to show its own status buffer. - Press ~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. - -- Function: 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. - -- Function: 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. - -- Function: 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. - -- Function: 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. - -*** Status Options - -- User Option: 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 ~(INIT STYLE WIDTH AUTHOR AUTHOR-WIDTH)~. - - - If INIT is non-~nil~, then the margin is shown initially. - - STYLE controls how to format the author or committer date. It can - be one of ~age~ (to show the age of the commit), ~age-abbreviated~ (to - abbreviate the time unit to a character), or a string (suitable - for ~format-time-string~) to show the actual date. Option - ~magit-log-margin-show-committer-date~ controls which date is being - displayed. - - WIDTH controls the width of the margin. This exists for forward - compatibility and currently the value should not be changed. - - AUTHOR controls whether the name of the author is also shown by - default. - - 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. - -Also see the proceeding section for more options concerning status -buffers. - -** Repository List - -- Command: magit-list-repositories :: - - This command displays a list of repositories in a separate buffer. - - The option ~magit-repository-directories~ controls which repositories are - displayed. - -- User Option: magit-repolist-columns :: - - This option controls what columns are displayed by the command - ~magit-list-repositories~ and how they are displayed. - - Each element has the form ~(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 ~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 ~:right-align~, ~:pad-right~ and - ~:sort~. - - The ~:sort~ function has a weird interface described in the - docstring of ~tabulated-list--get-sort~. Alternatively ~<~ and - ~magit-repolist-version<~ can be used as those functions are - automatically replaced with functions that satisfy the interface. - Set ~:sort~ to ~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 ~:pad-right~ to 9. ~+~ is substituted for numbers higher than 9. - -#+texinfo: @noindent -The following functions can be added to the above option: - -- Function: magit-repolist-column-ident :: - - This function inserts the identification of the repository. Usually - this is just its basename. - -- Function: magit-repolist-column-path :: - - This function inserts the absolute path of the repository. - -- Function: magit-repolist-column-version :: - - This function inserts a description of the repository's ~HEAD~ revision. - -- Function: magit-repolist-column-branch :: - - This function inserts the name of the current branch. - -- Function: magit-repolist-column-upstream :: - - This function inserts the name of the upstream branch of the current - branch. - -- Function: magit-repolist-column-branches :: - - This function inserts the number of branches. - -- Function: magit-repolist-column-stashes :: - - This function inserts the number of stashes. - -- Function: magit-repolist-column-flag :: - - This function inserts a flag as specified by - ~magit-repolist-column-flag-alist~. - - By default this indicates whether there are uncommitted changes. - - - ~N~ if there is at least one untracked file. - - ~U~ if there is at least one unstaged file. - - ~S~ if there is at least one staged file. - - Only the first one of these that applies is shown. - -- Function: magit-repolist-column-flags :: - - This functions insert all flags as specified by - ~magit-repolist-column-flag-alist~. - - This is an alternative to function ~magit-repolist-column-flag~, - which only lists the first one found. - -- Function: magit-repolist-column-unpulled-from-upstream :: - - This function inserts the number of upstream commits not in the - current branch. - -- Function: magit-repolist-column-unpulled-from-pushremote :: - - This function inserts the number of commits in the push branch but - not the current branch. - -- Function: magit-repolist-column-unpushed-to-upstream :: - - This function inserts the number of commits in the current branch - but not its upstream. - -- Function: magit-repolist-column-unpushed-to-pushremote :: - - This function inserts the number of commits in the current branch - but not its push branch. - -#+texinfo: @noindent -The following commands are available in repolist buffers: - -- Key: RET (magit-repolist-status) :: - - This command shows the status for the repository at point. - -- Key: m (magit-repolist-mark) :: - - This command marks the repository at point. - -- Key: u (magit-repolist-unmark) :: - - This command unmarks the repository at point. - -- Key: f (magit-repolist-fetch) :: - - This command fetches all marked repositories. If no repositories - are marked, then it offers to fetch all displayed repositories. - -- Key: 5 (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. - -** Logging - -The status buffer contains logs for the unpushed and unpulled commits, -but that obviously isn't enough. The transient prefix command -~magit-log~, on ~l~, features several suffix commands, which show a -specific log in a separate log buffer. - -Like other transient prefix commands, ~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 ~magit-prefix-use-buffer-arguments~ -(see [[*Transient Arguments and Buffer Variables]]). - -For information about the various arguments, see [[man:git-log]] -The switch ~++order=VALUE~ is converted to one of ~--author-date-order~, -~--date-order~, or ~--topo-order~ before being passed to ~git log~. - -The log transient also features several reflog commands. See [[*Reflog]]. - -- Key: l (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. - -- Key: l l (magit-log-current) :: - - Show log for the current branch. When ~HEAD~ is detached or with a - prefix argument, show log for one or more revs read from the - minibuffer. - -- Key: l h (magit-log-head) :: - - Show log for ~HEAD~. - -- Key: l u (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 ~HEAD~ is detached, then show log for that, the - previously checked out branch and its upstream and push-target. - -- Key: l o (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. - -- Key: l L (magit-log-branches) :: - - Show log for all local branches and ~HEAD~. - -- Key: l b (magit-log-all-branches) :: - - Show log for all local and remote branches and ~HEAD~. - -- Key: l a (magit-log-all) :: - - Show log for all references and ~HEAD~. - -Two additional commands that show the log for the file or blob that is -being visited in the current buffer exists, see [[*Commands for Buffers -Visiting Files]]. The command ~magit-cherry~ also shows a log, see -[[*Cherries]]. - -*** Refreshing Logs - -The transient prefix command ~magit-log-refresh~, on ~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. - -- Key: L (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. - -- Key: L g (magit-log-refresh) :: - - This suffix command sets the local log arguments for the current - buffer. - -- Key: L s (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. - -- Key: L w (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. - -- Key: L L (magit-toggle-margin) :: - - Show or hide the margin. - -*** Log Buffer - -- Key: L (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 [[*Refreshing Logs]]. - -- Key: q (magit-log-bury-buffer) :: - - Bury the current buffer or the revision buffer in the same frame. - Like ~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. - -- Key: C-c C-b (magit-go-backward) :: - - Move backward in current buffer's history. - -- Key: C-c C-f (magit-go-forward) :: - - Move forward in current buffer's history. - -- Key: C-c C-n (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. - -- Key: j (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. - -- Key: SPC (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. - -- Key: DEL (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. - -- Key: = (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. - -- Key: + (magit-log-double-commit-limit) :: - - Double the number of commits the current log buffer is limited to. - -- Key: - (magit-log-half-commit-limit) :: - - Half the number of commits the current log buffer is limited to. - -- User Option: magit-log-auto-more :: - - Insert more log entries automatically when moving past the last - entry. Only considered when moving past the last entry with - ~magit-goto-*-section~ commands. - -- User Option: 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. - -- User Option: magit-log-show-color-graph-limit :: - - When showing more commits than specified by this option, then the - ~--color~ argument, if specified, is silently dropped. This is - necessary because the ~ansi-color~ library, which is used to turn - control sequences into faces, is just too slow. - -- User Option: magit-log-show-signatures-limit :: - - When showing more commits than specified by this option, then the - ~--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. - -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 ~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: - -#+begin_example - origin/feature - [green][blue-] - - instead of - - feature origin/feature - [blue-] [green-------] -#+end_example - -Also note that while the transient features the ~--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 ~magit-signature-*~ (which see). - -For a description of ~magit-log-margin~ see [[*Log Margin]]. - -*** 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 ~magit-INFIX-margin~, where INFIX -is the same as in the respective major-mode ~magit-INFIX-mode~. In -regular log buffers that would be ~magit-log-margin~. - -- User Option: 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 ~(INIT STYLE WIDTH AUTHOR AUTHOR-WIDTH)~. - - - If INIT is non-~nil~, then the margin is shown initially. - - STYLE controls how to format the author or committer date. It can - be one of ~age~ (to show the age of the commit), ~age-abbreviated~ (to - abbreviate the time unit to a character), or a string (suitable - for ~format-time-string~) to show the actual date. Option - ~magit-log-margin-show-committer-date~ controls which date is being - displayed. - - WIDTH controls the width of the margin. This exists for forward - compatibility and currently the value should not be changed. - - AUTHOR controls whether the name of the author is also shown by - default. - - 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. - -You can change the STYLE and AUTHOR-WIDTH of all ~magit-INFIX-margin~ -options to the same values by customizing ~magit-log-margin~ *before* -~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 ~magit-log-margin~ to ~nil~, then that is used -in the default of all other options. But setting it to ~t~, i.e. -re-enforcing the default for that option, does not carry to other -options. - -- User Option: 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. - -- Key: L (magit-margin-settings) :: - - This transient prefix command binds the following suffix commands, - each of which changes the appearance of the margin in some way. - -In some buffers that support the margin, ~L~ is instead bound to -~magit-log-refresh~, but that transient features the same commands, and -then some other unrelated commands. - -- Key: L L (magit-toggle-margin) :: - - This command shows or hides the margin. - -- Key: L l (magit-cycle-margin-style) :: - - This command cycles the style used for the margin. - -- Key: L d (magit-toggle-margin-details) :: - - This command shows or hides details in the margin. - -*** Select from Log - -When the user has to select a recent commit that is reachable from -~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: - -- Key: C-c C-c (magit-log-select-pick) :: - - Select the commit at point and act on it. Call - ~magit-log-select-pick-function~ with the selected commit as - argument. - -- Key: C-c C-k (magit-log-select-quit) :: - - Abort selecting a commit, don't act on any commit. - -- User Option: 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 ~(INIT STYLE WIDTH AUTHOR AUTHOR-WIDTH)~. - - - If INIT is non-~nil~, then the margin is shown initially. - - STYLE controls how to format the author or committer date. It can - be one of ~age~ (to show the age of the commit), ~age-abbreviated~ (to - abbreviate the time unit to a character), or a string (suitable - for ~format-time-string~) to show the actual date. Option - ~magit-log-margin-show-committer-date~ controls which date is being - displayed. - - WIDTH controls the width of the margin. This exists for forward - compatibility and currently the value should not be changed. - - AUTHOR controls whether the name of the author is also shown by - default. - - 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. - -*** Reflog - -Also see [[man:git-reflog]] - -These reflog commands are available from the log transient. See -[[*Logging]]. - -- Key: l r (magit-reflog-current) :: - - Display the reflog of the current branch. - -- Key: l O (magit-reflog-other) :: - - Display the reflog of a branch or another ref. - -- Key: l H (magit-reflog-head) :: - - Display the ~HEAD~ reflog. - -- User Option: 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 ~(INIT STYLE WIDTH AUTHOR AUTHOR-WIDTH)~. - - - If INIT is non-~nil~, then the margin is shown initially. - - STYLE controls how to format the author or committer date. It can - be one of ~age~ (to show the age of the commit), ~age-abbreviated~ (to - abbreviate the time unit to a character), or a string (suitable - for ~format-time-string~) to show the actual date. Option - ~magit-log-margin-show-committer-date~ controls which date is being - displayed. - - WIDTH controls the width of the margin. This exists for forward - compatibility and currently the value should not be changed. - - AUTHOR controls whether the name of the author is also shown by - default. - - 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. - -*** Cherries - -Cherries are commits that haven't been applied upstream (yet), and are -usually visualized using a log. Each commit is prefixed with ~-~ if it -has an equivalent in the upstream and ~+~ if it does not, i.e., if it is -a cherry. - -The command ~magit-cherry~ shows cherries for a single branch, but the -references buffer (see [[*References Buffer]]) can show cherries for -multiple "upstreams" at once. - -Also see [[man:git-reflog]] - -- Key: Y (magit-cherry) :: - - Show commits that are in a certain branch but that have not been - merged in the upstream branch. - -- User Option: 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 ~(INIT STYLE WIDTH AUTHOR AUTHOR-WIDTH)~. - - - If INIT is non-~nil~, then the margin is shown initially. - - STYLE controls how to format the author or committer date. It can - be one of ~age~ (to show the age of the commit), ~age-abbreviated~ (to - abbreviate the time unit to a character), or a string (suitable - for ~format-time-string~) to show the actual date. Option - ~magit-log-margin-show-committer-date~ controls which date is being - displayed. - - WIDTH controls the width of the margin. This exists for forward - compatibility and currently the value should not be changed. - - AUTHOR controls whether the name of the author is also shown by - default. - - 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. - -** Diffing - -The status buffer contains diffs for the staged and unstaged commits, -but that obviously isn't enough. The transient prefix command -~magit-diff~, on ~d~, features several suffix commands, which show a -specific diff in a separate diff buffer. - -Like other transient prefix commands, ~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 ~magit-prefix-use-buffer-arguments~ -(see [[*Transient Arguments and Buffer Variables]]). - -Also see [[man:git-diff]] - -- Key: d (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. - -- Key: d d (magit-diff-dwim) :: - - Show changes for the thing at point. - - For example, if point is on a commit, show the changes introduced by - that commit. Likewise if point is on the section titled "Unstaged - changes", then show those changes in a separate buffer. Generally - speaking, compare the thing at point with the most logical, trivial - and (in *any* situation) at least potentially useful other thing it - could be compared to. - - When the region selects commits, then compare the two commits at - either end. There are different ways two commits can be compared. - In the buffer showing the diff, you can control how the comparison, - is done, using "D r" and "D f". - - This function does not always show the changes that you might want - to view in any given situation. You can think of the changes being - shown as the smallest common denominator. There is no AI involved. - If this command never does what you want, then ignore it, and instead - use the commands that allow you to explicitly specify what you need. - -- Key: d r (magit-diff-range) :: - - Show differences between two commits. - - RANGE should be a range (A..B or A...B) but can also be a single - commit. If one side of the range is omitted, then it defaults to - ~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 "..." range). - -- Key: d w (magit-diff-working-tree) :: - - Show changes between the current working tree and the ~HEAD~ commit. - With a prefix argument show changes between the working tree and a - commit read from the minibuffer. - -- Key: d s (magit-diff-staged) :: - - Show changes between the index and the ~HEAD~ commit. With a prefix - argument show changes between the index and a commit read from the - minibuffer. - -- Key: d u (magit-diff-unstaged) :: - - Show changes between the working tree and the index. - -- Key: d p (magit-diff-paths) :: - - Show changes between any two files on disk. - -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: - -- Key: d c (magit-show-commit) :: - - Show the commit at point. If there is no commit at point or with a - prefix argument, prompt for a commit. - -- Key: d t (magit-stash-show) :: - - Show all diffs of a stash in a buffer. - -Two additional commands that show the diff for the file or blob that -is being visited in the current buffer exists, see [[*Commands for -Buffers Visiting Files]]. - -*** Refreshing Diffs - -The transient prefix command ~magit-diff-refresh~, on ~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 ~magit-merge-preview~ because the underlying Git command does -not support these arguments.) - -- Key: D (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. - -- Key: D g (magit-diff-refresh) :: - - This suffix command sets the local diff arguments for the current - buffer. - -- Key: D s (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. - -- Key: D w (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. - -- Key: D t (magit-diff-toggle-refine-hunk) :: - - This command toggles hunk refinement on or off. - -- Key: D r (magit-diff-switch-range-type) :: - - This command converts the diff range type from "revA..revB" to - "revB...revA", or vice versa. - -- Key: D f (magit-diff-flip-revs) :: - - This command swaps revisions in the diff range from "revA..revB" - to "revB..revA", or vice versa. - -- Key: D F (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. - -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. - -- Key: - (magit-diff-less-context) :: - - This command decreases the context for diff hunks by COUNT lines. - -- Key: + (magit-diff-more-context) :: - - This command increases the context for diff hunks by COUNT lines. - -- Key: 0 (magit-diff-default-context) :: - - This command resets the context for diff hunks to the default height. - -The following commands quickly change what diff is being displayed -without having to using one of the diff transient. - -- Key: C-c C-d (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. - -- Key: C-c C-b (magit-go-backward) :: - - This command moves backward in current buffer's history. - -- Key: C-c C-f (magit-go-forward) :: - - This command moves forward in current buffer's history. - -*** Commands Available in Diffs - -Some commands are only available if point is inside a diff. - -~magit-diff-visit-file~ and related commands visit the appropriate -version of the file that the diff at point is about. Likewise -~magit-diff-visit-worktree-file~ and related commands visit the worktree -version of the file that the diff at point is about. See [[*Visiting -Files and Blobs from a Diff]] for more information and the key bindings. - -- Key: C-c C-t (magit-diff-trace-definition) :: - - This command shows a log for the definition at point. - -- User Option: magit-log-trace-definition-function :: - - The function specified by this option is used by - ~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. - -- Key: C-c C-e (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 ~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 ~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 ~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 ~magit-rebase-edit-commit~ instead of this command. - -- Key: j (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. - -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. - -- Key: SPC (scroll-up) :: - - This command scrolls text upward. - -- Key: DEL (scroll-down) :: - - This command scrolls text downward. - -*** Diff Options - -- User Option: magit-diff-refine-hunk :: - - Whether to show word-granularity differences within diff hunks. - - - ~nil~ Never show fine differences. - - ~all~ Show fine differences for all displayed diff hunks. - - ~t~ Refine each hunk once it becomes the current section. - Keep the refinement when another section is selected. - Refreshing the buffer removes all refinement. This - variant is only provided for performance reasons. - -- User Option: magit-diff-refine-ignore-whitespace :: - - Whether to ignore whitespace changes in word-granularity - differences. - -- User Option: 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 ~magit-diff--tab-width-cache~. Set that to ~nil~ to invalidate - the cache. - - - ~nil~ Never adjust tab width. Use `tab-width's value from the Magit - buffer itself instead. - - - ~t~ If the corresponding file-visiting buffer exits, then use - ~tab-width~'s value from that buffer. Doing this is cheap, so this - value is used even if a corresponding cache entry exists. - - - ~always~ If there is no such buffer, then temporarily visit the file - to determine the value. - - - NUMBER Like ~always~, but don't visit files larger than NUMBER - bytes. - -- User Option: magit-diff-paint-whitespace :: - - Specify where to highlight whitespace errors. - - See ~magit-diff-highlight-trailing~, - ~magit-diff-highlight-indentation~. The symbol ~t~ means in all - diffs, ~status~ means only in the status buffer, and ~nil~ means - nowhere. - - - ~nil~ Never highlight whitespace errors. - - ~t~ Highlight whitespace errors everywhere. - - ~uncommitted~ Only highlight whitespace errors in diffs showing - uncommitted changes. For backward compatibility ~status~ is treated - as a synonym. - -- User Option: magit-diff-paint-whitespace-lines :: - - Specify in what kind of lines to highlight whitespace errors. - - - ~t~ Highlight only in added lines. - - ~both~ Highlight in added and removed lines. - - ~all~ Highlight in added, removed and context lines. - -- User Option: magit-diff-highlight-trailing :: - - Whether to highlight whitespace at the end of a line in diffs. Used - only when ~magit-diff-paint-whitespace~ is non-~nil~. - -- User Option: 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 ~magit-diff-paint-whitespace~ is also non-~nil~. - - The value is an alist of the form ~((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 ~tabs~, highlight indentation with tabs. If - INDENT is an integer, highlight indentation with at least that many - spaces. Otherwise, highlight neither. - -- User Option: magit-diff-hide-trailing-cr-characters :: - - Whether to hide ^M characters at the end of a line in diffs. - -- User Option: magit-diff-highlight-hunk-region-functions :: - - This option specifies the functions used to highlight the - hunk-internal region. - - ~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. - - ~magit-diff-highlight-hunk-region-using-overlays~ and - ~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 - 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 ~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. - -- User Option: 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 ~magit-diff-highlight-hunk-region-functions~. - -- User Option: magit-diff-extra-stat-arguments :: - - This option specifies additional arguments to be used alongside - ~--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: ~--stat-width~, ~--stat-name-width~, - ~--stat-graph-width~ and ~--compact-summary~. Also see [[man:git-diff]] - -- User Option: magit-format-file-function :: - - This function is used to format lines representing a file. It is - used for file headings in diffs, in diffstats and for lists of files - (such as the untracked files). Depending on the caller, it receives - either three or five arguments; the signature has to be ~(kind file - face &optional status orig)~. KIND is one of ~diff~, ~module~, ~stat~ and - ~list~. - -*** Revision Buffer - -- User Option: magit-revision-insert-related-refs :: - - Whether to show related branches in revision buffers. - - - ~nil~ Don't show any related branches. - - ~t~ Show related local branches. - - ~all~ Show related local and remote branches. - - ~mixed~ Show all containing branches and local merged branches. - -- User Option: magit-revision-show-gravatars :: - - Whether to show gravatar images in revision buffers. - - If ~nil~, then don't insert any gravatar images. If ~t~, then insert - both images. If ~author~ or ~committer~, then insert only the - respective image. - - If you have customized the option ~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~." - -- User Option: 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 - ~commit~ sections. There is a trade off to be made between - performance and reliability: - - - ~slow~ calls git for every word to be absolutely sure. - - ~quick~ skips words less than seven characters long. - - ~quicker~ additionally skips words that don't contain a number. - - ~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. - - If ~nil~, then no hashes are turned into sections, but you can still - visit the commit at point using "RET". - -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 -~magit-diff-toggle-file-filter~). - -- User Option: 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 ~--follow~. - - When this option is ~nil~, displaying a commit from a log ignores the - log's file filter if the log arguments include ~--follow~. Doing so - avoids showing an empty diff in revision buffers for commits before - a rename event. In such cases, the ~--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 ~--follow~ is present in the log arguments. - -If the revision buffer is not displayed from a log buffer, the file -restriction is determined as usual (see [[*Transient Arguments and -Buffer Variables]]). - -** Ediffing - -This section describes how to enter Ediff from Magit buffers. For -information on how to use Ediff itself, see info:ediff. - -- Key: e (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 ~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. - -- Key: E (magit-ediff) :: - - This transient prefix command binds the following suffix commands - and displays them in a temporary buffer until a suffix is invoked. - -- Key: E r (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 "..." range). - -- Key: E m (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 ~merge.conflictstyle~ is ~diff3~, you can - view the file's merge-base revision using ~/~ 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. - -- Key: E M (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 ~merge.conflictstyle~ is ~diff3~, you can - view the file's merge-base revision using ~/~ in the Ediff control - buffer. - - First the file in the worktree is moved aside, appending the suffix - =.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 ~magit-ediff-resolve-rest~ might be more - suitable. - - The advantage that this command has over ~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. - -- Key: E t (magit-git-mergetool) :: - - This command does not actually use Ediff. While it serves the same - purpose as =magit-ediff-resolve-rest=, it uses =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. - -- Key: E s (magit-ediff-stage) :: - - Stage and unstage changes to a file using Ediff, defaulting to the - file at point. - -- Key: E u (magit-ediff-show-unstaged) :: - - Show unstaged changes to a file using Ediff. - -- Key: E i (magit-ediff-show-staged) :: - - Show staged changes to a file using Ediff. - -- Key: E w (magit-ediff-show-working-tree) :: - - Show changes in a file between ~HEAD~ and working tree using Ediff. - -- Key: E c (magit-ediff-show-commit) :: - - Show changes to a file introduced by a commit using Ediff. - -- Key: E z (magit-ediff-show-stash) :: - - Show changes to a file introduced by a stash using Ediff. - -- User Option: magit-ediff-dwim-resolve-function :: - - This option controls which function ~magit-ediff-dwim~ uses to resolve - conflicts. One of ~magit-ediff-resolve-rest~, ~magit-ediff-resolve-all~ - or ~magit-git-mergetool~; which are all discussed above. - -- User Option: magit-ediff-dwim-show-on-hunks :: - - This option controls what command ~magit-ediff-dwim~ calls when - point is on uncommitted hunks. When ~nil~, always run - ~magit-ediff-stage~. Otherwise, use ~magit-ediff-show-staged~ and - ~magit-ediff-show-unstaged~ to show staged and unstaged changes, - respectively. - -- User Option: magit-ediff-show-stash-with-index :: - - This option controls whether ~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. - -- User Option: 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 ~ediff-quit-hook~ but takes the needs of Magit into - account. The regular ~ediff-quit-hook~ is ignored by Ediff sessions - that were created using a Magit command. - -** References Buffer - -- Key: y (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. - -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 ~magit-refs-show-commit-count~ (see -below). These commands specify a different branch or commit against -which all the other references are compared. - -- Key: y y (magit-show-refs-head) :: - - This command lists branches and tags in a dedicated buffer. Each - reference is being compared with ~HEAD~. - -- Key: y c (magit-show-refs-current) :: - - This command lists branches and tags in a dedicated buffer. Each - reference is being compared with the current branch or ~HEAD~ if it - is detached. - -- Key: y o (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. - -- Key: y r (magit-refs-set-show-commit-count) :: - - This command changes for which refs the commit count is shown. - -- User Option: magit-refs-show-commit-count :: - - Whether to show commit counts in Magit-Refs mode buffers. - - - ~all~ Show counts for branches and tags. - - ~branch~ Show counts for branches only. - - ~nil~ Never show counts. - - The default is ~nil~ because anything else can be very expensive. - -- User Option: 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 ~magit-dimmed~. - - If this is non-~nil~, then spaces are placed on both sides of all - commit counts. - -- User Option: 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. - -- User Option: 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.) - -- User Option: 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 ~*~ or ~@~. - For each other reference, this column optionally shows how many - commits it is ahead of the focused branch and ~<~, or if it isn't - ahead then the commits it is behind and ~>~, or if it isn't behind - either, then a ~=~. - - This column may also display only ~*~ or ~@~ for the focused branch, in - which case this option is ignored. Use ~L v~ to change the verbosity - of this column. - -- User Option: 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 ~(INIT STYLE WIDTH AUTHOR AUTHOR-WIDTH)~. - - - If INIT is non-~nil~, then the margin is shown initially. - - STYLE controls how to format the author or committer date. It can - be one of ~age~ (to show the age of the commit), ~age-abbreviated~ (to - abbreviate the time unit to a character), or a string (suitable - for ~format-time-string~) to show the actual date. Option - ~magit-log-margin-show-committer-date~ controls which date is being - displayed. - - WIDTH controls the width of the margin. This exists for forward - compatibility and currently the value should not be changed. - - AUTHOR controls whether the name of the author is also shown by - default. - - 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. - -- User Option: 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. - -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: - -- ~%a~ Number of commits this ref has over the one we compare to. -- ~%b~ Number of commits the ref we compare to has over this one. -- ~%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. -- ~%C~ For the ref which all other refs are compared this is "@", if it - is the current branch, or "#" otherwise. For all other refs " ". -- ~%h~ Hash of this ref's tip. -- ~%m~ Commit summary of the tip of this ref. -- ~%n~ Name of this ref. -- ~%u~ Upstream of this local branch. -- ~%U~ Upstream of this local branch and additional local vs. upstream - information. - -# new list -- User Option: 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 ~magit-refs-sections-hook~ instead. - - This alist controls which tags and branches are omitted from being - displayed in ~magit-refs-mode~ buffers. If it is ~nil~, then all refs - are displayed (subject to ~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. - -- Key: RET (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 ~magit-show-commit~ as described above, - except if point is on a reference in a ~magit-refs-mode~ buffer, in - which case the behavior may be different, but only if you have - customized the option ~magit-visit-ref-behavior~. - -- User Option: magit-visit-ref-behavior :: - - This option controls how ~magit-visit-ref~ behaves in ~magit-refs-mode~ - buffers. - - By default ~magit-visit-ref~ behaves like ~magit-show-commit~, in all - buffers, including ~magit-refs-mode~ buffers. When the type of the - section at point is ~commit~ then "RET" is bound to ~magit-show-commit~, - and when the type is either ~branch~ or ~tag~ then it is bound to - ~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 ~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 ~M-x magit-show-commit~ to get it back. - - ~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. - - - ~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 ~HEAD~. - - Instead of adding this symbol, consider pressing "C-u y o RET". - - - ~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. - - - ~checkout-any~ - - Check out the reference at point. If that reference is a tag - or a remote branch, then this results in a detached ~HEAD~. - - Instead of adding this symbol, consider pressing "b b RET", - like you would do in other buffers. - - - ~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. - -*** References Sections - -The contents of references buffers is controlled using the hook -~magit-refs-sections-hook~. See [[*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. - -- User Option: magit-refs-sections-hook :: - - Hook run to insert sections into a references buffer. - -- Function: magit-insert-local-branches :: - - Insert sections showing all local branches. - -- Function: magit-insert-remote-branches :: - - Insert sections showing all remote-tracking branches. - -- Function: magit-insert-tags :: - - Insert sections showing all tags. - -** Bisecting - -Also see [[man:git-bisect]] - -- Key: B (magit-bisect) :: - - This transient prefix command binds the following suffix commands - and displays them in a temporary buffer until a suffix is invoked. - -When bisecting is not in progress, then the transient features the -following suffix commands. - -- Key: B B (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. - -- Key: B s (magit-bisect-run) :: - - Bisect automatically by running commands after each step. - -When bisecting in progress, then the transient instead features the -following suffix commands. - -- Key: B b (magit-bisect-bad) :: - - Mark the current commit as bad. Use this after you have asserted - that the commit does contain the bug in question. - -- Key: B g (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. - -- Key: B m (magit-bisect-mark) :: - - Mark the current commit with one of the bisect terms. This command - provides an alternative to ~magit-bisect-bad~ and - ~magit-bisect-good~ and is useful when using terms other than "bad" - and "good". This suffix is disabled by default. - -- Key: B k (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. - -- Key: B r (magit-bisect-reset) :: - - After bisecting, cleanup bisection state and return to original - ~HEAD~. - -By default the status buffer shows information about the ongoing -bisect session. - -- User Option: magit-bisect-show-graph :: - - This option controls whether a graph is displayed for the log of - commits that still have to be bisected. - -** 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 *groups* of such commands and the several *variants* within each -group. - -Also see [[*Commands for Buffers Visiting Files]]. - -*** 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. - -- 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. - -- 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. - -- 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. - -*** Visiting Files and Blobs from a Diff - -These commands can only be used when point is inside a diff. -Elsewhere use ~magit-find-file~. - -- Key: RET (magit-diff-visit-file) :: - - This command visits the appropriate version of the file at point. - - Display the buffer in the selected window. With a prefix argument, - OTHER-WINDOW, instead display the buffer in another window. - - In the visited file or blob, go to the location corresponding to the - location in the diff. - - If point is on an added or context line, visit the blob corresponding - to our side (i.e., the new/right side). If point is on a removed line, - visit the blob corresponding to their side (i.e., the old/left side). - - This applies to diffs of staged and unstaged changes as well. For - staged changes the two sides are blobs from the index and the `HEAD' - commit. For unstaged changes the two sides are the actual file in - the worktree and the blob from the index. - - To visit the file in the worktree, regardless of what the current - diff is about, use ~magit-diff-visit-worktree-file~, described next. - -- Key: C- (magit-diff-visit-worktree-file) :: - - This command visits the worktree version of the appropriate file. - The location of point inside the diff determines which file is being - visited. Unlike ~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. - -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. - -- Command: magit-diff-visit-file-other-window :: -- Command: magit-diff-visit-file-other-frame :: -- Command: magit-diff-visit-worktree-file-other-window :: -- Command: magit-diff-visit-worktree-file-other-frame :: - - These commands behave like the respective commands described above, - except that they display the blob or file in another window or frame. - -- User Option: magit-diff-visit-prefer-worktree :: - - This option controls whether ~magit-diff-visit-file~ always visits the - respective file in the worktree, when invoked anywhere from within a - hunk of staged or unstaged changes. - - By default ~magit-diff-visit-file~ does not do that. Instead it - behaves for staged and unstaged changes as it does for committed - changes, by visiting a blob from the old/left or new/right side, - depending on whether point is on a removed line or not. - - For staged changes the old side is the blob from HEAD and the right - side is the blog from the index. For unstaged changes the left side - is the blob from the index (if there are any changes in the index - for that file, else the blob from HEAD), and the right side is the - file in the worktree. - - Being able to jump to HEAD or the index from a removed line is very - useful, because it allows you to, e.g., use blame to investigate why - some line, which you have already removed, was added in the first - place. - - But if you want to make further changes to already staged changes, - you of course instead need to go to the respective file in the - worktree. The command ~magit-diff-visit-worktree-file~ was created - for that purpose, and it is strongly recommend that you make use of - that command, even if you initially find it inconvenient having to - remember to use ~C-~ instead of ~RET~ in this case. - - While discouraged, you can alternatively set this option to ~t~, - which causes ~magit-diff-visit-file~ itself to go to the file in the - worktree, even when invoked from within a hunk of staged changes. - If you do that, you lose the ability to instantly go to lines you - have already removed. - -- User Option: magit-diff-visit-previous-blob :: - - This option controls whether ~magit-diff-visit-file~ visits the - previous blob when invoked with point on a removed line. - - When this is ~t~ (the default) and point is on a removed line, then - ~magit-diff-visit-file~ visits the blob from the old/left commit, - which still has that line, instead of going to the new/right blob, - which removes that line. - - Setting this to ~nil~, causes ~magit-diff-visit-file~ to always go to - the new/right blob, even when point is on a removed line. This is - very strongly discouraged. Instead place the cursor anywhere else - within the hunk but on a removed line, if you want to visit the new - side. That way you don't lose the ability to visit the old side. - -** Blaming - -Also see [[man:git-blame]] - -To start blaming, invoke the ~magit-file-dispatch~ transient prefix -command. When using the default key bindings, that can be done -by pressing ~C-c M-g~. When using the recommended bindings, this -command is instead bound to ~C-c f~. Also see [[*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. - -- Key: C-c f B (magit-blame) :: -- Key: C-c f b (magit-blame-addition) :: -- Key: C-c f B b :: -- Key: C-c f r (magit-blame-removal) :: -- Key: C-c f B r :: -- Key: C-c f f (magit-blame-reverse) :: -- Key: C-c f B f :: -- Key: C-c f e (magit-blame-echo) :: -- Key: C-c f B e :: -- Key: C-c f q (magit-blame-quit) :: -- Key: C-c f B q :: - - 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 [[*Global Bindings]]. - -- Key: C-c M-g B (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. - -Note that not all of the following suffixes are available at all -times. For example if ~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. - -- Key: C-c M-g b (magit-blame-addition) :: -- Key: C-c M-g B b :: - - 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 - ~magit-find-file~), where REVISION is a parent of the revision that - added the current line or chunk of lines. - -- Key: C-c M-g r (magit-blame-removal) :: -- Key: C-c M-g B r :: - - 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 ~magit-blame-addition~, this command can be used recursively. - -- Key: C-c M-g f (magit-blame-reverse) :: -- Key: C-c M-g B f :: - - 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 ~magit-blame-addition~, this command can be used recursively. - -- Key: C-c M-g e (magit-blame-echo) :: -- Key: C-c M-g B e :: - - This command is like ~magit-blame-addition~ except that it doesn't - turn on ~read-only-mode~ and that it initially uses the visualization - style specified by option ~magit-blame-echo-style~. - -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. - -- Key: C-c M-g q (magit-blame-quit) :: -- Key: C-c M-g B q :: - - This command turns off Magit-Blame mode. If the buffer was created - during a recursive blame, then it also kills the buffer. - -- Key: RET (magit-show-commit) :: - - This command shows the commit that last touched the line at point. - -- Key: SPC (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. - -- Key: DEL (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. - -The following key bindings are available when both Magit-Blame mode -and Read-Only mode are enabled. - -- Key: b (magit-blame) :: - - See above. - -- Key: n (magit-blame-next-chunk) :: - - This command moves to the next chunk. - -- Key: N (magit-blame-next-chunk-same-commit) :: - - This command moves to the next chunk from the same commit. - -- Key: p (magit-blame-previous-chunk) :: - - This command moves to the previous chunk. - -- Key: P (magit-blame-previous-chunk-same-commit) :: - - This command moves to the previous chunk from the same commit. - -- Key: q (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. - -- Key: M-w (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 ~kill-ring-save~ would. - -- Key: c (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 ~magit-blame-styles~. - -Blaming is also controlled using the following options. - -- User Option: magit-blame-styles :: - - This option defines a list of styles used to visualize blame - information. For now see its doc-string to learn more. - -- User Option: magit-blame-echo-style :: - - This option specifies the blame visualization style used by the - command ~magit-blame-echo~. This must be a symbol that is used as the - identifier for one of the styles defined in ~magit-blame-styles~. - -- User Option: magit-blame-time-format :: - - This option specifies the format string used to display times when - showing blame information. - -- User Option: magit-blame-read-only :: - - This option controls whether blaming a buffer also makes temporarily - read-only. - -- User Option: 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. - -- User Option: magit-blame-goto-chunk-hook :: - - This hook is run when moving between chunks. - -* Manipulating -** Creating Repository - -- Key: I (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. - -** Cloning Repository - -To clone a remote or local repository use ~C~, which is bound to the -command ~magit-clone~. This command either act as a transient prefix -command, which binds several infix arguments and suffix commands, or -it can invoke ~git clone~ directly, depending on whether a prefix -argument is used and on the value of ~magit-clone-always-transient~. - -- User Option: magit-clone-always-transient :: - - This option controls whether the command ~magit-clone~ always acts as - a transient prefix command, regardless of whether a prefix argument - is used or not. If ~t~, then that command always acts as a transient - prefix. If ~nil~, then a prefix argument has to be used for it to act - as a transient. - -- Key: C (magit-clone) :: - - This command either acts as a transient prefix command as described - above or does the same thing as ~transient-clone-regular~ as described - below. - - If it acts as a transient prefix, then it binds the following suffix - commands and several infix arguments. - -- Key: C C (magit-clone-regular) :: - - This command creates a regular clone of an existing repository. - The repository and the target directory are read from the user. - -- Key: C s (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. - -- Key: C > (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 - ~magit-sparse-checkout~ transient (see [[*Sparse checkouts]]). - -- Key: C b (magit-clone-bare) :: - - This command creates a bare clone of an existing repository. - The repository and the target directory are read from the user. - -- Key: C m (magit-clone-mirror) :: - - This command creates a mirror of an existing repository. - The repository and the target directory are read from the user. - -The following suffixes are disabled by default. See -[[info:transient#Enabling and Disabling Suffixes]] for how to enable them. - -- Key: C d (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. - -- Key: C e (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. - -- User Option: magit-clone-set-remote-head :: - - This option controls whether cloning causes the reference - ~refs/remotes//HEAD~ to be created in the clone. The default - is to delete the reference after running ~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 ~HEAD~ - of the remote changes. Setting this option to ~t~ preserves Git's - default behavior of creating the reference. - -- User Option: magit-clone-set-remote.pushDefault :: - - This option controls whether the value of the Git variable - ~remote.pushDefault~ is set after cloning. - - - If ~t~, then it is always set without asking. - - If ~ask~, then the users are asked every time they clone a - repository. - - If ~nil~, then it is never set. - -- User Option: magit-clone-default-directory :: - - This option control the default directory name used when reading the - destination for a cloning operation. - - - If ~nil~ (the default), then the value of ~default-directory~ is used. - - If a directory, then that is used. - - If a function, then that is called with the remote url as the only - argument and the returned value is used. - -- User Option: 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 ~(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 ~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. - -- User Option: magit-clone-url-format :: - - The format specified by this option is used when turning repository - names into urls. ~%h~ is the hostname and ~%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 - ~(HOSTNAME . FORMAT)~ mapping hostnames to formats. When an alist - is used, the ~t~ key represents the default format. - - Example of a single format string: - - #+BEGIN_SRC emacs-lisp - (setq magit-clone-url-format - "git@%h:%n.git") - #+END_SRC - - Example of by-hostname format strings: - - #+BEGIN_SRC emacs-lisp - (setq magit-clone-url-format - '(("git.example.com" . "git@%h:~%n") - (nil . "git@%h:%n.git"))) - #+END_SRC - -- User Option: magit-post-clone-hook :: - - Hook run after the Git process has successfully finished cloning the - repository. When the hook is called, ~default-directory~ is - let-bound to the directory where the repository has been cloned. - -** 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 ~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 ~s~ or ~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 [[*Ediffing]]. - -- Key: s (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. - -- Key: S (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. - -- Key: u (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. - -- Key: U (magit-unstage-all) :: - - Remove all changes from the staging area. - -- User Option: magit-unstage-committed :: - - This option controls whether ~magit-unstage~ "unstages" committed - changes by reversing them in the index but not the working tree. - The alternative is to raise an error. - -- Key: M-x 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 ~u~ (~magit-unstage~) is - pressed on a committed change. - - This allows extracting a change from ~HEAD~, while leaving it in the - working tree, so that it can later be committed using a separate - commit. A typical workflow would be: - - 0. Optionally make sure that there are no uncommitted changes. - 1. Visit the ~HEAD~ commit and navigate to the change that should - not have been included in that commit. - 2. Type ~u~ (~magit-unstage~) to reverse it in the index. - This assumes that ~magit-unstage-committed~ is non-~nil~. - 3. Type ~c e~ to extend ~HEAD~ with the staged changes, - including those that were already staged before. - 4. Optionally stage the remaining changes using ~s~ or ~S~ and then - type ~c c~ to create a new commit. - -- Key: M-x 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 ~HEAD~. - -*** 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. - -- Key: M-x 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. - -- Key: M-x 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. - -** 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 ~git apply~, which is why they are called -"apply variants". - -- Stage. Apply a change from the working tree to the index. The change - also remains in the working tree. - -- Unstage. Remove a change from the index. The change remains in the - working tree. - -- 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. - -- Reverse. Reverse a change in the working tree. Both committed and - staged changes can be reversed. Unstaged changes cannot be - reversed. Discard them instead. - -- 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. - -The previous section described the staging and unstaging commands. -What follows are the commands which implement the remaining apply -variants. - -- Key: a (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. - -- Key: k (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. - -- Key: v (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. - -With a prefix argument all apply variants attempt a 3-way merge when -appropriate (i.e., when ~git apply~ is used internally). - -** Committing - -When the user initiates a commit, Magit calls ~git commit~ without the -~--message~ argument, so Git has to get the message from the user. To -do so, it creates a file such as ~.git/COMMIT_EDITMSG~ and then opens -that file in the editor specified by ~$EDITOR~ (or ~$GIT_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 the commit message. - -*** Initiating a Commit - -Also see [[man:git-commit]] - -- Key: c (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. - -**** Creating a new commit - -- Key: c c (magit-commit-create) :: - - Create a new commit. - -**** Editing the last commit - -These commands modify the last (a.k.a., "HEAD") commit. The commit is -modified (a.k.a., replaced) immediately. Similar commands exist for -modifying other (non-HEAD) commits. Those commands are described in -the following two sections. For each command in this section, we -mention the respective non-HEAD commands, to make the relation -explicit. - -The command descriptions below mention the specific arguments they use -when calling ~git commit~. The arguments specified in the menu are -appended to those arguments. - -- Key: c e (magit-commit-extend) :: - - This command amends the staged changes to the last commit, without - editing its commit message. - - This command calls ~git commit --amend --no-edit~. - - With a prefix argument the committer date is not updated; without an - argument it is updated. - - The option ~magit-commit-extend-override-date~ can be used to inverse - the meaning of the prefix argument. Non-interactively, the optional - OVERRIDE-DATE argument controls this behavior, and the option is of - no relevance. - -- Key: c a (magit-commit-amend) :: - - This command amends the staged changes to the last commit, and pops - up a buffer to let the user edit its commit message. - - This command calls ~git commit --amend --edit~. - -- Key: c w (magit-commit-reword) :: - - This command pops up a buffer to let the user edit the message of - the latest commit. The commit tree remains unchanged and staged - changes remain staged. - - This command calls ~git commit --amend --only --edit~. - - With a prefix argument the committer date is not updated; without an - argument it is updated. - - The option ~magit-commit-reword-override-date~ can be used to inverse - the meaning of the prefix argument. Non-interactively, the optional - OVERRIDE-DATE argument controls this behavior, and the option is of - no relevance. - -**** Editing any reachable commit - -These commands create a new commit, which targets an existing commit, -from the staged changes and/or using a new commit message. Any commit -that is reachable from HEAD, including HEAD itself, can be the target. - -The new commit is intended to be eventually squashed into the targeted -commit, but this is *not* done immediately. The squashing is done at a -later time, when you explicitly call ~magit-rebase-autosquash~, or use -~--autosquash~ with another rebase command. - -Some of these commands require that you immediately write a new commit -message, or that you immediately edit an existing message. - -The new commits are called "squash" and "fixup" commits. The -difference is that when a "squash" commit is squashed into its -targeted commit, the user gets a chance to modify the message to be -used for the final commit; while for "fixup" commits the existing -message of the targeted commit is used as-is and the message of the -"fixup" commit is discarded. - -If point is on a reachable commit, then all of these commands target -that commit, without requiring confirmation. If point is on some -reachable commit, but you want to target another commit, use a prefix -argument, to select a commit in a log buffer dedicated to that task. -The meaning of the prefix argument can be inverted by customizing -~magit-commit-squash-confirm~. - -The command descriptions below mention the specific arguments they use -when calling ~git commit~. The arguments specified in the menu are -appended to those arguments. - -The next two commands also exist in "instant" variants, which are -described in the next section. Those variants behave the same as the -variants described here, except that they immediately initiate an -~--autosquash~ rebase. - -- Key: c f (magit-commit-fixup) :: - - This command creates a new fixup commit from the staged changes, - targeting the reachable commit at point, if any. Otherwise the - user is prompted for a commit. - - Use this variant if you want to correct some minor defect in the - targeted commit, which does not require changes to the existing - message of the targeted commit. - - This command calls ~git commit --fixup=COMMIT --no-edit~. - -- Key: c s (magit-commit-squash) :: - - This command creates a new squash commit from the staged changes, - targeting the reachable commit at point, if any. Otherwise the - user is prompted for a commit. - - Use this variant if you want a chance to make changes to the final - commit message, but not until the two commits are being squashed - into the final combined commit. - - This command calls ~git commit --squash=COMMIT --no-edit~. - -- Key: c A (magit-commit-alter) :: - - This command creates a new fixup commit from the staged changes, - targeting the reachable commit at point, if any. Otherwise the - user is prompted for a commit. - - Use this variant if you want to write the final commit message now, - but (as for all variants in this section) do not want to immediately - squash the fixup and targeted commits into a final combined commit. - - This command calls ~git commit --fixup=amend:COMMIT --edit~. - -- Key: c n (magit-commit-augment) :: - - This command creates a new squash commit from the staged changes, - targeting the reachable commit at point, if any. Otherwise the - user is prompted for a commit. - - Use this variant if you want to describe the new changes now, but - want to delay writing the final message, which describes the changes - in the combined commit, until you actually combine the squash and - target commits into the final commit. You can think of the new - message, which you write here, as a "note", to be integrated once - once you write the final commit message. - - This command calls ~git commit --squash=COMMIT --edit~. - -- Key: c W (magit-commit-revise) :: - - This command pops up a buffer containing the commit message of the - reachable commit at point, if any. Otherwise the user is prompted - for a commit to target. - - Use this variant if you want to correct the message of the targeted - commit, but want to delay performing the ~--autosquash~ rebase, which - actually changes that commit. - - This command calls ~git commit --fixup=reword:COMMIT --edit~. - -**** Editing any reachable commit and rebasing immediately - -These commands create a new commit, which targets an existing commit, -from the staged changes. Any commit that is reachable from HEAD, -including HEAD itself, can be the target. - -The new commit is immediately squashed into its target commit, using -an ~--autosquash~ rebase. - -The command descriptions below mention the specific arguments they use -when calling ~git commit~. The arguments specified in the menu are -appended to those arguments when calling ~git commit~. - -- Key: c F (magit-commit-instant-fixup) :: - - This command creates a fixup commit, targeting the reachable commit - at point, if any. Otherwise the user is prompted for a commit. Then - it instantly performs a rebase, to squash the new commit into the - targeted commit. - - The original commit message of the targeted commit is left untouched. - - This command calls ~git commit --fixup=COMMIT --no-edit~ - and then ~git rebase --autosquash MERGE-BASE~. - -- Key: c S (magit-commit-instant-squash) :: - - This command creates a squash commit, targeting the reachable commit - at point, if any. Otherwise the user is prompted for a commit. Then - it instantly performs a rebase, to squash the new commit into the - targeted commit. - - During the rebase phase the user is asked to author the final commit - message, based on the original message of the targeted commit. - - This command calls ~git commit --squash=COMMIT --no-edit~ - and then ~git rebase --autosquash MERGE-BASE~. - -**** Options used by commit commands -***** Used by all or most commit commands - -- User Option: magit-commit-show-diff :: - - Whether the relevant diff is automatically shown when committing. - -- User Option: magit-commit-ask-to-stage :: - - Whether to ask to stage all unstaged changes when committing and - nothing is staged. - -- User Option: magit-post-commit-hook :: - - Hook run after creating a commit without the user editing a message. - - This hook is run by ~magit-refresh~ if ~this-command~ is a member - of ~magit-post-commit-hook-commands~. This only includes commands - named ~magit-commit-*~ that do *not* require that the user edits - the commit message in a buffer. - - Also see ~git-commit-post-finish-hook~. - -- User Option: 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 https://github.com/magit/magit/issues/4132. - -***** Used by all squash and fixup commands - -- User Option: 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 - ~magit-commit-squash~ and ~magit-commit-fixup~. The "instant" variants - always require confirmation because making an error while using - those is harder to recover from. - -***** Used by specific commit commands - -- User Option: magit-commit-extend-override-date :: - - Whether using ~magit-commit-extend~ changes the committer date. - -- User Option: magit-commit-reword-override-date :: - - Whether using ~magit-commit-reword~ changes the committer date. - -*** 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 ~git~ -is waiting for the editor, in our case ~emacsclient~, to save the commit -message in a file (in most cases ~.git/COMMIT_EDITMSG~) and then return. -If the editor returns with a non-zero exit status then ~git~ does not -create the commit. So the most important commands are those for -finishing and aborting the commit. - -- Key: C-c C-c (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. - -- Key: C-c C-k (with-editor-cancel) :: - - Cancel the current editing session by returning with exit code 1. - Git then cancels the commit, but leaves the file untouched. - -In addition to being used by ~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. - -- Key: C-c M-s (git-commit-save-message) :: - - Save the current buffer content to the commit message ring. - -- Key: M-p (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. - -- Key: M-n (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. - -By default the diff for the changes that are about to be committed are -automatically shown when invoking the commit. To prevent that, remove -~magit-commit-diff~ from ~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. - -- Key: C-c C-d (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. - -**** Using the Revision Stack - -- Key: C-c C-w (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 ~magit-revision-stack~ and inserts it into the current buffer - according to ~magit-pop-revision-stack-format~. Revisions can be put - on the stack using ~magit-copy-section-value~ and - ~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. - -- User Option: magit-pop-revision-stack-format :: - - This option controls how the command ~magit-pop-revision-stack~ - inserts a revision into the current buffer. - - The entries on the stack have the format ~(HASH TOPLEVEL)~ and this - option has the format ~(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 ~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). - -**** Commit Pseudo Headers - -Some projects use pseudo headers in commit messages. Magit colorizes -such headers and provides some commands to insert such headers. - -- User Option: git-commit-known-pseudo-headers :: - - A list of Git pseudo headers to be highlighted. - -- Key: C-c C-i (git-commit-insert-pseudo-header) :: - - Insert a commit message pseudo header. - -- Key: C-c C-a (git-commit-ack) :: - - Insert a header acknowledging that you have looked at the commit. - -- Key: C-c C-r (git-commit-review) :: - - Insert a header acknowledging that you have reviewed the commit. - -- Key: C-c C-s (git-commit-signoff) :: - - Insert a header to sign off the commit. - -- Key: C-c C-t (git-commit-test) :: - - Insert a header acknowledging that you have tested the commit. - -- Key: C-c C-o (git-commit-cc) :: - - Insert a header mentioning someone who might be interested. - -- Key: C-c C-p (git-commit-reported) :: - - Insert a header mentioning the person who reported the issue being - fixed by the commit. - -- Key: C-c M-i (git-commit-suggested) :: - - Insert a header mentioning the person who suggested the change. - -**** Commit Mode and Hooks - -~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. - -- User Option: git-commit-major-mode :: - - The value of this option is the major mode used to edit Git commit - messages. - -Because ~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 ~git-commit-setup~, which among other things runs -the hook ~git-commit-setup-hook~. - -- User Option: git-commit-setup-hook :: - - Hook run at the end of ~git-commit-setup~. - -#+texinfo: @noindent -The following functions are suitable for this hook: - -- Function: git-commit-save-message :: - - Save the current buffer content to the commit message ring. - -- Function: git-commit-setup-changelog-support :: - - After this function is called, ChangeLog entries are treated as - paragraphs. - -- Function: git-commit-turn-on-auto-fill :: - - Turn on ~auto-fill-mode~. - -- Function: git-commit-turn-on-flyspell :: - - Turn on Flyspell mode. Also prevent comments from being checked and - finally check current non-comment text. - -- Function: git-commit-propertize-diff :: - - Propertize the diff shown inside the commit message buffer. Git - inserts such diffs into the commit message template when the - ~--verbose~ argument is used. ~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. - -- Function: bug-reference-mode :: - - Hyperlink bug references in the buffer. - -- Function: with-editor-usage-message :: - - Show usage information in the echo area. - -- User Option: git-commit-post-finish-hook :: - - Hook run after the user finished writing a commit message. - - This hook is only run after pressing ~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 ~magit-rebase-continue~ this - hook is never run because doing so would lead to a race condition. - - This hook is only run if ~magit~ is available. - - Also see ~magit-post-commit-hook~. - -**** 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. - -- User Option: 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. - -- User Option: 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 ~git-commit-check-style-conventions~. - -- Function: 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. - -- User Option: 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; ~non-empty-second-line~ and - ~overlong-summary-line~. - -** Branching -*** 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 ~origin/master~. For the ~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 /eventually/ end up in a -remote branch such as ~origin/master~ or ~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 ~my-feature~ is usually pushed to ~my-fork/my-feature~ or if you -are a contributor ~origin/my-feature~. After the new feature has been -reviewed, the maintainer merges the feature into ~master~. And finally -~master~ (not ~my-feature~ itself) is pushed to ~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 ~branch..pushRemote~ and ~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, ~p~ is bound to a command which acts on the -push-remote, ~u~ is bound to a command which acts on the upstream, and ~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 ~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 -[[*Pushing]]). - -*** Branch Commands - -The transient prefix command ~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 -commands. - -- Key: b (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. - -- User Option: magit-branch-direct-configure :: - - This option controls whether the transient command ~magit-branch~ can - be used to directly change the values of Git variables. This defaults - to ~t~ (to avoid changing key bindings). When set to ~nil~, then no - variables are displayed by that transient command, and its suffix - command ~magit-branch-configure~ has to be used instead to view and - change branch related variables. - -- Key: b C (magit-branch-configure) :: -- Key: f C :: -- Key: F C :: -- Key: P C :: - - 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 ~magit-branch~ and on the ~magit-branch-direct-configure~ - option. If ~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. - -The variables are described in [[*Branch Git Variables]]. - -- Key: b b (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 ~HEAD~ becomes detached. Checkout fails if the working tree - or the staging area contain changes. - -- Key: b n (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 ~magit-branch-prefer-remote-upstream~. - -- Key: b c (magit-branch-and-checkout) :: - - This command creates a new branch like ~magit-branch-create~, but then - also checks it out. - - Also see option ~magit-branch-prefer-remote-upstream~. - -- Key: b l (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. - - - If the user selects an existing local branch, then that is checked - out. - - - 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. - - - If the user enters a new branch name, then it creates and checks - that out, after also reading the starting-point from the user. - - 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 ~magit-branch-adjust-remote-upstream-alist~. - -- Key: b s (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 - begun on the old branch (likely but not necessarily "master"). - - If the current branch is a member of the value of option - ~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 ~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 ~HEAD~ are moved to the new - branch. If FROM is not reachable from ~HEAD~ or is reachable from the - source branch's upstream, then an error is raised. - -- Key: b S (magit-branch-spinout) :: - - This command behaves like ~magit-branch-spinoff~, except that it does - not change the current branch. If there are any uncommitted changes, - then it behaves exactly like ~magit-branch-spinoff~. - -- Key: b x (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. - -- Key: b k (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 ~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. - -- Key: b m (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. - -- User Option: 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 ~t~, - and I recommend you leave it at that. - -- User Option: 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 ~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.: - - #+BEGIN_SRC text - feature --upstream--> origin/master - #+END_SRC - - instead of - - #+BEGIN_SRC text - feature --upstream--> master --upstream--> origin/master - #+END_SRC - - Which you prefer is a matter of personal preference. If you do - prefer the former, then you should add branches such as ~master~, - ~next~, and ~maint~ to the value of this options. - -- User Option: 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 ~((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 *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: - - #+BEGIN_SRC emacs-lisp - (("origin/master" . ("master" "next" "maint"))) - #+END_SRC - - Or if the names of all your ephemeral branches contain a slash, - at least in some repositories, then a good value could be: - - #+BEGIN_SRC emacs-lisp - (("origin/master" . "/")) - #+END_SRC - - Of course you can also fine-tune: - - #+BEGIN_SRC emacs-lisp - (("origin/maint" . "\\`hotfix/") - ("origin/master" . "\\`feature/")) - #+END_SRC - - UPSTREAM can be a local branch: - - #+BEGIN_SRC emacs-lisp - (("master" . ("master" "next" "maint"))) - #+END_SRC - -Because the main branch is no longer almost always named "master" -you should also account for other common names: - - #+BEGIN_SRC emacs-lisp - (("main" . ("main" "master" "next" "maint")) - ("master" . ("main" "master" "next" "maint"))) - #+END_SRC - -- Command: magit-branch-orphan :: - - This command creates and checks out a new orphan branch with - contents from a given revision. - -- Command: magit-branch-or-checkout :: - - This command is a hybrid between ~magit-checkout~ and - ~magit-branch-and-checkout~ and is intended as a replacement for the - former in ~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 ~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 ~magit-branch-and-checkout~ does. - - To use this command instead of ~magit-checkout~ add this to your init - file: - - #+BEGIN_SRC emacs-lisp - (transient-replace-suffix 'magit-branch 'magit-checkout - '("b" "dwim" magit-branch-or-checkout)) - #+END_SRC - -*** Branch Git Variables - -These variables can be set from the transient prefix command -~magit-branch-configure~. By default they can also be set from -~magit-branch~. See [[*Branch Commands]]. - -- Variable: branch.NAME.merge :: - - Together with ~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 /branch/. - -- Variable: branch.NAME.remote :: - - Together with ~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 /remote/. - -- Variable: branch.NAME.rebase :: - - This variable controls whether pulling into the branch named NAME is - done by rebasing or by merging the fetched branch. - - - When ~true~ then pulling is done by rebasing. - - When ~false~ then pulling is done by merging. - - When undefined then the value of ~pull.rebase~ is used. The default - of that variable is ~false~. - -- Variable: 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 /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 ~remote.pushDefault~ is defined, - then the value of the latter is used. By default ~remote.pushDefault~ - is undefined. - -- Variable: 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. - -The following variables specify defaults which are used if the above -branch-specific variables are not set. - -- Variable: pull.rebase :: - - This variable specifies whether pulling is done by rebasing or by - merging. It can be overwritten using ~branch.NAME.rebase~. - - - When ~true~ then pulling is done by rebasing. - - When ~false~ (the default) then pulling is done by merging. - - 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 ~true~, and ~branch.master.rebase~ to - ~false~. - -- Variable: remote.pushDefault :: - - This variable specifies what remote the local branches are usually - pushed to. This can be overwritten per branch using - ~branch.NAME.pushRemote~. - -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. - -- Variable: branch.autoSetupMerge :: - - This variable specifies under what circumstances creating a branch - NAME should result in the variables ~branch.NAME.merge~ and - ~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. - - - When ~always~ then the variables are set regardless of whether the - starting point is a local or a remote branch. - - When ~true~ (the default) then the variables are set when the starting - point is a remote branch, but not when it is a local branch. - - When ~false~ then the variables are never set. - -- Variable: branch.autoSetupRebase :: - - This variable specifies whether creating a branch NAME should result - in the variable ~branch.NAME.rebase~ being set to ~true~. - - - When ~always~ then the variable is set regardless of whether the - starting point is a local or a remote branch. - - When ~local~ then the variable are set when the starting point is a - local branch, but not when it is a remote branch. - - When ~remote~ then the variable are set when the starting point is a - remote branch, but not when it is a local branch. - - When ~never~ (the default) then the variable is never set. - -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.: - -#+begin_src shell-script - git config --global remote.autoSetupMerge always -#+end_src - -For more information about these variables you should also see -man:git-config Also see [[man:git-branch]], [[man:git-checkout]] and [[*Pushing]]. - -- User Option: 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 ~magit-read-upstream-branch~ or - ~magit-read-starting-point~, which includes all commands that change - the upstream and many which create new branches. - -*** Auxiliary Branch Commands - -These commands are not available from the transient ~magit-branch~ by -default. - -- 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. - -- Command: magit-branch-unshelve :: - - This command unshelves a branch that was previously shelved using - ~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. - -** Merging - -Also see [[man:git-merge]] For information on how to resolve -merge conflicts see the next section. - -- Key: m (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. - -When no merge is in progress, then the transient features the -following suffix commands. - -- Key: m m (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. - -- Key: m e (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 ~C-c C-c~. - -- Key: m n (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. - -- Key: m a (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 ~magit-branch-pull-request~ was used to create the merged - branch, then the respective remote branch is also removed. - -- Key: m d (magit-merge-dissolve) :: - - 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 ~magit-branch-pull-request~ was used to create the merged - branch, then the respective remote branch is also removed. - -- Key: m s (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. - -- Key: m p (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. - -When a merge is in progress, then the transient instead features the -following suffix commands. - -- Key: m m (magit-merge) :: - - After the user resolved conflicts, this command proceeds with the - merge. If some conflicts weren't resolved, then this command fails. - -- Key: m a (magit-merge-abort) :: - - This command aborts the current merge operation. - -** 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 ~<~, ~|~, ~=~ and ~>~, and are followed by information about the source -of the respective versions, e.g.: - -#+begin_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: - -#+begin_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: - -#+begin_src shell-script - git config --global merge.conflictStyle diff3 -#+end_src - -The above conflict might then have looked like this: - -#+begin_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 -(info:ediff), and Emerge (info:emacs#Emerge). 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 ~RET~ while point is on such a file section shows a buffer -visiting that file, turns on ~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 ~C-c ^ C-h~ and press ~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 ~C-c ^ m~ (~smerge-keep-mine~) to keep the ~HEAD~ -version or ~C-c ^ o~ (~smerge-keep-other~) to keep the version that -follows "|||||||". Then use ~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 ~k~ (~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 ~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 ~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 [[*Ediffing]]. Explaining how to use -Ediff is beyond the scope of this manual, instead see info: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. - -** Rebasing - -Also see [[man:git-rebase]] For information on how to resolve -conflicts that occur during rebases see the preceding section. - -- Key: r (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. - -When no rebase is in progress, then the transient features the -following suffix commands. - -Using one of these commands /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 [[*Information About In-Progress Rebase]]. - -For information about the upstream and the push-remote, see [[*The Two -Remotes]]. - -- Key: r p (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. - -- Key: r u (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. - -- Key: r e (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. - -- Key: r s (magit-rebase-subset) :: - - This command starts a non-interactive rebase sequence to transfer - commits from START to ~HEAD~ onto NEWBASE. START has to be selected - from a list of recent commits. - -By default Magit uses the ~--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 ~--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 ~master~, then you could use ~r-iu~. But we recommend -that you instead do that in two steps. First use ~ri~ to cleanup the -feature branch, and then in a second step ~ru~ to rebase it onto ~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 ~--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. - -- Key: r i (magit-rebase-interactive) :: - - This command starts an interactive rebase sequence. - -- Key: r f (magit-rebase-autosquash) :: - - This command combines squash and fixup commits with their intended - targets. - - By default only commits that are not reachable from the upstream - branch are potentially squashed into. If no upstream is configured - or with a prefix argument, the user is prompted for the first commit - to potentially squash into. - -- Key: r m (magit-rebase-edit-commit) :: - - This command starts an interactive rebase sequence that lets the - user edit a single older commit. - -- Key: r w (magit-rebase-reword-commit) :: - - This command starts an interactive rebase sequence that lets the - user reword a single older commit. - -- Key: r k (magit-rebase-remove-commit) :: - - This command removes a single older commit using rebase. - -When a rebase is in progress, then the transient instead features -the following suffix commands. - -- Key: r r (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. - -- Key: r s (magit-rebase-skip) :: - - This command skips the current commit and restarts the current - rebase operation. - -- Key: r e (magit-rebase-edit) :: - - This command lets the user edit the todo list of the current rebase - operation. - -- Key: r a (magit-rebase-abort) :: - - This command aborts the current rebase operation, restoring the - original branch. - -*** Editing Rebase Sequences - -- Key: C-c C-c (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. - -- Key: C-c C-k (with-editor-cancel) :: - - Cancel the current editing session by returning with exit code 1. - Git then forgoes starting the rebase sequence. - -- Key: RET (git-rebase-show-commit) :: - - Show the commit on the current line in another buffer and select - that buffer. - -- Key: SPC (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. - -- Key: DEL (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. - -- Key: p (git-rebase-backward-line) :: - - Move to previous line. - -- Key: n (forward-line) :: - - Move to next line. - -- Key: M-p (git-rebase-move-line-up) :: - - Move the current commit (or command) up. - -- Key: M-n (git-rebase-move-line-down) :: - - Move the current commit (or command) down. - -- Key: r (git-rebase-reword) :: - - Edit message of commit on current line. - -- Key: e (git-rebase-edit) :: - - Stop at the commit on the current line. - -- Key: s (git-rebase-squash) :: - - This command folds the commit on the current line into the previous - commit, giving the user a change to manually merge the two messages. - -- Key: S (git-rebase-squish) :: - - This command folds the commit on the current line into the previous - commit, discarding the message of the previous commit but giving the - user a change to edit the final message, based on the message of the - current commit. - - This action's indicator, shown in the list of commits, is ~fixup -c~ - (with a lower-case c). - -- Key: f (git-rebase-fixup) :: - - This command folds the commit on the current line into the previous - commit, using only the message of the previous commit as-is and - discarding the message of the current commit. - -- Key: F (git-rebase-alter) :: - - This command folds the commit on the current into the previous - commit, discarding the message of the previous commit and instead - using the message of the current commit as-is. - - This is like ~git-rebase-alter~, except that it uses the other - message. This is also like ~git-rebase-squish~, except that it lets - the user edit the message. - - This action's indicator, shown in the list of commits, is ~fixup -C~ - (with a upper-case C). - -- Key: k (git-rebase-kill-line) :: - - Comment the current action line, or if it is already commented, then - uncomment it. - -- Key: c (git-rebase-pick) :: - - Use commit on current line. - -- Key: x (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. - -- Key: b (git-rebase-break) :: - - Insert a break action before the current line, instructing Git to - return control to the user. - -- Key: y (git-rebase-insert) :: - - Read an arbitrary commit and insert it below current line. - -- Key: C-x u (git-rebase-undo) :: - - Undo some previous changes. Like ~undo~ but works in read-only - buffers. - -- User Option: git-rebase-auto-advance :: - - Whether to move to next line after changing a line. - -- User Option: git-rebase-show-instructions :: - - Whether to show usage instructions inside the rebase buffer. - -- User Option: git-rebase-confirm-cancel :: - - Whether confirmation is required to cancel. - -When a rebase is performed with the ~--rebase-merges~ option, the -sequence will include a few other types of actions and the following -commands become relevant. - -- Key: l (git-rebase-label) :: - - This commands inserts a label action or edits the one at point. - -- Key: t (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. - -- Key: MM (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 ~-c~ or ~-C~ is not - supported; an editor will always be invoked for the merge. - -- Key: Mt (git-rebase-merge-toggle-editmsg) :: - - This command toggles between the ~-C~ and ~-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. - -*** 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 ~HEAD~. -The commits above it have not been applied yet, while the ~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: - -- Commits that use the same foreground color as the ~default~ face have - not been applied yet. - -- 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). - -- Gray commits have already been applied. - -- The blue commit is the ~HEAD~ commit. - -- The green commit is the commit the rebase sequence stopped at. If - this is the same commit as ~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 *and* a blue - commit at the same time, if you create one or more new commits after - rebase stops at a commit. - -- Red commits have been dropped. They are shown for reference only, - e.g., to make it easier to diff. - -Of course these colors are subject to the color-theme in use. - -The following words are used: - -- Commits prefixed with ~pick~, ~reword~, ~edit~, ~squash~, and ~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 [[*Editing Rebase - Sequences]]. When the ~--rebase-merges~ option was specified, - ~reset~, ~label~, and ~merge~ lines may also be present. - -- Commits prefixed with ~done~ and ~onto~ have already been applied. - It is possible for such a commit to be the ~HEAD~, in which case it - is blue. Otherwise it is grey. - - - The commit prefixed with ~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. - - - Commits prefixed with ~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. - -- 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 [fn:patch-id] 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: - - - When a commit is prefixed with ~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 ~HEAD~, and it also isn't one of the commits that - will be applied when resuming the session. - - - When a commit is prefixed with ~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 ~HEAD~). So it is shown in yellow, like the other - commits that still have to be applied. - - - When a commit is prefixed with ~stop~ or a /blue/ or /green/ ~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. - - - When a commit is prefixed with ~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. - - - When a commit is prefixed with a /blue/ or /green/ ~same~, then that - indicates that while its tree or hash changed, its patch-id did - not. If it is blue, then it is the ~HEAD~ commit (as always for - blue). When it is green, then it no longer is ~HEAD~ because - other commit have been created since (but before continuing the - rebase). - - - When a commit is prefixed with ~goal~, a /yellow/ ~same,~ or ~work~, then - that indicates that rebase applied that commit but that you then - reset ~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. - - - When a commit is prefixed with ~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. - - - When a commit is prefixed with a yellow ~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. - - - When a commit is prefixed with ~work~, then that indicates that - you reset ~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. - - - When a commit is prefixed with ~poof~ or ~gone~, then that indicates - that rebase applied that commit but that you then reset ~HEAD~ to an - earlier commit (likely to split it up into multiple commits), and - that there are no uncommitted changes. - - - When a commit is prefixed with ~poof~, then that indicates that it - is no longer reachable from ~HEAD~, but that it has been replaced - with one or more commits, which together have the exact same - effect. - - - When a commit is prefixed with ~gone~, then that indicates that it - is no longer reachable from ~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. - -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. - -[fn:patch-id] The patch-id is a hash of the /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?". - -** Cherry Picking - -Also see [[man:git-cherry-pick]] - -- Key: A (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. - -When no cherry-pick or revert is in progress, then the transient -features the following suffix commands. - -- Key: A A (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. - -- Key: A a (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 ~a~ at the top-level. - -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 ~git-update-ref~ or if necessary ~git-rebase~. Both applying -commits as well as removing them using ~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. - -- Key: A h (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. - -- Key: A d (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. ~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. - -- Key: A n (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. - -- Key: A s (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. - -When a cherry-pick or revert is in progress, then the transient -instead features the following suffix commands. - -- Key: A A (magit-sequence-continue) :: - - Resume the current cherry-pick or revert sequence. - -- Key: A s (magit-sequence-skip) :: - - Skip the stopped at commit during a cherry-pick or revert sequence. - -- Key: A a (magit-sequence-abort) :: - - Abort the current cherry-pick or revert sequence. This discards all - changes made since the sequence started. - -*** Reverting - -- Key: V (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. - -When no cherry-pick or revert is in progress, then the transient -features the following suffix commands. - -- Key: V V (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. - -- Key: V v (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. - -When a cherry-pick or revert is in progress, then the transient -instead features the following suffix commands. - -- Key: V V (magit-sequence-continue) :: - - Resume the current cherry-pick or revert sequence. - -- Key: V s (magit-sequence-skip) :: - - Skip the stopped at commit during a cherry-pick or revert sequence. - -- Key: V a (magit-sequence-abort) :: - - Abort the current cherry-pick or revert sequence. This discards all - changes made since the sequence started. - -** Resetting - -Also see [[man:git-reset]] - -- Key: x (magit-reset-quickly) :: - - Reset the ~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. - -- Key: X m (magit-reset-mixed) :: - - Reset the ~HEAD~ and index to some commit read from the user and - defaulting to the commit at point. The working tree is kept as-is. - -- Key: X s (magit-reset-soft) :: - - Reset the ~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. - -- Key: X h (magit-reset-hard) :: - - Reset the ~HEAD~, index, and working tree to some commit read from the - user and defaulting to the commit at point. - -- Key: X k (magit-reset-keep) :: - - Reset the ~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. - -- Key: X i (magit-reset-index) :: - - Reset the index to some commit read from the user and defaulting to - the commit at point. Keep the ~HEAD~ and working tree as-is, so if - the commit refers to the ~HEAD~, then this effectively unstages all - changes. - -- Key: X w (magit-reset-worktree) :: - - Reset the working tree to some commit read from the user and - defaulting to the commit at point. Keep the ~HEAD~ and index as-is. - -- Key: X f (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. - -** Stashing - -Also see [[man:git-stash]] - -- Key: z (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. - -- Key: z z (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 ~--include-untracked~ while two prefix arguments are - equivalent to ~--all~. - -- Key: z i (magit-stash-index) :: - - Create a stash of the index only. Unstaged and untracked changes - are not stashed. - -- Key: z w (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 ~--include-untracked~ while two prefix - arguments are equivalent to ~--all~. - -- Key: z x (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 ~--include-untracked~ while two - prefix arguments are equivalent to ~--all~. - -- Key: z Z (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 ~--include-untracked~ while two prefix arguments are - equivalent to ~--all~. - -- Key: z I (magit-snapshot-index) :: - - Create a snapshot of the index only. Unstaged and untracked changes - are not stashed. - -- Key: z W (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 ~--include-untracked~ while two - prefix arguments are equivalent to ~--all~-. - -- Key: z a (magit-stash-apply) :: - - Apply a stash to the working tree. - - When using a Git release before v2.38.0, simply run ~git stash apply~ - or with a prefix argument ~git stash apply --index~. - - When using Git v2.38.0 or later, behave more intelligently: - - First try ~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. - - If ~git stash~ fails, then potentially fall back to using ~git apply~. - If the stash does not touch any unstaged files, then pass ~--3way~ to - that command. Otherwise ask the user whether to use that argument - or ~--reject~. Customize ~magit-no-confirm~ if you want to fall back - to using ~--3way~, without being prompted. - -- Key: z p (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. - - When using a Git release before v2.38.0, simply run ~git stash pop~ - or with a prefix argument ~git stash pop --index~. - - When using Git v2.38.0 or later, behave more intelligently: - - First try ~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. - - If ~git stash~ fails, then potentially fall back to using ~git apply~. - If the stash does not touch any unstaged files, then pass ~--3way~ to - that command. Otherwise ask the user whether to use that argument - or ~--reject~. Customize ~magit-no-confirm~ if you want to fall back - to using ~--3way~, without being prompted. - -- Key: z k (magit-stash-drop) :: - - Remove a stash from the stash list. When the region is active, offer - to drop all contained stashes. - -- Key: z v (magit-stash-show) :: - - Show all diffs of a stash in a buffer. - -- Key: z b (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. - -- Key: z B (magit-stash-branch-here) :: - - Create and checkout a new branch from an existing stash. Use the - current branch or ~HEAD~ as the starting-point of the new branch. - Then apply the stash, dropping it if it applies cleanly. - -- Key: z f (magit-stash-format-patch) :: - - Create a patch from STASH. - -- Key: k (magit-stash-clear) :: - - Remove all stashes saved in REF's reflog by deleting REF. - -- Key: z l (magit-stash-list) :: - - List all stashes in a buffer. - -- User Option: 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 ~(INIT STYLE WIDTH AUTHOR AUTHOR-WIDTH)~. - - - If INIT is non-~nil~, then the margin is shown initially. - - STYLE controls how to format the author or committer date. It can - be one of ~age~ (to show the age of the commit), ~age-abbreviated~ (to - abbreviate the time unit to a character), or a string (suitable - for ~format-time-string~) to show the actual date. Option - ~magit-log-margin-show-committer-date~ controls which date is being - displayed. - - WIDTH controls the width of the margin. This exists for forward - compatibility and currently the value should not be changed. - - AUTHOR controls whether the name of the author is also shown by - default. - - 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. - -* Transferring -** Remotes -*** Remote Commands - -The transient prefix command ~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 [[man:git-remote]] - -- Key: M (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. - -- User Option: magit-remote-direct-configure :: - - This option controls whether remote-related Git variables are - accessible directly from the transient ~magit-remote~. - - If ~t~ (the default) and a local branch is checked out, then - ~magit-remote~ features the variables for the upstream remote of that - branch, or if ~HEAD~ is detached, for ~origin~, provided that exists. - - If ~nil~, then ~magit-remote-configure~ has to be used to do so. - -- Key: M C (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 ~magit-remote~ and on the ~magit-remote-direct-configure~ - option. If ~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. - -The variables are described in [[*Remote Git Variables]]. - -- Key: M a (magit-remote-add) :: - - This command add a remote and fetches it. The remote name and url - are read in the minibuffer. - -- Key: M r (magit-remote-rename) :: - - This command renames a remote. Both the old and the new names are - read in the minibuffer. - -- Key: M u (magit-remote-set-url) :: - - This command changes the url of a remote. Both the remote and the - new url are read in the minibuffer. - -- Key: M k (magit-remote-remove) :: - - This command deletes a remote, read in the minibuffer. - -- Key: M p (magit-remote-prune) :: - - This command removes stale remote-tracking branches for a remote - read in the minibuffer. - -- Key: M P (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. - -- User Option: magit-remote-add-set-remote.pushDefault :: - - This option controls whether the user is asked whether they want to - set ~remote.pushDefault~ after adding a remote. - - If ~ask~, then users is always ask. If ~ask-if-unset~, then the user is - only if the variable isn't set already. If ~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. - -*** Remote Git Variables - -These variables can be set from the transient prefix command -~magit-remote-configure~. By default they can also be set from -~magit-remote~. See [[*Remote Commands]]. - -- Variable: remote.NAME.url :: - - This variable specifies the url of the remote named NAME. It can - have multiple values. - -- Variable: remote.NAME.fetch :: - - The refspec used when fetching from the remote named NAME. It can - have multiple values. - -- Variable: remote.NAME.pushurl :: - - This variable specifies the url used for pushing to the remote - named NAME. If it is not specified, then ~remote.NAME.url~ is used - instead. It can have multiple values. - -- Variable: remote.NAME.push :: - - The refspec used when pushing to the remote named NAME. It can - have multiple values. - -- Variable: remote.NAME.tagOpts :: - - This variable specifies what tags are fetched by default. If the - value is ~--no-tags~ then no tags are fetched. If the value is - ~--tags~, then all tags are fetched. If this variable has no value, - then only tags are fetched that are reachable from fetched branches. - -** Fetching - -Also see [[man:git-fetch]] For information about the upstream and the -push-remote, see [[*The Two Remotes]]. - -- Key: f (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. - -- Key: f p (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. - -- Key: f u (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 ~magit-fetch~ transient prefix and invoking it directly - results in an error. - -- Key: f e (magit-fetch-other) :: - - This command fetch from a repository read from the minibuffer. - -- Key: f o (magit-fetch-branch) :: - - This command fetches a branch from a remote, both of which are read - from the minibuffer. - -- Key: f r (magit-fetch-refspec) :: - - This command fetches from a remote using an explicit refspec, both - of which are read from the minibuffer. - -- Key: f a (magit-fetch-all) :: - - This command fetches from all remotes. - -- Key: f m (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. - -- User Option: magit-pull-or-fetch :: - - By default fetch and pull commands are available from separate - transient prefix command. Setting this to ~t~ adds some (but not all) - of the above suffix commands to the ~magit-pull~ transient. - - If you do that, then you might also want to change the key binding - for these prefix commands, e.g.: - - #+BEGIN_SRC emacs-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_SRC - -** Pulling - -Also see [[man:git-pull]] For information about the upstream and the -push-remote, see [[*The Two Remotes]]. - -- Key: F (magit-pull) :: - - This transient prefix command binds the following suffix commands - and displays them in a temporary buffer until a suffix is invoked. - -- Key: F p (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. - -- Key: F u (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. - -- Key: F e (magit-pull-branch) :: - - This command pulls from a branch read in the minibuffer. - -** Pushing - -Also see [[man:git-push]] For information about the upstream and the -push-remote, see [[*The Two Remotes]]. - -- Key: P (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. - -- Key: P p (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. - -- Key: P u (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. - -- Key: P e (magit-push-current) :: - - This command pushes the current branch to a branch read in the - minibuffer. - -- Key: P o (magit-push-other) :: - - This command pushes an arbitrary branch or commit somewhere. Both - the source and the target are read in the minibuffer. - -- Key: P r (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. - -- Key: P m (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. - -- Key: P t (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. - -- Key: P T (magit-push-tag) :: - - This command pushes a tag to another repository. - -One of the infix arguments, ~--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 -~--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 ~push.useForceIfIncludes~ to ~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. - -- Command: magit-push-implicitly args :: - - This command pushes somewhere without using an explicit refspec. - - This command simply runs ~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: ~push.default~, - ~remote.pushDefault~, ~branch..pushRemote~, - ~branch..remote~, ~branch..merge~, and - ~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: - - #+BEGIN_SRC emacs-lisp - (transient-insert-suffix 'magit-push \"p\" - '(\"i\" magit-push-implicitly))" - #+END_SRC - -- 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 ~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: ~push.default~, - ~remote.pushDefault~, ~branch..pushRemote~, - ~branch..remote~, ~branch..merge~, and - ~remote..push~. - -** Plain Patches - -- Key: W (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. - -- Key: W c (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. - -- Key: w a (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. - -- Key: W s (magit-patch-save) :: - - This command creates a patch from the current diff. - - Inside ~magit-diff-mode~ or ~magit-revision-mode~ buffers, ~C-x C-w~ is - also bound to this command. - -It is also possible to save a plain patch file by using ~C-x C-w~ inside -a ~magit-diff-mode~ or ~magit-revision-mode~ buffer. - -** Maildir Patches - -Also see [[man:git-am]] and [[man:git-apply]] - -- Key: w (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. - -- Key: w w (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. - -- Key: w m (magit-am-apply-maildir) :: - - This command applies patches from a maildir. - -- Key: w a (magit-patch-apply) :: - - This command applies a plain patch. For a longer description see - [[*Plain Patches]]. This command is only available from the ~magit-am~ - transient for historic reasons. - -When an "am" operation is in progress, then the transient instead -features the following suffix commands. - -- Key: w w (magit-am-continue) :: - - This command resumes the current patch applying sequence. - -- Key: w s (magit-am-skip) :: - - This command skips the stopped at patch during a patch applying - sequence. - -- Key: w a (magit-am-abort) :: - - This command aborts the current patch applying sequence. This - discards all changes made since the sequence started. - -* Miscellaneous -** Tagging - -Also see [[man:git-tag]] - -- Key: t (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. - -- Key: t t (magit-tag-create) :: - - This command creates a new tag with the given NAME at REV. With a - prefix argument it creates an annotated tag. - -- Key: t r (magit-tag-release) :: - - This commands creates a release tag. It assumes that release tags - match ~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., - ~v1.2.3-custom.1~), you can set the ~magit-release-tag-regexp~ and - ~magit-tag-version-regexp-alist~ variables. - - If ~--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". - -- Key: t k (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. - -- Key: t p (magit-tag-prune) :: - - This command offers to delete tags missing locally from REMOTE, and - vice versa. - -** Notes - -Also see [[man:git-notes]] - -- Key: T (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. - -- Key: T T (magit-notes-edit) :: - - Edit the note attached to a commit, defaulting to the commit at - point. - - By default use the value of Git variable ~core.notesRef~ or - "refs/notes/commits" if that is undefined. - -- Key: T r (magit-notes-remove) :: - - Remove the note attached to a commit, defaulting to the commit at - point. - - By default use the value of Git variable ~core.notesRef~ or - "refs/notes/commits" if that is undefined. - -- Key: T p (magit-notes-prune) :: - - Remove notes about unreachable commits. - -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_MERGE_WORKTREE". - -- Key: T m (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 - ~core.notesRef~ or "refs/notes/commits" if that is undefined. - -When a notes merge is in progress then the transient features the -following suffix commands, instead of those listed above. - -- Key: T c (magit-notes-merge-commit) :: - - Commit the current notes ref merge, after manually resolving - conflicts. - -- Key: T a (magit-notes-merge-abort) :: - - Abort the current notes ref merge. - -The following variables control what notes reference ~magit-notes-*~, -~git notes~ and ~git show~ act on and display. Both the local and global -values are displayed and can be modified. - -- Variable: core.notesRef :: - - This variable specifies the notes ref that is displayed by default - and which commands act on by default. - -- Variable: notes.displayRef :: - - This variable specifies additional notes ref to be displayed in - addition to the ref specified by ~core.notesRef~. It can have - multiple values and may end with ~*~ to display all refs in the - ~refs/notes/~ namespace (or ~**~ if some names contain slashes). - -** Submodules - -Also see [[man:git-submodule]] - -*** Listing Submodules - -The command ~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 ~magit-insert-modules~ to the hook -~magit-status-sections-hook~ as described in [[*Status Module Sections]]. - -- 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 ~RET~ on the section titled "Modules". - -- User Option: magit-submodule-list-columns :: - - This option controls what columns are displayed by the command - ~magit-list-submodules~ and how they are displayed. - - Each element has the form ~(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 ~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 ~:right-align~, ~:pad-right~ and - ~:sort~. - - The ~:sort~ function has a weird interface described in the - docstring of ~tabulated-list--get-sort~. Alternatively ~<~ and - ~magit-repolist-version<~ can be used as those functions are - automatically replaced with functions that satisfy the interface. - Set ~:sort~ to ~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 ~:pad-right~ to 9. ~+~ is substituted for numbers higher than 9. - -*** Submodule Transient - -- Key: o (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. - -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. - -- Key: o a (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. - -- Key: o r (magit-submodule-register) :: - - This command registers the selected modules by copying their urls - from ".gitmodules" to "$GIT_DIR/config". These values can then be - edited before running ~magit-submodule-populate~. If you don't need - to edit any urls, then use the latter directly. - -- Key: o p (magit-submodule-populate) :: - - This command creates the working directory or directories of the - selected modules, checking out the recorded commits. - -- Key: o u (magit-submodule-update) :: - - This command updates the selected modules checking out the recorded - commits. - -- Key: o s (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. - -- Key: o d (magit-submodule-unpopulate) :: - - This command removes the working directory of the selected modules. - -- Key: o l (magit-list-submodules) :: - - This command displays a list of the current repository's modules. - -- Key: o f (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 ~git fetch~ does not - support not doing that. - -** Subtree - -Also see [[man:git-subtree]] - -- Key: O (magit-subtree) :: - - This transient prefix command binds the two sub-transients; one for - importing a subtree and one for exporting a subtree. - -- Key: O i (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 ~--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. - -- Key: O i a (magit-subtree-add) :: - - This command adds COMMIT from REPOSITORY as a new subtree at PREFIX. - -- Key: O i c (magit-subtree-add-commit) :: - - This command add COMMIT as a new subtree at PREFIX. - -- Key: O i m (magit-subtree-merge) :: - - This command merges COMMIT into the PREFIX subtree. - -- Key: O i f (magit-subtree-pull) :: - - This command pulls COMMIT from REPOSITORY into the PREFIX subtree. - -- Key: O e (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 ~--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. - -- Key: O e p (magit-subtree-push) :: - - This command extract the history of the subtree PREFIX and pushes it - to REF on REPOSITORY. - -- Key: O e s (magit-subtree-split) :: - - This command extracts the history of the subtree PREFIX. - -** Worktree - -Also see [[man:git-worktree]] - -- Key: Z (magit-worktree) :: - - This transient prefix command binds the following suffix commands - and displays them in a temporary buffer until a suffix is invoked. - -- Key: Z b (magit-worktree-checkout) :: - - Checkout BRANCH in a new worktree at PATH. - -- Key: Z c (magit-worktree-branch) :: - - Create a new BRANCH and check it out in a new worktree at PATH. - -- Key: Z m (magit-worktree-move) :: - - Move an existing worktree to a new PATH. - -- Key: Z k (magit-worktree-delete) :: - - Delete a worktree, defaulting to the worktree at point. - The primary worktree cannot be deleted. - -- Key: Z g (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. - -If you want the status buffer to list worktrees, add the function -~magit-insert-worktrees~ to ~magit-status-sections-hook~ as described -in [[*Status Sections]]. If there is only one worktree, this function -inserts nothing. - -** Sparse checkouts - -Sparse checkouts provide a way to restrict the working tree to a -subset of directories. See [[man:git-sparse-checkout]] - -*Warning*: Git introduced the ~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. - -- Key: > (magit-sparse-checkout) :: - - This transient prefix command binds the following suffix commands - and displays them in a temporary buffer until a suffix is invoked. - -- Key: > e (magit-sparse-checkout-enable) :: - - This command initializes a sparse checkout that includes only the - files in the top-level directory. - - Note that ~magit-sparse-checkout-set~ and - ~magit-sparse-checkout-add~ automatically initialize a sparse - checkout if necessary. However, you may want to call - ~magit-sparse-checkout-enable~ explicitly to re-initialize a sparse - checkout after calling ~magit-sparse-checkout-disable~, to pass - additional arguments to ~git sparse-checkout init~, or to execute - the initialization asynchronously. - -- Key: > s (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. - -- Key: > a (magit-sparse-checkout-add) :: - - This command is like ~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. - -- Key: > r (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. - -- Key: > d (magit-sparse-checkout-disable) :: - - This command restores the full checkout. To return to the previous - sparse checkout, call ~magit-sparse-checkout-enable~. - -A sparse checkout can also be initiated when cloning a repository by -using the ~magit-clone-sparse~ command in the ~magit-clone~ transient -(see [[*Cloning Repository]]). - -If you want the status buffer to indicate when a sparse checkout is -enabled, add the function ~magit-sparse-checkout-insert-header~ to -~magit-status-headers-hook~. - -** Bundle - -Also see [[man:git-bundle]] - -- Command: magit-bundle :: - - This transient prefix command binds several suffix commands for - running ~git bundle~ subcommands and displays them in a temporary - buffer until a suffix is invoked. - -** Common Commands - -- Command: magit-switch-to-repository-buffer :: -+ Command: magit-switch-to-repository-buffer-other-window :: -+ Command: magit-switch-to-repository-buffer-other-frame :: -+ 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 ~magit-display-buffer~ to do so and thus - respects ~magit-display-buffer-function~. - -These are some of the commands that can be used in all buffers whose -major-modes derive from ~magit-mode~. There are other common commands -beside the ones below, but these didn't fit well anywhere else. - -- Key: C-w (magit-copy-section-value) :: - - This command saves the value of the current section to the - ~kill-ring~, and, provided that the current section is a commit, - branch, or tag section, it also pushes the (referenced) revision to - the ~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 ~kill-ring~ - instead of the reference name. - - When the region is active, this command saves that to the - ~kill-ring~, like ~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. - -- Key: M-w (magit-copy-buffer-revision) :: - - This command saves the revision being displayed in the current buffer - to the ~kill-ring~ and also pushes it to the ~magit-revision-stack~. It - is mainly intended for use in ~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. - -Outside of Magit ~M-w~ and ~C-w~ are usually bound to ~kill-ring-save~ and -~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 ~kill-ring-save~ instead of as described above. - -** Wip Modes - -Git keeps *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 *not* keep track of *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 *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: ~refs/wip/index/~ and -~refs/wip/wtree/~, where ~~ is the full ref of the -current branch, e.g., ~refs/heads/master~. When the ~HEAD~ is detached -then ~HEAD~ is used in place of ~~. - -Checking out another branch (or detaching ~HEAD~) causes the use of -different wip refs for subsequent changes. - -- User Option: 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. - -To view the log for a branch and its wip refs use the commands -~magit-wip-log~ and ~magit-wip-log-current~. You should use ~--graph~ when -using these commands. - -- 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 ~magit-wip-merge-branch~ is ~nil~. - -- 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 ~magit-wip-merge-branch~ is ~nil~. - -- Key: X w (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 ~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). - -Note that even if you enable ~magit-wip-mode~ this won't give you -perfect protection. The most likely scenario for losing changes -despite the use of ~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. - -- Key: M-x 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. - -- User Option: magit-wip-namespace :: - - The namespace used for work-in-progress refs. It has to end with - a slash. The wip refs are named ~index/~ and - ~wtree/~. When snapshots are created while - the ~HEAD~ is detached then ~HEAD~ is used in place of ~~. - -- User Option: magit-wip-mode-lighter :: - - Mode-line lighter for ~magit-wip--mode~. - -*** Wip Graph - -- User Option: 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. - - If ~immediately~, then use ~git-commit-post-finish-hook~ to - create the merge commit. This is discouraged because it can - lead to a race condition, e.g., during rebases. - -When ~magit-wip-merge-branch~ is ~t~, then the history looks like this: - -#+begin_example - ,*--*--*--*--*--* refs/wip/index/refs/heads/master - / / / -A-----B-----C refs/heads/master -#+end_example - -When ~magit-wip-merge-branch~ is ~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 (~xxO~ commits -below are such boundary commits). - -Starting with - -#+begin_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 - -#+begin_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. - -** 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 [[*Global Bindings]] and [[info:elisp#Key Binding Conventions]]. - -To use the recommended bindings, add this to your init file and -restart Emacs. - -#+begin_src emacs-lisp - (setq magit-define-global-key-bindings 'recommended) -#+end_src - -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. - -#+begin_src emacs-lisp - (setq magit-define-global-key-bindings nil) -#+end_src - -- Key: C-c f (magit-file-dispatch) :: -- Key: C-c f s (magit-stage-file) :: -- Key: C-c f s (magit-stage-buffer-file) :: -- Key: C-c f u (magit-unstage-file) :: -- Key: C-c f u (magit-unstage-buffer-file) :: -- Key: C-c f , x (magit-file-untrack) :: -- Key: C-c f , r (magit-file-rename) :: -- Key: C-c f , k (magit-file-delete) :: -- Key: C-c f , c (magit-file-checkout) :: -- Key: C-c f D (magit-diff) :: -- Key: C-c f d (magit-diff-buffer-file) :: -- Key: C-c f L (magit-log) :: -- Key: C-c f l (magit-log-buffer-file) :: -- Key: C-c f t (magit-log-trace-definition) :: -- Key: C-c f M (magit-log-merged) :: -- Key: C-c f B (magit-blame) :: -- Key: C-c f b (magit-blame-additions) :: -- Key: C-c f r (magit-blame-removal) :: -- Key: C-c f f (magit-blame-reverse) :: -- Key: C-c f m (magit-blame-echo) :: -- Key: C-c f q (magit-blame-quit) :: -- Key: C-c f p (magit-blob-previous) :: -- Key: C-c f n (magit-blob-next) :: -- Key: C-c f v (magit-find-file) :: -- Key: C-c f V (magit-blob-visit-file) :: -- Key: C-c f g (magit-status-here) :: -- Key: C-c f G (magit-display-repository-buffer) :: -- Key: C-c f c (magit-commit) :: -- Key: C-c f e (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. - -- Key: C-c M-g (magit-file-dispatch) :: - - This transient prefix command binds the following suffix commands - and displays them in a temporary buffer until a suffix is invoked. - -- Key: C-c M-g s (magit-stage-file) :: -- Key: C-c M-g s (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. - -- Key: C-c M-g u (magit-unstage-file) :: -- Key: C-c M-g u (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. - -- Key: C-c M-g , x (magit-file-untrack) :: - - This command untracks a file read from the user, defaulting to the - visited file. - -- Key: C-c M-g , r (magit-file-rename) :: - - This command renames a file read from the user, defaulting to the - visited file. - -- Key: C-c M-g , k (magit-file-delete) :: - - This command deletes a file read from the user, defaulting to the - visited file. - -- Key: C-c M-g , c (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. - -- Key: C-c M-g D (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 [[*Diffing]]. - - This is the same command that ~d~ is bound to in Magit buffers. - If this command is invoked from a file-visiting buffer, then the - initial value of the option (~--~) that limits the diff to certain - file(s) is set to the visited file. - -- Key: C-c M-g d (magit-diff-buffer-file) :: - - This command shows the diff for the file of blob that the current - buffer visits. - -- User Option: magit-diff-buffer-file-locked :: - - This option controls whether ~magit-diff-buffer-file~ uses a dedicated - buffer. See [[*Modes and Buffers]]. - -- Key: C-c M-g L (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 [[*Logging]]. - - This is the same command that ~l~ is bound to in Magit buffers. - If this command is invoked from a file-visiting buffer, then the - initial value of the option (~--~) that limits the log to certain - file(s) is set to the visited file. - -- Key: C-c M-g l (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 ~--follow~ is an active log argument. When the region is - active, the log is restricted to the selected line range. - -- User Option: magit-log-buffer-file-locked :: - - This option controls whether ~magit-log-buffer-file~ uses a dedicated - buffer. See [[*Modes and Buffers]]. - -- Key: C-c M-g t (magit-log-trace-definition) :: - - This command shows the log for the definition at point. - -- Key: C-c M-g M (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. - -- Key: C-c M-g B (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 - [[*Blaming]]. - - In addition to the ~magit-blame~ sub-transient, the dispatch transient - also binds several blaming suffix commands directly. See [[*Blaming]] - for information about those commands and bindings. - -- Key: C-c M-g p (magit-blob-previous) :: - - This command visits the previous blob which modified the current - file. - -- Key: C-c M-g n (magit-blob-next) :: - - This command visits the next blob which modified the current file. - -- Key: C-c M-g v (magit-find-file) :: - - This command reads a revision and file and visits the respective - blob. - -- Key: C-c M-g V (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. - -- Key: C-c M-g g (magit-status-here) :: - - This command displays the status of the current repository in a - buffer, like ~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). - - Before doing so, save all file-visiting buffers belonging to the - current repository without prompting. - -- Key: C-c M-g G (magit-display-repository-buffer) :: - - This command reads and displays a Magit buffer belonging to the - current repository, without refreshing it. - -- Key: C-c M-g c (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 [[*Initiating a - Commit]]. - -- Key: C-c M-g e (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 ~git blame~ and made - editable using ~git rebase --interactive~ if it is reachable from - ~HEAD~, or by checking out the commit (or a branch that points at it) - otherwise. - -** Minor Mode for Buffers Visiting Blobs - -The ~magit-blob-mode~ enables certain Magit features in blob-visiting -buffers. Such buffers can be created using ~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. - -- Key: p (magit-blob-previous) :: - - This command visits the previous blob that modified the current - file. - -- Key: n (magit-blob-next) :: - - This command visit the next blob that modified the current file. - -- Key: q (magit-bury-or-kill-buffer) :: - - This command buries the current buffer, if that is being displayed - in multiple windows and/or when a prefix argument is used. If - neither is the case, it instead kills the current buffer. - -You might want to bind ~u~ to another command. Suitable commands -include ~bury-buffer~, ~magit-bury-buffer~ and ~magit-kill-this-buffer~. - -* 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. - -- 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 - ~("-c" "some.variable=compatible-value")~ to - ~magit-git-global-arguments~. - -- Certain settings like ~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 ~--prune~ argument in ~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 - ~--prune~ arguments being displayed in a way that seems to indicate - that no pruning will happen. - -I intend to address these and similar issues in a future release. - -** 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 -~/path/to/repo/.git/config~ instead of ~$HOME/.gitconfig~ or -~/etc/gitconfig~. See [[man:git-config]] - -Similarly, Emacs options can be set for one repository only by editing -~/path/to/repo/.dir-locals.el~. See [[info:emacs#Directory Variables]]. -For example to disable automatic refreshes of file-visiting buffers in -just one huge repository use this: - -- ~/path/to/huge/repo/.dir-locals.el~ - - #+BEGIN_SRC emacs-lisp - ((nil . ((magit-refresh-buffers . nil)))) - #+END_SRC - -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: - -- ~/path/to/tag/invested/repo/.dir-locals.el~ - - #+BEGIN_SRC emacs-lisp - ((magit-status-mode - . ((eval . (magit-disable-section-inserter 'magit-insert-tags-header))))) - #+END_SRC - -# new list -- Function: magit-disable-section-inserter fn :: - - This function disables the section inserter FN in the current - repository. It is only intended for use in ~.dir-locals.el~ and - ~.dir-locals-2.el~. - -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: - -- ~/path/to/huge/repo/.git/config~ - - #+BEGIN_SRC conf - [include] - path = /path/to/huge-gitconfig - #+END_SRC - -- ~/path/to/huge-gitconfig~ - - #+BEGIN_SRC conf - [status] - showUntrackedFiles = no - #+END_SRC - -- ~$HOME/.emacs.d/init.el~ - - #+BEGIN_SRC emacs-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_SRC - -** Essential Settings - -The next three sections list and discuss several variables that many -users might want to customize, for safety and/or performance reasons. - -*** Safety - -This section discusses various variables that you might want to -change (or *not* change) for safety reasons. - -Git keeps *committed* changes around long enough for users to recover -changes they have accidentally been deleted. It does not do the same -for *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 *tracked* files to work-in-progress references after or -before certain actions. See [[*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 ~magit-no-confirm~ (see [[*Completion and -Confirmation]]). If you enable the various wip modes then you should -add ~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 ~magit-delete-by-moving-to-trash~ -controls whether the system trash is used, which is the case by default. -Nevertheless, ~trash~ isn't a member of ~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 [[*Risk of Reverting -Automatically]]. - -*** Performance - -After Magit has run ~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. - -#+begin_src emacs-lisp - (setq magit-refresh-status-buffer nil) -#+end_src - -You should also check whether any third-party packages have added -anything to ~magit-refresh-buffer-hook~, ~magit-pre-refresh-hook~, and -~magit-post-refresh-hook~. If so, then check whether those additions -impact performance significantly. - -Magit can be told to refresh buffers verbosely using ~M-x -magit-toggle-verbose-refresh~. Enabling this helps figuring out which -sections are bottlenecks. Each line printed to the ~*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 ~auto-revert-mode~ from the built-in library -~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. - -#+begin_src emacs-lisp - (setq auto-revert-buffer-list-filter - 'magit-auto-revert-repository-buffer-p) -#+end_src - -For alternative approaches see [[*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 -[[*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 -~magit-insert-tags-headers~, as explained at the mentioned node. - -**** Log Performance -:PROPERTIES: -:UNNUMBERED: notoc -:END: - -When showing logs, Magit limits the number of commits initially shown -in the hope that this avoids unnecessary work. When ~--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 (https://www.spinics.net/lists/git/msg232230.html): "~--graph~ wants -to compute the whole history and the max-count only affects the output -phase after ~--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 ~-~ 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 -~--graph~ can slow things down. - -Using ~--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 ~--color~ is not enabled by default anymore. -Consider leaving it at that. - -**** Diff Performance -:PROPERTIES: -:UNNUMBERED: notoc -:END: - -If diffs are slow, then consider turning off some optional diff -features by setting all or some of the following variables to ~nil~: -~magit-diff-highlight-indentation~, ~magit-diff-highlight-trailing~, -~magit-diff-paint-whitespace~, ~magit-diff-highlight-hunk-body~, and -~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 ~magit-revision-mode~ takes considerably more time than -looking at the same commit in ~magit-diff-mode~, then consider setting -~magit-revision-insert-related-refs~ to ~nil~. - -When you are often confronted with diffs that contain deleted files, -then you might want to enable the ~--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 [[info:transient#Enabling and Disabling -Suffixes]]. Once you have done that you should enable it and save that -setting, see [[info:transient#Saving Values]]. You should do this in both -the diff (~d~) and the diff refresh (~D~) transient popups. - -**** Refs Buffer Performance -:PROPERTIES: -:UNNUMBERED: notoc -:END: - -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: - -#+begin_src emacs-lisp - (remove-hook 'magit-refs-sections-hook 'magit-insert-tags) -#+end_src - -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 ~f-pa~. - -**** Committing Performance -:PROPERTIES: -:UNNUMBERED: notoc -:END: - -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: - -#+begin_src emacs-lisp - (remove-hook 'server-switch-hook 'magit-commit-diff) - (remove-hook 'with-editor-filter-visit-hook 'magit-commit-diff) -#+end_src - -Then you can type ~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 ~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. - -**** Microsoft Windows Performance - -In order to update the status buffer, ~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. - -#+begin_src shell-script - 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_src - -You should also check whether an anti-virus program is affecting -performance. - -**** MacOS Performance - -Before Emacs 26.1 child processes were created using ~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 ~git~ processes that made quite a -difference. - -So make sure that you are using at least Emacs 26.1, in which case the -faster ~vfork~ will be used. (The creation of child processes still -takes about twice as long on Darwin compared to Linux.) See [fn:mac1] -for more information. - -Additionally, ~git~ installed from a package manager like ~brew~ or ~nix~ -seems to be slower than the native executable. Profile the ~git~ -executable you're running against the one at ~/usr/bin/git~, and if -you notice a notable difference try using the latter as -~magit-git-executable~. - -[fn:mac1] https://lists.gnu.org/archive/html/bug-gnu-emacs/2017-04/msg00201.html - -*** Global Bindings - -- User Option: 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. - - - If the value is ~nil~, no bindings are added. - - - If ~default~, maybe add: - - | ~C-x g~ | ~magit-status~ | - | ~C-x M-g~ | ~magit-dispatch~ | - | ~C-c M-g~ | ~magit-file-dispatch~ | - - - If ~recommended~, maybe add: - - | ~C-x g~ | ~magit-status~ | - | ~C-c g~ | ~magit-dispatch~ | - | ~C-c f~ | ~magit-file-dispatch~ | - - These bindings are strongly recommended, but we cannot use - them by default, because the ~C-c ~ namespace is - strictly reserved for bindings added by the user (see - [[info:elisp#Key Binding Conventions]]). - - The bindings in the chosen set may be added when - ~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 ~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 ~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 ~setq~ or the Custom interface. - Do not use the function ~customize-set-variable~ because doing - that would cause Magit to be loaded immediately, when that form - is evaluated (this differs from ~custom-set-variables~, which - doesn't load the libraries that define the customized variables). - - Setting this variable has no effect if ~after-init-hook~ has - already been run. - -* 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 [[info:with-editor]] for -information about ~with-editor~. ~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 -https://github.com/magit/magit/wiki/Plugin-Dispatch-Key-Registry. - -** Calling Git - -Magit provides many specialized functions for calling Git. All of -these functions are defined in either ~magit-git.el~ or ~magit-process.el~ -and have one of the prefixes ~magit-run-~, ~magit-call-~, ~magit-start-~, -or ~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 ~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. - -*** 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. - -- Function: magit-git-exit-code &rest args :: - - Executes git with ARGS and returns its exit code. - -- Function: magit-git-success &rest args :: - - Executes git with ARGS and returns ~t~ if the exit code is ~0~, ~nil~ - otherwise. - -- Function: magit-git-failure &rest args :: - - Executes git with ARGS and returns ~t~ if the exit code is ~1~, ~nil~ - otherwise. - -- Function: magit-git-true &rest args :: - - Executes git with ARGS and returns ~t~ if the first line printed by - git is the string "true", ~nil~ otherwise. - -- Function: magit-git-false &rest args :: - - Executes git with ARGS and returns ~t~ if the first line printed by - git is the string "false", ~nil~ otherwise. - -- Function: magit-git-insert &rest args :: - - Executes git with ARGS and inserts its output at point. - -- Function: 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 ~nil~. - -- Function: 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. - -- Function: 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 ~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. - -- Function: 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 - ~call-process~, except that file handlers are supported. Enables - Cygwin's "noglob" option during the call and ensures unix eol - conversion. - -- Function: magit-process-file process &optional infile buffer display &rest args :: - - Processes files synchronously in a separate process. Identical to - ~process-file~ but temporarily enables Cygwin's "noglob" option during - the call and ensures unix eol conversion. - -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. - -- User Option: magit-git-debug :: - - Whether to report errors that occur when using ~magit-git-insert~, - ~magit-git-string~, ~magit-git-lines~, or ~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. - -- Function: magit-git-str &rest args :: - - This is a variant of ~magit-git-string~ that ignores the option - ~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. - -*** 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 ~$~ from a Magit buffer or ~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. - -The synchronous functions return the exit code, while the asynchronous -functions return the process object. - -- Function: magit-call-git &rest args :: - - Calls git synchronously with ARGS. - -- Function: magit-call-process program &rest args :: - - Calls PROGRAM synchronously with ARGS. - -- Function: magit-run-git &rest args :: - - Calls git synchronously with ARGS and then refreshes. - -- Function: 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 ~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. - -- Function: magit-git &rest args :: - - Calls git synchronously with ARGS for side-effects only. This - function does not refresh the buffer. - -- Function: 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 - ~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. - -And now for the asynchronous variants. - -- Function: 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 ~magit-revert-buffers~ is non-~nil~. - -- Function: magit-run-git-with-editor &rest args :: - - Export GIT_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. - -- Function: 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 ~magit-git-executable~ specifies the Git executable and option - ~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 ~magit-revert-buffers~ is non-~nil~. - -- Function: 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 ~start-file-process~ and then setup to - use the sentinel ~magit-process-sentinel~ and the filter - ~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, ~magit-process-sentinel~ refreshes the - buffer that was current when ~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 ~magit-revert-buffers~ is - non-~nil~. - -- Variable: magit-this-process :: - - The child process which is about to start. This can be used to - change the filter and sentinel. - -- Variable: magit-process-raise-error :: - - When this is non-~nil~, then ~magit-process-sentinel~ raises an error if - git exits with a non-zero exit status. For debugging purposes. - -** Section Plumbing -*** Creating Sections - -- Macro: 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 ~magit-TYPE-section-map~ exists, then use that as the - text-property ~keymap~ of all text belonging to the section (but this - may be overwritten in subsections). TYPE can also have the form - ~(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 - ~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 ~start~ of the section object is set to - the value of ~point~ and after BODY was evaluated its ~end~ is set to - the new value of ~point~; BODY is responsible for moving ~point~ - forward. - - If it turns out inside BODY that the section is empty, then - ~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. - -- Function: magit-insert-heading &rest args :: - - Insert the heading for the section currently being inserted. - - This function should only be used inside ~magit-insert-section~. - - When called without any arguments, then just set the ~content~ slot of - the object representing the section being inserted to a marker at - ~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 ~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 ~content~ property of the section struct is the end of the heading - (which lasts from ~start~ to ~content~) and the beginning of the body - (which lasts from ~content~ to ~end~). If the value of ~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. - -- Function: magit-cancel-section :: - - Cancel the section currently being inserted. This exits the - innermost call to ~magit-insert-section~ and removes all traces of - what has already happened inside that call. - -- Function: 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. - -*** Section Selection - -- Function: magit-current-section :: - - Return the section at point. - -- Function: 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 ~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 ~magit-section-match~ for the - forms CONDITION can take. - -- Function: 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 - ~magit-region-sections~ (which see). - -*** Matching Sections - -- Key: M-x magit-describe-section-briefly :: - - Show information about the section at point. This command is - intended for debugging purposes. - -- Function: magit-section-ident section :: - - Return an unique identifier for SECTION. The return value has the - form ~((TYPE . VALUE)...)~. - -- Function: magit-get-section ident &optional root :: - - Return the section identified by IDENT. IDENT has to be a list as - returned by ~magit-section-ident~. - -- Function: magit-section-match condition &optional 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: - - ~(CONDITION...)~ - - matches if any of the CONDITIONs matches. - - - ~[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. - - - ~[* CLASS...]~ - - matches sections that match ~[CLASS...]~ and - also recursively all their child sections. - - - ~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. - - Each CLASS should be a class symbol, identifying a class that - derives from ~magit-section~. For backward compatibility CLASS - can also be a "type symbol". A section matches such a symbol - if the value of its ~type~ slot is ~eq~. If a type symbol has - an entry in ~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 ~magit-describe-section-briefly~, unless - of course you want to be that precise. - -- Function: 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 ~magit-section-match~ for the forms CONDITION can take. - -- Function: magit-section-case &rest clauses :: - - Choose among clauses on the type of the section at point. - - Each clause looks like (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 ~it~ is bound to the - section at point. If no clause succeeds or if there is no - section at point return ~nil~. - - See ~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. - -- Variable: 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 - ~magit-insert-section~ and you should never modify it. - -For diff related sections a few additional tools exist. - -- Function: magit-diff-type &optional section :: - - Return the diff type of SECTION. - - The returned type is one of the symbols ~staged~, ~unstaged~, ~committed~, - or ~undefined~. This type serves a similar purpose as the general - type common to all sections (which is stored in the ~type~ slot of the - corresponding ~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 ~tracked~ and ~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 ~diff~ or ~hunk~ section, or a section whose - children are of type ~diff~. If optional SECTION is ~nil~, return the - diff type for the current section. In buffers whose major mode is - ~magit-diff-mode~ SECTION is ignored and the type is determined using - other means. In ~magit-revision-mode~ buffers the type is always - ~committed~. - -- Function: 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 ~region~, ~hunk~, ~hunks~, ~file~, ~files~, or ~list~. Do not - confuse this with the diff "type", as returned by ~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., ~hunks~ or ~files~. If SECTION (or if the current section that - is ~nil~) is a ~hunk~ section and the region starts and ends inside - the body of a that section, then the type is ~region~. - - If optional STRICT is non-~nil~ then return ~nil~ if the diff type of - the section at point is ~untracked~ or the section at point is not - actually a ~diff~ but a ~diffstat~ 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 ~magit-mode-setup~. -Among other things, that function sets the buffer local values of -~default-directory~ (to the top-level of the repository), -~magit-refresh-function~, and ~magit-refresh-args~. - -Buffers are refreshed by calling the function that is the local value -of ~magit-refresh-function~ (a function named ~magit-*-refresh-buffer~, -where ~*~ may be something like ~diff~) with the value of -~magit-refresh-args~ as arguments. - -- Macro: 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 - ~magit-mode-display-buffer~ with BUFFER, MODE and SWITCH-FUNC as - arguments. Then it sets the local value of ~magit-refresh-function~ - to REFRESH-FUNC and that of ~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. - -- Function: 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 ~magit-mode-bury-buffer~. - - The buffer is displayed and selected using SWITCH-FUNCTION. If that - is ~nil~ then ~pop-to-buffer~ is used if the current buffer's major mode - derives from ~magit-mode~. Otherwise ~switch-to-buffer~ is used. - -- Variable: magit-refresh-function :: - - The value of this buffer-local variable is the function used to - refresh the current buffer. It is called with ~magit-refresh-args~ as - arguments. - -- Variable: magit-refresh-args :: - - The list of arguments used by ~magit-refresh-function~ to refresh the - current buffer. ~magit-refresh-function~ is called with these - arguments. - - The value is usually set using ~magit-mode-setup~, but in some cases - it's also useful to provide commands that can change the value. For - example, the ~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 ~magit-diff-more-context~, - ~magit-diff-less-context~ and ~magit-diff-default-context~ change just - the ~-U~ argument. In both case this is done by changing the value - of this variable and then calling this ~magit-refresh-function~. - -** Conventions - -Also see [[*Completion and Confirmation]]. - -*** 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 ~magit-branch-current~ accordingly. By default -it looks mostly like ~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 ~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 ~region~ face right to be -a good indicator for the general quality of a theme. My -recommendation for the ~region~ face is this: use a background color -slightly different from the background color of the ~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 -~default~ and a somewhat darker gray for the background of ~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 ~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., ~kill-region~. - -So using the regular ~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, ~magit-section-highlight~ -is used for both the body and the heading. Like the ~region~ face, it -should only set the background color to something similar to that of -~default~. The highlight background color must be different from both -the ~region~ background color and the ~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 ~magit-diff-hunk-heading~, should be different -from both ~magit-diff-hunk-heading-highlight~ and -~magit-section-highlight~, as well as from ~magit-diff-context~ and -~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 ~magit-diff-file-heading-selection~ or -~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 -~magit-diff-refine-hunk~ to ~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 ~magit-diff-highlight-indentation~, -~magit-diff-highlight-trailing~, and ~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: -~magit-diff-added~, ~magit-diff-added-highlight~, and -~diff-refined-added~. Make sure that the latter works well with both -of the former, as well as ~smerge-other~ and ~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 ~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. - -* FAQ -:PROPERTIES: -:APPENDIX: t -:END: - -The next two nodes lists frequently asked questions. For a list of -frequently *and recently* asked questions, i.e., questions that haven't -made it into the manual yet, see -https://github.com/magit/magit/wiki/FAQ. - -Please also see [[*Debugging Tools]]. - -** FAQ - How to ...? -*** How to pronounce Magit? - -Either ~mu[m's] git~ or ~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; ~Mag{ie => it}~. - -You can also choose to use the former pronunciation just because you -like it better. - -Also see https://magit.vc/assets/videos/magic.mp4. -Also see https://emacs.stackexchange.com/questions/13696. - -*** How to show git's output? - -To show the output of recently run git commands, press ~$~ (or, if that -isn't available, use ~M-x magit-process-buffer~). This shows a buffer -containing a section per git invocation; as always press ~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, using ~M-x -magit-toggle-git-debug~. - -*** How to install the gitman info manual? - -Git's manpages can be exported as an info manual called ~gitman~. -Magit's own info manual links to nodes in that manual instead of the -actual manpages, simply because Info doesn't support linking to -manpages. - -Unfortunately some distributions do not install the ~gitman~ manual by -default and you would have to install a separate documentation package -to get it. - -Magit patches info, adding the ability to visit links to the ~gitman~ -info manual, by instead viewing the respective manpage. If you prefer -that approach, then set the value of ~magit-view-git-manual-method~ to -one of the supported Emacs packages ~man~ or ~woman~, e.g.: - -#+begin_src emacs-lisp - (setq magit-view-git-manual-method 'man) -#+end_src - -*** 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. - -#+begin_src shell-script - git config --global diff.gpg.textconv "gpg --no-tty --decrypt" - echo "*.gpg filter=gpg diff=gpg" > .gitattributes -#+end_src - -*** How does branching and pushing work? - -Please see [[*Branching]] and https://emacsair.me/2016/01/18/magit-2.4 - -*** 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 ~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 ~vc-handled-backends~. - -** FAQ - Issues and Errors -*** Magit is slow - -See [[*Performance]] and [[*I changed several thousand files at once and -now Magit is unusable]]. - -*** 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 [[*Performance]]. - -*** I am having problems committing - -That likely means that Magit is having problems finding an appropriate -~emacsclient~ executable. See [[info:with-editor#Configuring With-Editor]] -and [[info:with-editor#Debugging]]. - -*** 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 -https://github.com/magit/magit/wiki/Pushing-with-Magit-from-Windows. - -*** 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 -https://github.com/purcell/exec-path-from-shell. By default it -synchronizes ~$PATH~, which helps Magit find the same ~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 ~$GPG_AGENT_INFO~. - -*** Expanding a file to show the diff causes it to disappear - -This is probably caused by a customization of a ~diff.*~ Git variable. -You probably set that variable for a reason, and should therefore only -undo that setting in Magit by customizing ~magit-git-global-arguments~. - -*** Point is wrong in the ~COMMIT_EDITMSG~ buffer - -Neither Magit nor ~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. ~saveplace~, -~pointback~, and ~session~ are likely candidates. These snippets might -help: - -#+begin_src emacs-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_src - -*** 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 ~Git-master~. -The built-in "Version Control" package, also known as "VC", updates -that information, and can be told to do so more often: - -#+begin_src emacs-lisp - (setq auto-revert-check-vc-info t) -#+end_src - -But doing so isn't good for performance. For more (overly optimistic) -information see [[info:emacs#VC Mode Line]]. - -If you don't really care about seeing this information in the -mode-line, but just don't want to see /incorrect/ information, -then consider simply not displaying it in the mode-line: - -#+begin_src emacs-lisp - (setq-default mode-line-format - (delete '(vc-mode vc-mode) mode-line-format)) -#+end_src - -*** 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. - -*** My Git hooks work on the command-line but not inside Magit - -When Magit calls ~git~ it adds a few global arguments including -~--literal-pathspecs~ and the ~git~ process started by Magit then passes -that setting on to other ~git~ process it starts itself. It does so by -setting the environment variable ~GIT_LITERAL_PATHSPECS~, not by calling -subprocesses with the ~--literal-pathspecs~ argument. You can therefore -override this setting in hook scripts using ~unset -GIT_LITERAL_PATHSPECS~. - -*** ~git-commit-mode~ isn't used when committing from the command-line - -The reason for this is that ~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 ~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 ~init.el~ file should contain: - -#+begin_src emacs-lisp - (require 'git-commit) - (server-mode) -#+end_src - -Instead of `(require 'git-commit)` you may also use: - -#+begin_src emacs-lisp - (load "/path/to/magit-autoloads.el") -#+end_src - -You might want to do that because loading ~git-commit~ causes large -parts of Magit to be loaded. - -There are also some variations of ~(server-mode)~ that you might want to -try. Personally I use: - -#+begin_src emacs-lisp - (use-package server - :config (or (server-running-p) (server-mode))) -#+end_src - -Now you can use: - -#+begin_src shell-script - $ emacs& - $ EDITOR=emacsclient git commit -#+end_src - -However you cannot use: - -#+begin_src shell-script - $ killall emacs - $ EDITOR="emacsclient --alternate-editor emacs" git commit -#+end_src - -This will actually end up using ~emacs~, not ~emacsclient~. If you do -this, then you can still edit the commit message but ~git-commit-mode~ -won't be used and you have to exit ~emacs~ to finish the process. - -Tautology ahead. If you want to be able to use ~emacsclient~ to connect -to a running ~emacs~ instance, even though no ~emacs~ instance is running, -then you cannot use ~emacsclient~ directly. - -Instead you have to create a script that does something like this: - -Try to use ~emacsclient~ (without using ~--alternate-editor~). If that -succeeds, do nothing else. Otherwise start ~emacs &~ (and ~init.el~ must -call ~server-start~) and try to use ~emacsclient~ again. - -*** Point ends up inside invisible text when jumping to a file-visiting buffer - -This can happen when you type ~RET~ on a hunk to visit the respective -file at the respective position. One solution to this problem is to -use ~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 ~magit-diff-visit-file-hook~ to reveal the text, possibly -using ~reveal-post-command~ or for Org buffers ~org-reveal~. - -*** 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 ~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 ~C-x C-s~ instead; the ~C-x~ prefix has other options as well when -using Transient, which will be displayed when it is typed. See -https://docs.magit.vc/transient/Saving-Values.html#Saving-Values for -more details. - -* 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. - -- Key: M-x 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. - -- Key: M-x 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 ~emacs~ with only ~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 ~make emacs-Q~ instead of the output of this command. - -- Key: M-x 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 ~$~. - - When git's output is consumed in some way, then it would be too - expensive to also insert it into this buffer, but with this command - that can be enabled temporarily. In that case, if git returns with - a non-zero exit status, then at least its standard error is inserted - into this buffer. - - Also note that just because git exits with a non-zero 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. - -- Key: M-x 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 ~*Messages*~ buffer. - -- Key: M-x magit-toggle-subprocess-record :: - - This command toggles whether subprocess invocations are recorded. - - When enabled, all subprocesses started by ~magit-process-file~ are - logged into the buffer specified by ~magit-process-record-buffer-name~ - using the format ~magit-process-record-entry-format~. This is for - debugging purposes. - - This is in addition to and distinct from the default logging done by - default, and additional logging enabled with ~magit-toggle-git-debug~. - -- Key: M-x magit-debug-git-executable :: - - This command displays a buffer containing information about the - available and used ~git~ executable(s), and can be useful when - investigating ~exec-path~ issues. - - Also see [[*Git Executable]]. - -- Key: M-x magit-profile-refresh-buffer :: - - This command profiles refreshing the current Magit buffer and then - displays the results. - -- Key: M-x magit-toggle-profiling :: - - This command starts profiling Magit and Forge, or if profiling is - already in progress, it instead stops that and displays the results. - -- Key: M-x with-editor-debug :: - - This command displays a buffer containing information about the - available and used ~emacsclient~ executable(s), and can be useful - when investigating why Magit (or rather ~with-editor~) cannot find - an appropriate ~emacsclient~ executable. - - Also see [[info:with-editor#Debugging]]. - -#+texinfo: @noindent -Please also see [[*FAQ]]. - -* Keystroke Index -:PROPERTIES: -:APPENDIX: t -:INDEX: ky -:COOKIE_DATA: recursive -:END: -* Function and Command Index -:PROPERTIES: -:APPENDIX: t -:INDEX: fn -:END: -* Variable Index -:PROPERTIES: -:APPENDIX: t -:INDEX: vr -:END: - -* Copying -:PROPERTIES: -:COPYING: t -:END: - -#+begin_quote -Copyright (C) 2015-{{{year}}} Jonas Bernoulli - -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_quote - -# LocalWords: ARG ARGS CONDITIONs ChangeLog DNS Dired Ediff Ediffing -# LocalWords: Elpa Emacsclient FUNC Flyspell Git Git's Gitk HOOK's -# LocalWords: IDENT Junio LocalWords Magit Magit's Magitian Magitians -# LocalWords: Melpa Propertize REF REF's RET Reflog SPC SYM Spacemacs -# LocalWords: Submodules TODO TYPEs Theming Unpulled Unpushed Unstaged -# LocalWords: Untracked WORKTREE Wip ack args async autoloads autosaving -# LocalWords: autosquash backport basename branchref builtin -# LocalWords: cdr changelog committer config customizable diff's diffstat -# LocalWords: dwim ediff ediffing editmsg emacsclient filename fixup -# LocalWords: flyspell func git's gitk gitman gitmodule gitmodules goto -# LocalWords: gpg gui ident init inserter inserters keymap keymaps -# LocalWords: logfile magit maildir manpage manpages minibuffer multi mv -# LocalWords: namespace newbase nocommit notesRef posix prev -# LocalWords: propertize rebase rebased rebasing reflog repo signoff str -# LocalWords: struct subcommand submodule submodule's submodules subprocess -# LocalWords: sym texinfo theming todo topdir un unhighlighted unpulled -# LocalWords: unpushed unstage unstaged unstages unstaging untracked url -# LocalWords: versa whitespace wip workflow worktree wtree -# LocalWords: backported macOS - -# IMPORTANT: Also update ORG_ARGS and ORG_EVAL in the Makefile. -# Local Variables: -# eval: (require 'magit-base nil t) -# eval: (require 'ol-man nil t) -# indent-tabs-mode: nil -# org-src-preserve-indentation: nil -# End: -- cgit v1.2.3