234 lines
10 KiB
Org Mode
234 lines
10 KiB
Org Mode
#+TITLE: Git contribution layer for Spacemacs
|
|
|
|
[[file:img/git.png]]
|
|
|
|
* Table of Contents :TOC@4:
|
|
- [[#description][Description]]
|
|
- [[#features][Features:]]
|
|
- [[#install][Install]]
|
|
- [[#layer][Layer]]
|
|
- [[#magit-status-fullscreen][Magit status fullscreen]]
|
|
- [[#magit-auto-complete][Magit auto-complete]]
|
|
- [[#magit-svn-plugin][Magit SVN plugin]]
|
|
- [[#git][Git]]
|
|
- [[#working-with-git][Working with Git]]
|
|
- [[#magit][Magit]]
|
|
- [[#commit-message-edition-buffer][Commit message edition buffer]]
|
|
- [[#interactive-rebase-buffer][Interactive rebase buffer]]
|
|
- [[#quick-guide-for-recurring-use-cases-in-magit][Quick guide for recurring use cases in Magit]]
|
|
- [[#git-time-machine][Git time machine]]
|
|
|
|
* Description
|
|
|
|
This layers adds extensive support for [[http://git-scm.com/][git]].
|
|
|
|
** Features:
|
|
- git repository management the indispensable [[http://magit.github.io/][magit]] package
|
|
- [[https://github.com/jtatarik/magit-gitflow][git-flow]] add-on for magit.
|
|
- quick in buffer history browsing with [[https://github.com/pidu/git-timemachine][git-timemachine]].
|
|
- quick in buffer last commit message per line with [[https://github.com/syohex/emacs-git-messenger][git-messenger]]
|
|
- colorize buffer line by age of commit with [[https://github.com/syohex/emacs-smeargle][smeargle]]
|
|
- gitignore generator with [[https://github.com/jupl/helm-gitignore][helm-gitignore]]
|
|
|
|
New to Magit? Checkout the [[http://magit.vc/about.html][official intro]].
|
|
|
|
* Install
|
|
|
|
** Layer
|
|
|
|
To use this contribution add it to your =~/.spacemacs=
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
(setq-default dotspacemacs-configuration-layers '(git))
|
|
#+END_SRC
|
|
|
|
** Magit status fullscreen
|
|
|
|
To display the =magit status= buffer in fullscreen set the variable
|
|
=git-magit-status-fullscreen= to =t= in your =dotspacemacs/init= function.
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
(defun dotspacemacs/init ()
|
|
(setq-default git-magit-status-fullscreen t)
|
|
)
|
|
#+END_SRC
|
|
|
|
** Magit auto-complete
|
|
|
|
Magit auto-complete feature is enabled. For this feature to work best you
|
|
have to setup your Git repository directory in your =dotspacemacs/config=
|
|
function, this is the folder where you keep all your git-controlled projects
|
|
(the path should end up with a ~=/~= to respect Emacs conventions):
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
(setq magit-repository-directories '("~/repos/"))
|
|
#+END_SRC
|
|
|
|
For more information, see [[https://magit.github.io/master/magit.html#Status][Magit-User-Manual#Status]]
|
|
|
|
** Magit SVN plugin
|
|
|
|
For convenience the magit SVN plugin can be activated directly in the Git
|
|
layer by setting the variable =git-enable-magit-svn-plugin= to =t=.
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
(defun dotspacemacs/init ()
|
|
(setq-default git-enable-magit-svn-plugin t)
|
|
)
|
|
#+END_SRC
|
|
|
|
** Git
|
|
|
|
Of course if your OS does not ship with git (!) you'll have to install it
|
|
on your machine. You can download it from the [[http://git-scm.com/downloads][download page]].
|
|
|
|
* Working with Git
|
|
|
|
Git commands (start with ~g~):
|
|
|
|
| Key Binding | Description |
|
|
|-------------+-----------------------------------------------------|
|
|
| ~SPC g b~ | open a =magit= blame |
|
|
| ~SPC g C~ | commit changes |
|
|
| ~SPC g d~ | show diff against current head |
|
|
| ~SPC g h c~ | clear highlights |
|
|
| ~SPC g h h~ | highlight regions by age of commits |
|
|
| ~SPC g h t~ | highlight regions by last updated time |
|
|
| ~SPC g I~ | open =helm-gitignore= |
|
|
| ~SPC g l~ | open a =magit= log |
|
|
| ~SPC g L~ | display the log for a file |
|
|
| ~SPC g s~ | open a =magit= status window |
|
|
| ~SPC g m~ | display the last commit message of the current line |
|
|
| ~SPC g t~ | launch the git time machine |
|
|
|
|
- Highlight by age of commit or last update time is provided by
|
|
[[https://github.com/syohex/emacs-smeargle][smeargle]].
|
|
- Git time machine is provided by [[https://github.com/pidu/git-timemachine][git-timemachine]].
|
|
- Git last commit message per line is provided by [[https://github.com/syohex/emacs-git-messenger][git-messenger]].
|
|
|
|
|
|
** Magit
|
|
|
|
=Spacemacs= uses [[http://magit.github.io/][magit]] to manage Git repositories.
|
|
|
|
To open a =status buffer=, type in a buffer of a Git repository: ~SPC g s~
|
|
|
|
~hjkl~ navigation is enabled in all Magit buffers. The default Magit keys
|
|
on ~hjkl~ (if they exist) are remapped on ~HJKL~.
|
|
|
|
Here are the often used bindings inside a =status buffer=, please note that
|
|
the following key bindings are valid in Vim editing style, in Emacs editing
|
|
style you can refer directly to the magit manual:
|
|
|
|
| Key Binding | Description |
|
|
|------------------+-----------------------------------------------------|
|
|
| ~/~ | evil-search |
|
|
| ~$~ | open =command output buffer= |
|
|
| ~c c~ | open a =commit message buffer= |
|
|
| ~b b~ | checkout a branch |
|
|
| ~b c~ | create a branch |
|
|
| ~f f~ | fetch changes |
|
|
| ~F -r F~ | pull and rebase |
|
|
| ~h~ | go left |
|
|
| ~j~ | go down |
|
|
| ~C-S-j~ or ~C-n~ | goto next magit section |
|
|
| ~k~ | go up |
|
|
| ~K~ | discard changes |
|
|
| ~C-S-k~ or ~C-p~ | goto previous magit section |
|
|
| ~l~ | go right |
|
|
| ~L l~ | open =log buffer= |
|
|
| ~n~ | next search occurrence |
|
|
| ~N~ | previous search occurrence _or_ SVN sub-menu |
|
|
| ~P P~ | push |
|
|
| ~q~ | quit |
|
|
| ~s~ | on a file or hunk in a diff: stage the file or hunk |
|
|
| ~+~ | on a hunk: increase hunk size |
|
|
| ~-~ | on a hunk: decrease hunk size |
|
|
| ~S~ | stage all |
|
|
| ~TAB~ | on a file: expand/collapse diff |
|
|
| ~u~ | on a staged file: unstage |
|
|
| ~U~ | unstage all staged files |
|
|
| ~v~ | go to =visual state= |
|
|
| ~V~ | go to =visual-line state= |
|
|
| ~C-v~ | revert item at point |
|
|
| ~z z~ | stash changes |
|
|
|
|
** Commit message edition buffer
|
|
|
|
In a commit message buffer press ~C-c C-c~ or ~SPC m c c~
|
|
to commit the changes with the entered message.
|
|
Pressing ~C-c C-k~ or ~SPC m k~ will discard the commit
|
|
message.
|
|
|
|
| Key Binding | Description |
|
|
|-------------+-------------|
|
|
| ~h~ | go left |
|
|
| ~j~ | go down |
|
|
| ~k~ | go up |
|
|
| ~l~ | go right |
|
|
| ~SPC m c c~ | commit |
|
|
| ~SPC m k~ | abort |
|
|
|
|
** Interactive rebase buffer
|
|
|
|
| Key Binding | Description |
|
|
|-------------+----------------|
|
|
| ~c~ | pick |
|
|
| ~e~ | edit |
|
|
| ~f~ | fixup |
|
|
| ~h~ | go left |
|
|
| ~j~ | go down |
|
|
| ~J~ | move line down |
|
|
| ~k~ | go up |
|
|
| ~K~ | move line up |
|
|
| ~C-k~ | kill line |
|
|
| ~l~ | go right |
|
|
| ~r~ | reword |
|
|
| ~s~ | squash |
|
|
| ~u~ | undo |
|
|
| ~x~ | execute |
|
|
| ~y~ | insert |
|
|
| ~SPC m c c~ | rebase |
|
|
| ~SPC m k~ | abort |
|
|
|
|
** Quick guide for recurring use cases in Magit
|
|
|
|
- Amend a commit:
|
|
- ~L l~ to open =log buffer=
|
|
- ~c a~ on the commit you want to amend
|
|
- ~C-c C-c~ to submit the changes
|
|
- Squash last commit:
|
|
- ~L l~ to open =log buffer=
|
|
- ~r e~ on the second to last commit, it opens the =rebase buffer=
|
|
- ~j~ to put point on last commit
|
|
- ~s~ to squash it
|
|
- ~C-c C-c~ to continue to the =commit message buffer=
|
|
- ~C-c C-c~ again when you have finished to edit the commit message
|
|
- Force push a squashed commit:
|
|
- in the =status buffer= you should see the new commit unpushed and the old
|
|
commit unpulled
|
|
- ~P -f P~ for force a push (*beware* usually it is not recommended to rewrite
|
|
the history of a public repository, but if you are *sure* that you are the
|
|
only one to work on a repository it is ok - i.e. in your fork).
|
|
- Add upstream remote (the parent repository you have forked):
|
|
- ~M~ to open the =remote popup=
|
|
- ~a~ to add a remote, type the name (i.e. =upstream=) and the URL
|
|
- Pull changes from upstream (the parent repository you have forked) and push:
|
|
- ~F -r C-u F~ and choose =upstream= or the name you gave to it
|
|
- ~P P~ to push the commit to =origin=
|
|
|
|
** Git time machine
|
|
|
|
[[https://github.com/pidu/git-timemachine][git-timemachine]] allows to quickly browse the commits of the current buffer.
|
|
|
|
| Key Binding | Description |
|
|
|-------------+------------------------------------------------|
|
|
| ~SPC g t~ | start git timemachine and initiate micro-state |
|
|
| ~c~ | show current commit |
|
|
| ~n~ | show next commit |
|
|
| ~N~ | show previous commit |
|
|
| ~p~ | show previous commit |
|
|
| ~q~ | leave micro-state and git timemachine |
|
|
| ~Y~ | copy current commit hash |
|
|
|
|
# LocalWords: unpulled
|