It's Magit! A Git Porcelain inside Emacs ========================================= 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. For more information about Magit, see https://magit.vc. If Magit helps you be more productive, then please consider donating at https://magit.vc/donate/. Magit v2.9.0 Release Notes ========================== Released 7 December 2016 by Jonas Bernoulli. We are pleased to announce the release of Magit version 2.9.0, representing 250 commits by 18 people over 15 weeks. Also see https://emacsair.me/2016/12/07/magit-2.9. Breaking changes since v2.8.0 ----------------------------- * For historic reasons "RET" behaved differently in `magit-refs-mode' than anywhere else. "RET" is one of Magit's most essential key bindings and users quickly learn that regardless of what is actually at point, it always shows more information about that thing in another buffer. It can be very confusing if the references buffer breaks this convention. Now `magit-visit-ref' behaves just like `magit-show-commit' even in `magit-refs-mode' buffers. By default at least; you can easily revert this change using: (setq magit-visit-ref-behavior '(checkout-any focus-on-ref)) However we recommend that you instead press "b b RET" to checkout the reference at point, just like you always had to do in other buffers. And "C-u y o RET" to make commit counts and lists of cherries commits relative to the reference at point. Furthermore the option `magit-visit-ref-create' was removed. If you previously had that set to `t', then you can achieve the same using: (add-to-list 'magit-visit-ref-behavior 'create-branch) However we recommend that you instead press "b c RET RET", just like you always had to do in other buffers. #2868 * The option `magit-popup-show-common-commands' now defaults to `nil'. This was done to make popups less noisy but increases the odds that some users will never become aware of the common commands. To counter that, the usage instructions displayed in the echo area now also mention the key that can be used to show these commands temporarily. #2868 You can easily revert this change using: (setq magit-popup-show-common-commands t) * The option `magit-popup-use-prefix-argument' defaults to `default' now, meaning that the use of a prefix argument causes the popup's default action to be invoked directly without the popup being shown first. Previously the use of a prefix argument did not invoke the popup or its default action, and instead informed users that they had to choose what behavior they wanted and that they had to set the option accordingly. Doing that was necessary three years ago, when the default behavior changed when "magit-key-mode.el" was replaced with "magit-popup.el". Now we don't need that safety net anymore. #2868 * If, and only if, point is on a removed line in a diff, then "RET" now jumps to the last commit which still had that line, not the commit which removed that line. Staged changes are excluded from this new behavior because in that case it seems favorable to always visit the file in the working tree to make further changes. #2755 You can easily revert this change using: (setq magit-diff-visit-previous-blob nil) * The margin that by default is displayed in pure log buffers and optionally in some other buffers that contain logs is now more flexible and easier to customize and to change on the fly. The popup that "L" is bound to now features three commands that for changing the appearance of the margin: `magit-toggle-margin', `magit-toggle-margin-details' and `magit-cycle-margin-style'. The binding for `magit-toggle-margin' has changed from "L t" to the simpler "L L". You can easily revert this change using: (magit-change-popup-key 'magit-log-refresh-popup :action ?L ?t) (magit-change-popup-key 'magit-margin-popup :action ?L ?t) For each mode that supports the margin there now exists a dedicated option named `magit-*-margin', which controls whether the margin is shown initially, whether the author name is displayed in addition to the committer date, and how that committer date is formatted. All of these options can be found in the new `magit-margin' Custom group. It is now possible to show the actual committer date, using a time format of your choosing. Previously the only option was to display the age of the commit. The old options that were previously used to configure the margin have been removed. If you have customized `magit-log-show-margin', `magit-reflog-show-margin' and/or `magit-refs-show-margin', then you now have to customize the respective new variable whose names do not contain "-show". The same applies if you have previously changed the value of `magit-log-margin-spec'. Unfortunately this cannot be automated because the format of the values has changed and because the old customizations do not unambiguously map to the new options. You might also want to customize the options `magit-status-margin', `magit-stashes-margin' and `magit-log-select-margin', for all of which no corresponding `magit-*-show-margin' used to exist. Another new option is `magit-refs-margin-for-tags'. If you choose to display the commit dates instead of the commit ages in all supported modes, then you should set `magit-log-margin' before loading `magit'. If you do that then the default values of the other `magit-*-margin' options will use the same commit date style without you having to customize each option individually. #2885, #2792 * By default Git-Commit no longer complains about a summary line that is too long by some standards. You can easily revert this change using: 2f115d51 (add-to-list 'git-commit-style-convention-checks 'overlong-summary-line) * In buffers used to write commit messages `fill-column' is no longer set to 72. Instead the default value 70 is used (or whatever local or global value is set up through other means). You can easily revert this change using: #2848, #2852 (setq git-commit-fill-column 72) * When it takes too long to parse diffs, then Magit used to stop expanding diff sections after one second. This was a constant source of confusion and one second is a very long time anyway, so this did not really help hiding the slowness, so this kludge was effectively dropped. You can easily revert this change using: (setq magit-diff-expansion-threshold 1.0) By the way, improving performance will soon be a priority again. #2886 Changes since v2.8.0 -------------------- * Magit has a new shiny logo! It was created by Dmitriy A. from Prospect One. Thanks a lot! https://prospectone.io/portfolio/magit * The new option `magit-branch-adjust-remote-upstream-alist' can be used to configure what branch to use as upstream when branching a remote branch. Without setting this option the upstream ends up being the same branch as the one referred to by the push-remote. 85c3053d * The per-refresh cache, which is used to save calls to git because that is surprisingly slow on Windows, has been improved for calls to `git config'. Instead of just avoiding identical calls to `git config' as for other sub-commands, we now call `git config --list' only once per refresh to obtain a list of all variables and their values. #2743 * When visiting a file or blob buffer by pressing "RET" while point is inside a diff, then the position this jumps to is now accurate (even when jumping to the file in the working tree from a diff that wasn't about changes in the working tree). #2828 * When visiting a file or blob buffer by pressing "RET" while point is inside a diff, then the buffer may be widened but only if necessary. If it isn't necessary to widen the buffer to jump to the appropriate location, because that position falls into the narrowed region, then that the buffer isn't widened. #2804, #2818 * Hunk refinement is now faster. Users who previously set `magit-diff-refine-hunk' to `nil' due to performance issues may find that it now works well even when set to `all'. #2834 * The new options `magit-diff-highlight-hunk-region-functions' and `magit-diff-unmarked-lines-keep-foreground' (which was previously defined as an undocumented variable) allow tuning the appearance of the hunk-internal region. The new function `magit-diff-highlight-hunk-region-using-face', provides a new style; it makes the hunk-internal region bold (or italic). I recommend you customize the above option to use this function instead of one of the functions mentioned below. The new functions `magit-diff-highlight-hunk-region-using-overlays' and `magit-diff-highlight-hunk-region-using-underline' draw one-pixel lines before and after the hunk-internal region. Both of these functions have (different) glitches and due to limitations of Emacs' display engine it is not possible to fix those. #2293, #2758, #2791 * Added command `magit-find-git-config-file' and variants to make it easier to open a file located in the git directory when ".git" is a regular file whose contents describe the location of the real git directory. 8664223c * Added command `magit-emacs-Q-command' to make troubleshooting and bug reporting easier for users not installing from the git repository. #2856 * The command `magit-branch-spinoff' learned to remove only a subset of commits from the previously current branch, instead of resetting it to its upstream, when the region selects commits reachable from HEAD. 1e652b87 * The command `magit-branch-delete' now falls back to deleting the tracking branch when the user attempts to delete a remote branch which does not actually exist on the remote anymore. #2778 * The command `magit-diff-dwim' learned about additional cases. On a non-current branch it now shows the diff for "CURRENT...BRANCH" (instead of "BRANCH..CURRENT") and inside a stash buffer it shows the diff for the commit at point. #2812 * The command `magit-push', which "o" is bound to in the push popup, now offers the push-branch as default choice. Only if that is not set does it default to the upstream as before. And when pushing a commit that is reachable from HEAD, then it offers to push to the push-branch or upstream of the current branch (which still has to be forced explicitly). #2820 * Log commands now support completion of refs in the "refs/tags" and "refs/pull" namespaces. #2878 * Added option `magit-no-confirm-default' to allow specifying commands which should just use the default choice instead of having the user confirm that by pressing RET. I recommend you don't use this, but if you think that the defaults are so good that you always want to use them, then this might make it a bit easier for you. #2741 * Added option `magit-slow-confirm' for users who are afraid they would answer `y-or-n-p' questions to quickly. One action, deleting all stashes, now defaults to having to be confirmed with "yes RET". #2752 * Added option `magit-view-git-manual-method' to allow following links to the Git Info manual by visiting the respective manpage instead. de38266a * The option `magit-branch-prefer-remote-upstream' now also supports regexps as members instead of only complete branch names. #2823 * The option `magit-branch-read-upstream-first' used to be a boolean. Now it supports a third value `fallback', which means to read the upstream first like `t', but if the value provided by the user does not reference an existing revision, then it is treated as the name of the new branch and the upstream is read using the second prompt, as if the value of this option were `nil'. #2741 * When deleting a stash, the hash is now logged to the process log buffer in addition to *Messages*, making it more likely that a user who accidentally deleted a stash would find the information required to undo that. #2746 * The environment variable `INSIDE_EMACS' is now set when calling git. #2789 * `magit-define-popup' now allows specifying `:max-action-columns' per section by using a function that returns a different value based on the heading, which is passed as argument. 964fcbe0 * Added support for new gpg status letters X, Y, R, and E. #2845 * Added `hl-line-mode' to `magit-repolist-hook' and `magit-submodule-list-hook' and defined those hooks explicitly. 9f806732 * Added the `--gpg-sign=' option to the revert popup. 916e4599 * Added the `--sort=' option to the show-refs popup. (Use "C-u y" to show the popup instead of invoking its default action as "y" does.) 8ab81f06 * Added new faces `git-rebase-comment-heading' and `git-rebase-comment-hash'. #2769 * `whitespace-mode' is not compatible with Magit buffers, where it is now actively prevented from being turned on by the user. #2821 Fixes since v2.8.0 ------------------ * The command `magit-list-repositories' failed on empty repositories. 09fac022 * The Git variable `pull.rebase' was ignored when determining whether the current branch is being rebased onto its upstream in order to display that information in the status buffer. 9c946ee3 * On 32-bit systems `magit-format-log-margin' failed because it tried to truncate a time float that was too large for that. #2765 * On Emacs v25.1 the hunk-internal region flashed briefly on mouse-down-1 events and the delimiting horizontal lines could end up having the height of a regular line instead of just a single pixel. #2758 * On Windows, when using a `windows-nt' Emacs together with a cygwin Git, we failed to instruct Emacs to not use dos shell quoting when calling git. And if Git wasn't available, then that caused an error, which prevented Magit from being loaded. #2842 * The encoding of commit messages is controlled by the Git variable `i18n.logOutputEncoding' but we failed to take that into account. Fixes by setting `i18n.logOutputEncoding' to UTF-8, but only inside Magit and only for `window-nt'. #2738, #2813 * It wasn't taken into account, until a few days after the release, that as of Git v2.11, the default abbreviation size is no longer hardcoded as 7 but instead scales with the repository size. #2880 * File and directory local variables were not honored in the buffers used to write commit messages. #2852 * The caching mechanism that is supposed to ensure that sections of unpulled and unpushed commits remain collapsed even when they disappear was broken for a while. 0ad041c4 * Process sentinels did not in all cases ensure that the correct buffer was current before doing something that assumes that this is the case. Almost always that did not matter because it was the case anyway, but if other timers are running then it is possible that those make the wrong buffer current. #2836 * Process sentinels and filters used when blaming assumed that the `exit' process status indicates success. #2836 * The commands `magit-clone' and `magit-init' did not work over Tramp. #2806, #2807 * The commands `magit-worktree-checkout' and `magit-worktree-branch' did not expand the path they pass to git, which is necessary because git does not know the meaning of "~/". #2796 * The commands which create fixup/squash commands and then immediately squash them into the target commit did not remove `--gpg-sign' or add `--no-gpg-sign'. Signing such commits is not only unnecessary; unless the passphrase was cached earlier, trying to sign resulted in the process indefinitely waiting for the passphrase to arrive with no way for the user to actually provide it. #2799 * Depending on the value of `magit-save-repository-buffers' the user might have been asked whether s/he wants to save "git-rebase-todo", which is never necessary and just a distraction. #2770, #2771 * The function `magit-save-repository-buffers' did not follow symlinks. #2843 * Directories whose names begin with a period were filtered out when using `magit-repository-directories' to calculate a list of repos. #2830 * The user name and email, which are displayed when reading a gpg key from the user, were not stripped from the chosen value before being handed off to git. #2761 * When the upstream of the current branch is a remote whose url isn't configured then that caused an error when refreshing the status buffer. #2858 * Buffers visiting a blob used the file's `default-directory' even when that directory did not exist in the working tree. The top-level directory is now used as `default-directory' when the subdirectory does not exist. cfe46766 * When visiting a directory by displaying a Dired buffer, we used to display a buffer for the parent of the directory in question and placed point on the name of the directory. But the intention always was to show the Dired buffer for the directory itself. 5665ba94 * Visiting or deleting a submodule listed inside "Modules" failed. The latter is now done by de-initalizing the module. c26b746e * In the list of commits that are being rebased in the status buffer, HEAD was sometimes prefixed with "same" when "stop" would have been correct. #2877 * The highlighting of a non-empty second line in a commit message was not automatically updated. #2777 * When `--force-with-lease' was added to the `magit-push-popup', `--force' was removed, but sometimes the former just isn't enough. be39a9ba * The face `magit-diff-file-heading-highlight' used to inherit from `magit-diff-file-heading', which by default makes text bold. That resulted in the complete current heading to be bold, but only the file-name part is supposed to be bold. a4b52516 * The manual stated that "DEL" in Git Rebase mode was bound to `magit-diff-show-or-scroll-down', which was not the case. A new command `git-rebase-show-or-scroll-down` has been added and bound to "DEL" to provide this functionality. #2863 * The function `magit-repolist-status' did not expand the filename which may be necessary when listing submodules. cc8c1385 * The macro `magit-with-temp-index' did honor the refresh cache, even though its BODY may contain calls to git that are identical to outside calls during the same refresh, but which are expected to return a different value due to the use of a different index. #2883 * The log margin did not show the author of stashes. #2846 * The status header about the upstream did not take `branch.NAME.rebase' into account. e65f15d0 * Highlighting overlays could not be garbage collected until after a refresh. #2888 This release also contains typofixes, documentation updates, code clean-ups, and other small bug fixes and improvements. Authors ------- 196 Jonas Bernoulli 21 Kyle Meyer 12 Noam Postavsky 4 Alexander Gramiak 2 Adam Porter 2 Marco Wahl 2 Sean Allred 1 Allen 1 Basil L. Contovounesios 1 Chillar Anand 1 Graham Dobbins 1 Joakim Jalap 1 Josiah Schwab 1 Keshav Kini 1 Marian Schubert 1 Philipp Stephani 1 Tunc Uzlu 1 York Zhao