Magit is a spectacular Emacs add-on for interacting with git. Magit was designed with git in mind (unlike VC mode, which is a more generic utility), so git commands map quite straightforwardly onto Magit commands. M-x magit-status tells you about the current state of your repo and gives you one-key access to many common git commands. However, what really sold me on Magit was its patch editor, which completely obsoletes my use of git add, git add --interactive, and git add --patch. If Magit had this patch editor and nothing else, I would still use it. That's how great this is.
M-x magit-status (which I've bound to C-c i) tells you about your working tree and the index, kind of like a combination of git diff, git diff --cached, and git status. It shows some number of sections (e.g. Staged changes, Unstaged changes, etc.); within each section you can see what files have been modified; within each file you can view the individual hunks. Within any of these containers you can press TAB to expand or collapse the heading. Moving your cursor into a file header or a diff hunk header selects the changes in that file or hunk, respectively. You can then press s to stage those changes, as shown in these before-and-after pictures:
Once you're satisfied with your staged changes, you can press c to commit, which prompts you for a log message. After you've typed a message, C-c C-c performs the actual commit.
This is already much faster than using git add --interactive or git add --patch to stage parts of a file. You just find the hunk you want rather than having git ask you yes/no about every hunk.
However, Magit also allows staging changes at an even finer granularity. If you highlight some lines in a hunk and then press s, Magit only stages the selected lines, as shown in these before-and-after pictures:
When in doubt, it's a good idea to make small commits rather than large commits. It's easy to revert (cherry-pick, explain, etc.) more than one commit, but hard to revert half a commit. Kudos to Magit for making small commits easier to create.
Finally, Magit comes with a fine manual, which you can read online.
Installing Magit
It doesn't get too much easier than this for external Emacs packages.
Check out Magit:
git clone git://gitorious.org/magit/mainline.git
Make sure that magit.el from that checkout, or a copy, is on your load path. For example:
(add-to-list 'load-path (expand-file-name "~/.emacs.d/lisp"))
Autoload Magit and bind magit-status:
(autoload 'magit-status "magit" nil t)
(global-set-key "\C-ci" 'magit-status)
Hi!
ReplyDeleteI have a problem with magit diff editor, may be you can help me.
It simply doesn't work for me with
git version 1.6.0.4 on cygwin and latest magit from git repo.
When I try to stage diff hunk (for ex. for file SLES.xml) I get error
$ git --no-pager apply --cached -
error: patch failed: atlas/SLES.xml:1624
error: atlas/SLES.xml: patch does not apply
But files are staged fine.
Dmitry,
ReplyDeleteSorry, I've never seen that error, or anything similar. You might have better luck on the magit mailing list.