1363 lines
51 KiB
Plaintext
1363 lines
51 KiB
Plaintext
|
This is magit.info, produced by makeinfo version 4.13 from magit.texi.
|
|||
|
|
|||
|
INFO-DIR-SECTION Emacs
|
|||
|
START-INFO-DIR-ENTRY
|
|||
|
* Magit: (magit). Using Git from Emacs with Magit.
|
|||
|
END-INFO-DIR-ENTRY
|
|||
|
|
|||
|
Copyright (C) 2008, 2009, 2010, 2011 Magit contributors. (See the
|
|||
|
header of magit.el for the lengthy list of Magit contributors.)
|
|||
|
|
|||
|
Permission is granted to copy, distribute and/or modify this
|
|||
|
document under the terms of the GNU Free Documentation License,
|
|||
|
Version 1.2 or any later version published by the Free Software
|
|||
|
Foundation; with no Invariant Sections, with no Front-Cover Texts,
|
|||
|
and with no Back-Cover Texts.
|
|||
|
|
|||
|
|
|||
|
File: magit.info, Node: Top, Next: Introduction, Up: (dir)
|
|||
|
|
|||
|
Magit User Manual
|
|||
|
*****************
|
|||
|
|
|||
|
Magit is an interface to the version control system Git, implemented as
|
|||
|
an extension to Emacs. Magit supports GNU Emacs version 22 or later.
|
|||
|
It may work with other emacsen, but Magit developers do not intend to
|
|||
|
investigate and fix bugs that only appear in unsupported versions.
|
|||
|
Patches to fix bugs in other emacsen or volunteers to maintain
|
|||
|
compatibility are still welcome.
|
|||
|
|
|||
|
* Menu:
|
|||
|
|
|||
|
* Introduction::
|
|||
|
* Acknowledgments::
|
|||
|
* Sections::
|
|||
|
* Status::
|
|||
|
* Untracked files::
|
|||
|
* Staging and Committing::
|
|||
|
* History::
|
|||
|
* Reflogs::
|
|||
|
* Commit Buffer::
|
|||
|
* Diffing::
|
|||
|
* Tagging::
|
|||
|
* Resetting::
|
|||
|
* Stashing::
|
|||
|
* Branching::
|
|||
|
* The Branch Manager::
|
|||
|
* Wazzup::
|
|||
|
* Merging::
|
|||
|
* Rebasing::
|
|||
|
* Interactive Rebasing::
|
|||
|
* Rewriting::
|
|||
|
* Pushing and Pulling::
|
|||
|
* Bisecting::
|
|||
|
* Submodules::
|
|||
|
* Using Magit Extensions::
|
|||
|
* Using Git Directly::
|
|||
|
* Customization::
|
|||
|
* Frequently Asked Questions::
|
|||
|
|
|||
|
|
|||
|
File: magit.info, Node: Introduction, Next: Acknowledgments, Prev: Top, Up: Top
|
|||
|
|
|||
|
1 Introduction
|
|||
|
**************
|
|||
|
|
|||
|
With Magit, you can inspect and modify your Git repositories with
|
|||
|
Emacs. You can review and commit the changes you have made to the
|
|||
|
tracked files, for example, and you can browse the history of past
|
|||
|
changes. There is support for cherry picking, reverting, merging,
|
|||
|
rebasing, and other common Git operations.
|
|||
|
|
|||
|
Magit is not a complete interface to Git; it just aims to make the
|
|||
|
most common Git operations convenient. Thus, Magit will likely not
|
|||
|
save you from learning Git itself.
|
|||
|
|
|||
|
This manual provides a tour of all Magit features. It does not give
|
|||
|
an introduction to version control in general, or to Git in particular.
|
|||
|
|
|||
|
The main entry point to Magit is `M-x magit-status', which will put
|
|||
|
you in Magit's status buffer. You will be using it frequently, so it
|
|||
|
is probably a good idea to bind `magit-status' to a key of your choice.
|
|||
|
|
|||
|
In addition to the status buffer, Magit will also create buffers that
|
|||
|
show lists of commits, buffers with diffs, and other kinds of buffers.
|
|||
|
All these buffers are in `magit-mode' and have the same key bindings.
|
|||
|
Not all commands make sense in all contexts, but a given key will
|
|||
|
always do the same thing in all Magit buffers.
|
|||
|
|
|||
|
Naturally, Magit runs the `git' command to do most of the work. The
|
|||
|
`*magit-process*' buffer contains the transcript of the most recent
|
|||
|
command. You can switch to it with `$'.
|
|||
|
|
|||
|
|
|||
|
File: magit.info, Node: Acknowledgments, Next: Sections, Prev: Introduction, Up: Top
|
|||
|
|
|||
|
2 Acknowledgments
|
|||
|
*****************
|
|||
|
|
|||
|
Marius Vollmer started the whole project. Thanks !
|
|||
|
|
|||
|
From day one of the first Magit announcement, John Wiegley has
|
|||
|
contributed numerous fixes, UI improvements, and new features. Thanks!
|
|||
|
|
|||
|
Linh Dang and Christian Neukirchen also contributed from day one.
|
|||
|
Thanks!
|
|||
|
|
|||
|
Phil Hagelberg joined a few days later. Thanks!
|
|||
|
|
|||
|
Alex Ott contributed support for git svn. Thanks!
|
|||
|
|
|||
|
Marcin Bachry contributed bug fixes and support for decorated logs.
|
|||
|
Thanks!
|
|||
|
|
|||
|
Alexey Voinov fixed bugs. Thanks!
|
|||
|
|
|||
|
Rémi Vanicat helped with Tramp support. Thanks!
|
|||
|
|
|||
|
|
|||
|
File: magit.info, Node: Sections, Next: Status, Prev: Acknowledgments, Up: Top
|
|||
|
|
|||
|
3 Sections
|
|||
|
**********
|
|||
|
|
|||
|
All Magit buffers are structured into nested 'sections'. These
|
|||
|
sections can be hidden and shown individually. When a section is
|
|||
|
hidden, only its first line is shown and all its children are
|
|||
|
completely invisible.
|
|||
|
|
|||
|
The most fine-grained way to control the visibility of sections is
|
|||
|
the `TAB' key. It will to toggle the current section (the section that
|
|||
|
contains point) between being hidden and being shown.
|
|||
|
|
|||
|
Typing `S-TAB' toggles the visibility of the children of the current
|
|||
|
section. When all of them are shown, they will all be hidden.
|
|||
|
Otherwise, when some or all are hidden, they will all be shown.
|
|||
|
|
|||
|
The digit keys `1', `2', `3', and `4' control the visibility of
|
|||
|
sections based on levels. Hitting `2', for example, will show sections
|
|||
|
on levels one and two, and will hide sections on level 3. However,
|
|||
|
only sections that are a parent or child of the current section are
|
|||
|
affected.
|
|||
|
|
|||
|
For example, when the current section is on level 3 and you hit `1',
|
|||
|
the grand-parent of the current section (which is on level one) will be
|
|||
|
shown, and the parent of the current section (level 2) will be hidden.
|
|||
|
The visibility of no other section will be changed.
|
|||
|
|
|||
|
This sounds a bit complicated, but you'll figure it out.
|
|||
|
|
|||
|
Using `M-1', `M-2', `M-3', and `M-4' is similar to the unmodified
|
|||
|
digits, but now all sections on the respective level are affected,
|
|||
|
regardless of whether or not they are related to the current section.
|
|||
|
|
|||
|
For example, `M-1' will only show the first lines of the top-level
|
|||
|
sections and will hide everything else. Typing `M-4' on the other hand
|
|||
|
will show everything.
|
|||
|
|
|||
|
Because of the way the status buffer is set up, some changes to
|
|||
|
section visibility are more common than others. Files are on level 2
|
|||
|
and diff hunks are on level 4. Thus, you can type `2' to collapse the
|
|||
|
diff of the current file, and `M-2' to collapse all files. This
|
|||
|
returns the status buffer to its default setup and is a quick way to
|
|||
|
unclutter it after drilling down into the modified files.
|
|||
|
|
|||
|
Because `2' and `M-2' are so common in the status buffer, they are
|
|||
|
bound to additional, more mnemonic keys: `M-h' (hide) and `M-H' (hide
|
|||
|
all). Likewise `4' and `M-4' are also available as `M-s' (show) and
|
|||
|
`M-S' (show all).
|
|||
|
|
|||
|
In other buffers than the status buffer, `M-h', `M-H', `M-s', and
|
|||
|
`M-S' might work on different levels than on 2 and 4, but they keep
|
|||
|
their general meaning: `M-H' hides all detail, and `M-S' shows
|
|||
|
everything.
|
|||
|
|
|||
|
|
|||
|
File: magit.info, Node: Status, Next: Untracked files, Prev: Sections, Up: Top
|
|||
|
|
|||
|
4 Status
|
|||
|
********
|
|||
|
|
|||
|
Running `M-x magit-status' displays the main interface of Magit, the
|
|||
|
status buffer. You can have multiple status buffers active at the same
|
|||
|
time, each associated with its own Git repository.
|
|||
|
|
|||
|
When invoking `M-x magit-status' from within a Git repository, it
|
|||
|
will switch to the status buffer of that repository. Otherwise, it
|
|||
|
will prompt for a directory. With a prefix argument, it will always
|
|||
|
prompt.
|
|||
|
|
|||
|
You can set `magit-repo-dirs' to customize how `magit-status' asks
|
|||
|
for the repository to work on. When `magit-repo-dirs' is nil,
|
|||
|
`magit-status' will simply ask for a directory.
|
|||
|
|
|||
|
If you specify a directory that is not a Git repository, `M-x
|
|||
|
magit-status' will offer to initialize it as one.
|
|||
|
|
|||
|
When `magit-repo-dirs' is not nil, it is treated as a list of
|
|||
|
directory names, and `magit-status' will find all Git repositories in
|
|||
|
those directories and offer them for completion. (Magit will only look
|
|||
|
`magit-repo-dirs-depth' levels deep, however.)
|
|||
|
|
|||
|
With two prefix arguments, `magit-status' will always prompt for a
|
|||
|
raw directory.
|
|||
|
|
|||
|
Thus, you would normally set `magit-repo-dirs' to the places where
|
|||
|
you keep most of your Git repositories and switch between them with
|
|||
|
`C-u M-x magit-status'. If you want to go to a repository outside of
|
|||
|
your normal working areas, or if you want to create a new repository,
|
|||
|
you would use `C-u C-u M-x magit-status'.
|
|||
|
|
|||
|
You need to explicitly refresh the status buffer when you have made
|
|||
|
changes to the repository from outside of Emacs. You can type `g' in
|
|||
|
the status buffer itself, or just use `M-x magit-status' instead of
|
|||
|
`C-x b' when switching to it. You also need to refresh the status
|
|||
|
buffer in this way after saving a file in Emacs.
|
|||
|
|
|||
|
The header at the top of the status buffer shows a short summary of
|
|||
|
the repository state: where it is located, which branch is checked out,
|
|||
|
etc. Below the header are a number of sections that show details about
|
|||
|
the working tree and the staging area. You can hide and show them as
|
|||
|
described in the previous section.
|
|||
|
|
|||
|
The first section shows _Untracked files_, if there are any. See
|
|||
|
*note Untracked files:: for more details.
|
|||
|
|
|||
|
The next two sections show your local changes. They are explained
|
|||
|
fully in the next chapter, *note Staging and Committing::.
|
|||
|
|
|||
|
If the current branch is associated with a remote tracking branch,
|
|||
|
the status buffer shows the differences between the current branch and
|
|||
|
the tracking branch. See *note Pushing and Pulling:: for more
|
|||
|
information.
|
|||
|
|
|||
|
During a history rewriting session, the status buffer shows the
|
|||
|
_Pending changes_ and _Pending commits_ sections. See *note
|
|||
|
Rewriting:: for more details.
|
|||
|
|
|||
|
|
|||
|
File: magit.info, Node: Untracked files, Next: Staging and Committing, Prev: Status, Up: Top
|
|||
|
|
|||
|
5 Untracked files
|
|||
|
*****************
|
|||
|
|
|||
|
Untracked files are shown in the _Untracked files_ section.
|
|||
|
|
|||
|
You can add an untracked file to the staging area with `s'. If
|
|||
|
point is on the _Untracked files_ section title when you hit `s', all
|
|||
|
untracked files are staged.
|
|||
|
|
|||
|
Typing `C-u S' anywhere will also stage all untracked files,
|
|||
|
together with all changes to the tracked files.
|
|||
|
|
|||
|
You can instruct Git to ignore them by typing `i'. This will add
|
|||
|
the filename to the `.gitignore' file. Typing `C-u i' will ask you for
|
|||
|
the name of the file to ignore. This is useful to ignore whole
|
|||
|
directories, for example. In this case, the minibuffer's future history
|
|||
|
(accessible with `M-n') contains predefined values (such as wildcards)
|
|||
|
that might be of interest. If prefix argument is negative (for example
|
|||
|
after typing `C-- i'), the prompt proposes wildcard by default. The
|
|||
|
`I' command is similar to `i' but will add the file to
|
|||
|
`.git/info/exclude' instead.
|
|||
|
|
|||
|
To delete an untracked file forever, use `k'. If point is on the
|
|||
|
_Untracked files_ section title when you hit `k', all untracked files
|
|||
|
are deleted.
|
|||
|
|
|||
|
|
|||
|
File: magit.info, Node: Staging and Committing, Next: History, Prev: Untracked files, Up: Top
|
|||
|
|
|||
|
6 Staging and Committing
|
|||
|
************************
|
|||
|
|
|||
|
Comitting with Git is a two step process: first you add the changes you
|
|||
|
want to commit to a 'staging area', and then you commit them to the
|
|||
|
repository. This allows you to only commit a subset of your local
|
|||
|
changes.
|
|||
|
|
|||
|
Magit allows you to ignore the staging area if you wish. As long as
|
|||
|
your staging area is unused, Magit will show your uncomitted changes in
|
|||
|
a section named _Changes_.
|
|||
|
|
|||
|
When the staging area is in use, Magit uses two sections: _Unstaged
|
|||
|
changes_ and _Staged changes_. The _Staged changes_ section shows the
|
|||
|
changes that will be included in the next commit, while the _Unstaged
|
|||
|
changes_ section shows the changes that will be left out.
|
|||
|
|
|||
|
To move an unstaged hunk into the staging area, move point into the
|
|||
|
hunk and type `s'. Likewise, to unstage a hunk, move point into it and
|
|||
|
type `u'. If point is in a diff header when you type `s' or `u', all
|
|||
|
hunks belonging to that diff are moved at the same time.
|
|||
|
|
|||
|
If the region is active when you type `s' or `u', only the changes
|
|||
|
in the region are staged or unstaged. (This works line by line: if the
|
|||
|
beginning of a line is in the region it is included in the changes,
|
|||
|
otherwise it is not.)
|
|||
|
|
|||
|
To change the size of the hunks, you can type `+' or `-' to increase
|
|||
|
and decrease, respectively. Typing `0' will reset the hunk size to the
|
|||
|
default.
|
|||
|
|
|||
|
Typing `C-u s' will ask you for a name of a file to be staged, for
|
|||
|
example to stage files that are hidden.
|
|||
|
|
|||
|
To move all hunks of all diffs into the staging area in one go, type
|
|||
|
`S'. To unstage everything, type `U'.
|
|||
|
|
|||
|
Typing `C-u S' will stage all untracked files in addition to the
|
|||
|
changes to tracked files.
|
|||
|
|
|||
|
You can discard uncommitted changes by moving point into a hunk and
|
|||
|
typing `k'. The changes to discard are selected as with `s' and `u'.
|
|||
|
|
|||
|
Before committing, you should write a short description of the
|
|||
|
changes.
|
|||
|
|
|||
|
Type `c' to pop up a buffer where you can write your change
|
|||
|
description. Once you are happy with the description, type `C-c C-c'
|
|||
|
in that buffer to perform the commit.
|
|||
|
|
|||
|
If you want to write changes in a `ChangeLog' file, you can use `C-x
|
|||
|
4 a' on a diff hunk.
|
|||
|
|
|||
|
Typing `c' when the staging area is unused is a special situation.
|
|||
|
Normally, the next commit would be empty, but you can configure Magit
|
|||
|
to do something more useful by customizing the
|
|||
|
`magit-commit-all-when-nothing-staged' variable. One choice is to
|
|||
|
instruct the subsequent `C-c C-c' to commit all changes. Another
|
|||
|
choice is stage everything at the time of hitting `c'.
|
|||
|
|
|||
|
You can type `C-c C-a' in the buffer with the change description to
|
|||
|
toggle a flag that determines whether the next commit will _amend_ the
|
|||
|
current commit in HEAD.
|
|||
|
|
|||
|
Typing `C-c C-s' will toggle the `--signoff' option. The default is
|
|||
|
determined by the `magit-commit-signoff' customization variable.
|
|||
|
|
|||
|
Typing `C-c C-e' will toggle the `--allow-empty' option. This
|
|||
|
allows you to make commits that serve as notes, without including any
|
|||
|
changes.
|
|||
|
|
|||
|
Typing `C-c C-t' will toggle the option to specify the name and
|
|||
|
email address for the commit's author. The default is determined by
|
|||
|
the `user.name' and `user.email' git configuration settings.
|
|||
|
|
|||
|
If you change your mind and don't want to go ahead with your commit
|
|||
|
while you are in the `*magit-log-edit*' buffer, you can just switch to
|
|||
|
another buffer, continue editing there, staging and unstaging things
|
|||
|
until you are happy, and then return to the `*magit-log-edit*' buffer,
|
|||
|
maybe via `C-x b', or by hitting `c' again in a Magit buffer.
|
|||
|
|
|||
|
If you want to erase the `*magit-log-edit*' buffer and bury it, you
|
|||
|
can hit `C-c C-k' in it.
|
|||
|
|
|||
|
Typing `C' will also pop up the change description buffer, but in
|
|||
|
addition, it will try to insert a ChangeLog-style entry for the change
|
|||
|
that point is in.
|
|||
|
|
|||
|
|
|||
|
File: magit.info, Node: History, Next: Reflogs, Prev: Staging and Committing, Up: Top
|
|||
|
|
|||
|
7 History
|
|||
|
*********
|
|||
|
|
|||
|
To show the repository history of your current head, type `l l'. A new
|
|||
|
buffer will be shown that displays the history in a terse form. The
|
|||
|
first paragraph of each commit message is displayed, next to a
|
|||
|
representation of the relationships between commits.
|
|||
|
|
|||
|
To show the repository history between two branches or between any
|
|||
|
two points of the history, type `l r l'. You will be prompted to enter
|
|||
|
references for starting point and ending point of the history range; you
|
|||
|
can use auto-completion to specify them. A typical use case for ranged
|
|||
|
history log display would be `l r l master RET new-feature RET' that
|
|||
|
will display commits on the new-feature branch that are not in master;
|
|||
|
these commits can then be inspected and cherry-picked, for example.
|
|||
|
|
|||
|
More thorough filtering can be done by supplying `l' with one or
|
|||
|
more suffix arguments, as displayed in its popup. `=g' ('Grep') for
|
|||
|
example, limits the output to commits of which the log message matches
|
|||
|
a specific string/regex.
|
|||
|
|
|||
|
Typing `l L' (or `l C-u L') will show the log in a more verbose form.
|
|||
|
|
|||
|
Magit will show only `magit-log-cutoff-length' entries. `e' will
|
|||
|
show twice as many entries. `C-u e' will show all entries, and given a
|
|||
|
numeric prefix argument, `e' will add this number of entries.
|
|||
|
|
|||
|
You can move point to a commit and then cause various things to
|
|||
|
happen with it. (The following commands work in any list of commits,
|
|||
|
such as the one shown in the _Unpushed commits_ section.)
|
|||
|
|
|||
|
Typing `RET' will pop up more information about the current commit
|
|||
|
and move point into the new buffer. *Note Commit Buffer::. Typing
|
|||
|
`SPC' and `DEL' will also show the information, but will scroll the new
|
|||
|
buffer up or down (respectively) when typed again.
|
|||
|
|
|||
|
Typing `a' will apply the current commit to your current branch.
|
|||
|
This is useful when you are browsing the history of some other branch
|
|||
|
and you want to `cherry-pick' some changes from it. A typical
|
|||
|
situation is applying selected bug fixes from the development version
|
|||
|
of a program to a release branch. The cherry-picked changes will not
|
|||
|
be committed automatically; you need to do that explicitly.
|
|||
|
|
|||
|
Typing `A' will cherry-pick the current commit and will also commit
|
|||
|
the changes automatically when there have not been any conflicts.
|
|||
|
|
|||
|
Typing `v' will revert the current commit. Thus, it will apply the
|
|||
|
changes made by that commit in reverse. This is obviously useful to
|
|||
|
cleanly undo changes that turned out to be wrong. As with `a', you
|
|||
|
need to commit the changes explicitly.
|
|||
|
|
|||
|
Typing `C-w' will copy the sha1 of the current commit into the kill
|
|||
|
ring.
|
|||
|
|
|||
|
Typing `=' will show the differences from the current commit to the
|
|||
|
"marked" commit.
|
|||
|
|
|||
|
You can mark the current commit by typing `.'. When the current
|
|||
|
commit is already marked, typing `.' will unmark it. To unmark the
|
|||
|
marked commit no matter where point is, use `C-u .'.
|
|||
|
|
|||
|
Some commands, such as `=', will use the current commit and the
|
|||
|
marked commit as implicit arguments. Other commands will offer the
|
|||
|
marked commit as a default when prompting for their arguments.
|
|||
|
|
|||
|
|
|||
|
File: magit.info, Node: Reflogs, Next: Commit Buffer, Prev: History, Up: Top
|
|||
|
|
|||
|
8 Reflogs
|
|||
|
*********
|
|||
|
|
|||
|
You can use `l h' and `l H' to browse your _reflog_, the local history
|
|||
|
of changes made to your repository heads. Typing `H' will ask for a
|
|||
|
head, while `l h' will show the reflog of `HEAD'.
|
|||
|
|
|||
|
The resulting buffer is just like the buffer produced by `l l' and
|
|||
|
`l L' that shows the commit history.
|
|||
|
|
|||
|
|
|||
|
File: magit.info, Node: Commit Buffer, Next: Diffing, Prev: Reflogs, Up: Top
|
|||
|
|
|||
|
9 Commit Buffer
|
|||
|
***************
|
|||
|
|
|||
|
When you view a commit (perhaps by selecting it in the log buffer,
|
|||
|
*note History::), the "commit buffer" is displayed, showing you
|
|||
|
information about the commit and letting you interact with it.
|
|||
|
|
|||
|
By placing your cursor within the diff or hunk and typing `a', you
|
|||
|
can apply the same patch to your working copy. This is useful when you
|
|||
|
want to copy a change from another branch, but don't necessarily want
|
|||
|
to cherry-pick the whole commit.
|
|||
|
|
|||
|
By typing `v' you can apply the patch in reverse, removing all the
|
|||
|
lines that were added and adding all the lines that were removed. This
|
|||
|
is a convenient way to remove a change after determining that it
|
|||
|
introduced a bug.
|
|||
|
|
|||
|
If the commit message refers to any other commits in the repository
|
|||
|
by their unique hash, the hash will be highlighted and you will be able
|
|||
|
to visit the referenced commit either by clicking on it or by moving
|
|||
|
your cursor onto it and pressing `RET'.
|
|||
|
|
|||
|
The commit buffer maintains a history of the commits it has shown.
|
|||
|
After visiting a referenced commit you can type `C-c C-b' to get back
|
|||
|
to where you came from. To go forward in the history, type `C-c C-f'.
|
|||
|
There are also `[back]' and `[forward]' buttons at the bottom of the
|
|||
|
buffer.
|
|||
|
|
|||
|
|
|||
|
File: magit.info, Node: Diffing, Next: Tagging, Prev: Commit Buffer, Up: Top
|
|||
|
|
|||
|
10 Diffing
|
|||
|
**********
|
|||
|
|
|||
|
Magit typically shows diffs in the "unified" format.
|
|||
|
|
|||
|
In any buffer that shows a diff, you can type `e' anywhere within
|
|||
|
the diff to show the two versions of the file in Ediff. If the diff is
|
|||
|
of a file in the status buffer that needs to be merged, you will be
|
|||
|
able to use Ediff as an interactive merge tool. Otherwise, Ediff will
|
|||
|
simply show the two versions of the file.
|
|||
|
|
|||
|
To show the changes from your working tree to another revision, type
|
|||
|
`d'. To show the changes between two arbitrary revisions, type `D'.
|
|||
|
|
|||
|
You can use `a' within the diff output to apply the changes to your
|
|||
|
working tree. As usual when point is in a diff header for a file, all
|
|||
|
changes for that file are applied, and when it is in a hunk, only that
|
|||
|
hunk is. When the region is active, the applied changes are restricted
|
|||
|
to that region.
|
|||
|
|
|||
|
Typing `v' will apply the selected changes in reverse.
|
|||
|
|
|||
|
|
|||
|
File: magit.info, Node: Tagging, Next: Resetting, Prev: Diffing, Up: Top
|
|||
|
|
|||
|
11 Tagging
|
|||
|
**********
|
|||
|
|
|||
|
Typing `t t' will make a lighweight tag. Typing `t a' will make an
|
|||
|
annotated tag. It will put you in the normal `*magit-log-edit' buffer
|
|||
|
for writing commit messages, but typing `C-c C-c' in it will make the
|
|||
|
tag instead. This is controlled by the `Tag' field that will be added
|
|||
|
to the `*magit-log-edit*' buffer. You can edit it, if you like.
|
|||
|
|
|||
|
|
|||
|
File: magit.info, Node: Resetting, Next: Stashing, Prev: Tagging, Up: Top
|
|||
|
|
|||
|
12 Resetting
|
|||
|
************
|
|||
|
|
|||
|
Once you have added a commit to your local repository, you can not
|
|||
|
change that commit anymore in any way. But you can reset your current
|
|||
|
head to an earlier commit and start over.
|
|||
|
|
|||
|
If you have published your history already, rewriting it in this way
|
|||
|
can be confusing and should be avoided. However, rewriting your local
|
|||
|
history is fine and it is often cleaner to fix mistakes this way than
|
|||
|
by reverting commits (with `v', for example).
|
|||
|
|
|||
|
Typing `x' will ask for a revision and reset your current head to
|
|||
|
it. No changes will be made to your working tree and staging area.
|
|||
|
Thus, the _Staged changes_ section in the status buffer will show the
|
|||
|
changes that you have removed from your commit history. You can commit
|
|||
|
the changes again as if you had just made them, thus rewriting history.
|
|||
|
|
|||
|
Typing `x' while point is in a line that describes a commit will
|
|||
|
offer this commit as the default revision to reset to. Thus, you can
|
|||
|
move point to one of the commits in the _Unpushed commits_ section and
|
|||
|
hit `x RET' to reset your current head to it.
|
|||
|
|
|||
|
Type `X' to reset your working tree and staging area to the most
|
|||
|
recently committed state. This will discard your local modifications,
|
|||
|
so be careful.
|
|||
|
|
|||
|
You can give a prefix to `x' if you want to reset both the current
|
|||
|
head and your working tree to a given commit. This is the same as
|
|||
|
first using an unprefixed `x' to reset only the head, and then using
|
|||
|
`X'.
|
|||
|
|
|||
|
|
|||
|
File: magit.info, Node: Stashing, Next: Branching, Prev: Resetting, Up: Top
|
|||
|
|
|||
|
13 Stashing
|
|||
|
***********
|
|||
|
|
|||
|
You can create a new stash with `z z'. Your stashes will be listed in
|
|||
|
the status buffer, and you can apply them with `a' and pop them with
|
|||
|
`A'. To drop a stash, use `k'.
|
|||
|
|
|||
|
With a prefix argument, both `a' and `A' will attempt to reinstate
|
|||
|
the index as well as the working tree from the stash.
|
|||
|
|
|||
|
Typing `z -k z' will create a stash just like `z z', but will leave
|
|||
|
the changes in your working tree and index. This makes it easier to,
|
|||
|
for example, test multiple variations of the same change.
|
|||
|
|
|||
|
If you just want to make quick snapshots in between edits, you can
|
|||
|
use `z s', which automatically enters a timestamp as description, and
|
|||
|
keeps your working tree and index intact by default.
|
|||
|
|
|||
|
You can visit and show stashes in the usual way: Typing `SPC' and
|
|||
|
`DEL' will pop up a buffer with the description of the stash and scroll
|
|||
|
it, typing `RET' will move point into that buffer. Using `C-u RET' will
|
|||
|
move point into that buffer in other window.
|
|||
|
|
|||
|
|
|||
|
File: magit.info, Node: Branching, Next: The Branch Manager, Prev: Stashing, Up: Top
|
|||
|
|
|||
|
14 Branching
|
|||
|
************
|
|||
|
|
|||
|
The current branch is indicated in the header of the status buffer.
|
|||
|
You can switch to a different branch by typing `b b'. This will
|
|||
|
immediately checkout the branch into your working copy, so you
|
|||
|
shouldn't have any local modifications when switching branches.
|
|||
|
|
|||
|
If you try to switch to a remote branch, Magit will offer to create a
|
|||
|
local tracking branch for it instead. This way, you can easily start
|
|||
|
working on new branches that have appeared in a remote repository.
|
|||
|
|
|||
|
Typing `b b' while point is at a commit description will offer that
|
|||
|
commit as the default to switch to. This will result in a detached
|
|||
|
head.
|
|||
|
|
|||
|
Typing `b m' will let you rename a branch. Unless a branch with the
|
|||
|
same name already exists, obviously...
|
|||
|
|
|||
|
To create a new branch and switch to it immediately, type `b n'.
|
|||
|
|
|||
|
To delete a branch, type `b d'. If you're currently on that branch,
|
|||
|
Magit will offer to switch to the 'master' branch.
|
|||
|
|
|||
|
Deleting a branch is only possible if it's already fully merged into
|
|||
|
HEAD or its upstream branch. Unless you type `b D', that is. Here be
|
|||
|
dragons...
|
|||
|
|
|||
|
Typing `b v' will list the local and remote branches in a new buffer
|
|||
|
called `*magit-branches*' from which you can work with them. See *note
|
|||
|
The Branch Manager:: for more details.
|
|||
|
|
|||
|
|
|||
|
File: magit.info, Node: The Branch Manager, Next: Wazzup, Prev: Branching, Up: Top
|
|||
|
|
|||
|
15 The Branch Manager
|
|||
|
*********************
|
|||
|
|
|||
|
The Branch Manager is a separate buffer called `*magit-branches*' with
|
|||
|
its own local key map. The buffer contains both local and remote
|
|||
|
branches. The current local branch is marked by a "*" in front of the
|
|||
|
name.
|
|||
|
|
|||
|
To check out a branch, move your cursor to the desired branch and
|
|||
|
press `RET'.
|
|||
|
|
|||
|
Typing `k' will delete the branch in the current line, and `C-u k'
|
|||
|
deletes it even if it hasn't been merged into the current local branch.
|
|||
|
Deleting works for both local and remote branches.
|
|||
|
|
|||
|
By typing `T' on a local branch, you can change which remote branch
|
|||
|
it's set to track.
|
|||
|
|
|||
|
|
|||
|
File: magit.info, Node: Wazzup, Next: Merging, Prev: The Branch Manager, Up: Top
|
|||
|
|
|||
|
16 Wazzup
|
|||
|
*********
|
|||
|
|
|||
|
Typing `w' will show a summary of how your other branches relate to the
|
|||
|
current branch.
|
|||
|
|
|||
|
For each branch, you will get a section that lists the commits in
|
|||
|
that branch that are not in the current branch. The sections are
|
|||
|
initially collapsed; you need to explicitly open them with `TAB' (or
|
|||
|
similar) to show the lists of commits.
|
|||
|
|
|||
|
When point is on a _N unmerged commits in ..._ title, the
|
|||
|
corresponding branch will be offered as the default for a merge.
|
|||
|
|
|||
|
Hitting `i' on a branch title will ignore this branch in the wazzup
|
|||
|
view. You can use `C-u w' to show all branches, including the ignored
|
|||
|
ones. Hitting `i' on an already ignored branch in that view will
|
|||
|
unignore it.
|
|||
|
|
|||
|
|
|||
|
File: magit.info, Node: Merging, Next: Rebasing, Prev: Wazzup, Up: Top
|
|||
|
|
|||
|
17 Merging
|
|||
|
**********
|
|||
|
|
|||
|
Magit offers two ways to merge branches: manual and automatic. A
|
|||
|
manual merge will apply all changes to your working tree and staging
|
|||
|
area, but will not commit them, while an automatic merge will go ahead
|
|||
|
and commit them immediately.
|
|||
|
|
|||
|
Type `m m' to initiate merge.
|
|||
|
|
|||
|
After initiating a merge, the header of the status buffer might
|
|||
|
remind you that the next commit will be a merge commit (with more than
|
|||
|
one parent). If you want to abort a manual merge, just do a hard reset
|
|||
|
to HEAD with `X'.
|
|||
|
|
|||
|
Merges can fail if the two branches you want to merge introduce
|
|||
|
conflicting changes. In that case, the automatic merge stops before the
|
|||
|
commit, essentially falling back to a manual merge. You need to resolve
|
|||
|
the conflicts for example with `e' and stage the resolved files, for
|
|||
|
example with `S'.
|
|||
|
|
|||
|
You can not stage individual hunks one by one as you resolve them,
|
|||
|
you can only stage whole files once all conflicts in them have been
|
|||
|
resolved.
|
|||
|
|
|||
|
|
|||
|
File: magit.info, Node: Rebasing, Next: Interactive Rebasing, Prev: Merging, Up: Top
|
|||
|
|
|||
|
18 Rebasing
|
|||
|
***********
|
|||
|
|
|||
|
Typing `R' in the status buffer will initiate a rebase or, if one is
|
|||
|
already in progress, ask you how to continue.
|
|||
|
|
|||
|
When a rebase is stopped in the middle because of a conflict, the
|
|||
|
header of the status buffer will indicate how far along you are in the
|
|||
|
series of commits that are being replayed. When that happens, you
|
|||
|
should resolve the conflicts and stage everything and hit `R c' to
|
|||
|
continue the rebase. Alternatively, hitting `c' or `C' while in the
|
|||
|
middle of a rebase will also ask you whether to continue the rebase.
|
|||
|
|
|||
|
Of course, you can initiate a rebase in any number of ways, by
|
|||
|
configuring `git pull' to rebase instead of merge, for example. Such a
|
|||
|
rebase can be finished with `R' as well.
|
|||
|
|
|||
|
|
|||
|
File: magit.info, Node: Interactive Rebasing, Next: Rewriting, Prev: Rebasing, Up: Top
|
|||
|
|
|||
|
19 Interactive Rebasing
|
|||
|
***********************
|
|||
|
|
|||
|
Typing `E' in the status buffer will initiate an interactive rebase.
|
|||
|
This is equivalent to running `git rebase --interactive' at the command
|
|||
|
line. The `git-rebase-todo' file will be opened in an Emacs buffer for
|
|||
|
you to edit. This file is opened using `emacsclient', so just edit this
|
|||
|
file as you normally would, then call the `server-edit' function
|
|||
|
(typically bound to `C-x #') to tell Emacs you are finished editing,
|
|||
|
and the rebase will proceed as usual.
|
|||
|
|
|||
|
If you have loaded `rebase-mode.el' (which is included in the Magit
|
|||
|
distribution), the `git-rebase-todo' buffer will be in `rebase-mode'.
|
|||
|
This mode disables normal text editing but instead provides single-key
|
|||
|
commands (shown in the buffer) to perform all the edits that you would
|
|||
|
normally do manually, including changing the operation to be performed
|
|||
|
each commit ("pick", "squash", etc.), deleting (commenting out) commits
|
|||
|
from the list, and reordering commits. You can finish editing the
|
|||
|
buffer and proceed with the rebase by pressing `C-c C-c', which is
|
|||
|
bound to `server-edit' in this mode, and you can abort the rebase with
|
|||
|
`C-c C-k', just like when editing a commit message in Magit.
|
|||
|
|
|||
|
|
|||
|
File: magit.info, Node: Rewriting, Next: Pushing and Pulling, Prev: Interactive Rebasing, Up: Top
|
|||
|
|
|||
|
20 Rewriting
|
|||
|
************
|
|||
|
|
|||
|
As hinted at earlier, you can rewrite your commit history. For
|
|||
|
example, you can reset the current head to an earlier commit with `x'.
|
|||
|
This leaves the working tree unchanged, and the status buffer will show
|
|||
|
all the changes that have been made since that new value of the current
|
|||
|
head. You can commit these changes again, possibly splitting them into
|
|||
|
multiple commits as you go along.
|
|||
|
|
|||
|
Amending your last commit is a common special case of rewriting
|
|||
|
history like this.
|
|||
|
|
|||
|
Another common way to rewrite history is to reset the head to an
|
|||
|
earlier commit, and then to cherry pick the previous commits in a
|
|||
|
different order. You could pick them from the reflog, for example.
|
|||
|
|
|||
|
Magit has several commands that can simplify the book keeping
|
|||
|
associated with rewriting. These commands all start with the `r'
|
|||
|
prefix key.
|
|||
|
|
|||
|
Typing `r b' will start a rewrite operation. You will be prompted
|
|||
|
for a _base_ commit. This commit and all subsequent commits up until
|
|||
|
the current head are then put in a list of _Pending commits_, after
|
|||
|
which the current head will be reset to the _parent_ of the base
|
|||
|
commit. This can be configured to behave like `git rebase', i.e.
|
|||
|
exclude the selected base commit from the rewrite operation, with the
|
|||
|
`magit-rewrite-inclusive' variable.
|
|||
|
|
|||
|
You would then typically use `a' and `A' to cherry pick commits from
|
|||
|
the list of pending commits in the desired order, until all have been
|
|||
|
applied. Magit shows which commits have been applied by changing their
|
|||
|
marker from `*' to `.'.
|
|||
|
|
|||
|
Using `A' will immediately commit the commit (as usual). If you
|
|||
|
want to combine multiple previous commits into a single new one, use
|
|||
|
`a' to apply them all to your working tree, and then commit them
|
|||
|
together.
|
|||
|
|
|||
|
Magit has no explicit support for rewriting merge commits. It will
|
|||
|
happily include merge commits in the list of pending commits, but there
|
|||
|
is no way of replaying them automatically. You have to redo the merge
|
|||
|
explicitly.
|
|||
|
|
|||
|
You can also use `v' to revert a commit when you have changed your
|
|||
|
mind. This will change the `.' mark back to `*'.
|
|||
|
|
|||
|
Once you are done with the rewrite, type `r s' to remove the book
|
|||
|
keeping information from the status buffer.
|
|||
|
|
|||
|
If you rather wish to start over, type `r a'. This will abort the
|
|||
|
rewriting, resetting the current head back to the value it had before
|
|||
|
the rewrite was started with `r b'.
|
|||
|
|
|||
|
Typing `r f' will _finish_ the rewrite: it will apply all unused
|
|||
|
commits one after the other, as if you would us `A' with all of them.
|
|||
|
|
|||
|
You can change the `*' and `.' marks of a pending commit explicitly
|
|||
|
with `r *' and `r .'.
|
|||
|
|
|||
|
In addition to a list of pending commits, the status buffer will show
|
|||
|
the _Pending changes_. This section shows the diff between the
|
|||
|
original head and the current head. You can use it to review the
|
|||
|
changes that you still need to rewrite, and you can apply hunks from
|
|||
|
it, like from any other diff.
|
|||
|
|
|||
|
|
|||
|
File: magit.info, Node: Pushing and Pulling, Next: Bisecting, Prev: Rewriting, Up: Top
|
|||
|
|
|||
|
21 Pushing and Pulling
|
|||
|
**********************
|
|||
|
|
|||
|
Magit will run `git push' when you type `P P'. If you give a prefix
|
|||
|
argument to `P P', you will be prompted for the repository to push to.
|
|||
|
When no default remote repository has been configured yet for the
|
|||
|
current branch, you will be prompted as well. Typing `P P' will only
|
|||
|
push the current branch to the remote. In other words, it will run
|
|||
|
`git push <remote> <branch>'. The branch will be created in the remote
|
|||
|
if it doesn't exist already. The local branch will be configured so
|
|||
|
that it pulls from the new remote branch. If you give a double prefix
|
|||
|
argument to `P P', you will be prompted in addition for the target
|
|||
|
branch to push to. In other words, it will run `git push <remote>
|
|||
|
<branch>:<target>'.
|
|||
|
|
|||
|
Typing `f f' will run `git fetch'. It will prompt for the name of
|
|||
|
the remote to update if there is no default one. Typing `f o' will
|
|||
|
always prompt for the remote. Typing `F F' will run `git pull'. When
|
|||
|
you don't have a default branch configured to be pulled into the
|
|||
|
current one, you will be asked for it.
|
|||
|
|
|||
|
If there is a default remote repository for the current branch, Magit
|
|||
|
will show that repository in the status buffer header.
|
|||
|
|
|||
|
In this case, the status buffer will also have a _Unpushed commits_
|
|||
|
section that shows the commits on your current head that are not in the
|
|||
|
branch named `<remote>/<branch>'. This section works just like the
|
|||
|
history buffer: you can see details about a commit with `RET', compare
|
|||
|
two of them with `.' and `=', and you can reset your current head to
|
|||
|
one of them with `x', for example. If you want to push the changes then
|
|||
|
type `P P'.
|
|||
|
|
|||
|
When the remote branch has changes that are not in the current
|
|||
|
branch, Magit shows them in a section called _Unpulled changes_. Typing
|
|||
|
`F F' will fetch and merge them into the current branch.
|
|||
|
|
|||
|
|
|||
|
File: magit.info, Node: Submodules, Next: Using Magit Extensions, Prev: Bisecting, Up: Top
|
|||
|
|
|||
|
22 Submodules
|
|||
|
*************
|
|||
|
|
|||
|
`M u'
|
|||
|
Update the submodules, with a prefix argument it will initializing.
|
|||
|
|
|||
|
`M i'
|
|||
|
Initialize the submodules.
|
|||
|
|
|||
|
`M b'
|
|||
|
Update and initialize the submodules in one go.
|
|||
|
|
|||
|
`M s'
|
|||
|
Synchronizes submodules' remote URL configuration setting to the
|
|||
|
value specified in .gitmodules.
|
|||
|
|
|||
|
|
|||
|
File: magit.info, Node: Bisecting, Next: Submodules, Prev: Pushing and Pulling, Up: Top
|
|||
|
|
|||
|
23 Bisecting
|
|||
|
************
|
|||
|
|
|||
|
Magit supports bisecting by showing how many revisions and steps are
|
|||
|
left to be tested in the status buffer. You can control the bisect
|
|||
|
session from both the status and from log buffers with the `B' key menu.
|
|||
|
|
|||
|
Typing `B s' will start a bisect session. You will be prompted for
|
|||
|
a revision that is known to be bad (defaults to _HEAD_) and for a
|
|||
|
revision that is known to be good (defaults to the revision at point if
|
|||
|
there is one). git will select a revision for you to test, and Magit
|
|||
|
will update its status buffer accordingly.
|
|||
|
|
|||
|
You can tell git that the current revision is good with `B g', that
|
|||
|
it is bad with `B b' or that git should skip it with `B k'. You can
|
|||
|
also tell git to go into full automatic mode by giving it the name of a
|
|||
|
script to run for each revision to test with `B u'.
|
|||
|
|
|||
|
The current status can be shown as a log with `B l'. It contains the
|
|||
|
revisions that have already been tested and your decisions about their
|
|||
|
state.
|
|||
|
|
|||
|
The revisions left to test can be visualized in gitk with `B v'.
|
|||
|
|
|||
|
When you're finished bisecting you have to reset the session with `B
|
|||
|
r'.
|
|||
|
|
|||
|
|
|||
|
File: magit.info, Node: Using Magit Extensions, Next: Using Git Directly, Prev: Submodules, Up: Top
|
|||
|
|
|||
|
24 Magit Extensions
|
|||
|
*******************
|
|||
|
|
|||
|
* Menu:
|
|||
|
|
|||
|
* Activating extensions::
|
|||
|
* Interfacing with Subversion::
|
|||
|
* Interfacing with Topgit::
|
|||
|
* Interfacing with StGit::
|
|||
|
* Developing Extensions::
|
|||
|
|
|||
|
|
|||
|
File: magit.info, Node: Activating extensions, Next: Interfacing with Subversion, Up: Using Magit Extensions
|
|||
|
|
|||
|
24.1 Activating extensions
|
|||
|
==========================
|
|||
|
|
|||
|
Magit comes with a couple of shipped extensions that allow interaction
|
|||
|
with `git-svn', `topgit' and `stgit'. See following sections for
|
|||
|
specific details on how to use them.
|
|||
|
|
|||
|
Extensions can be activated globally or on a per-repository basis.
|
|||
|
Since those extensions are implemented as minor modes, one can use for
|
|||
|
example `M-x magit-topgit-mode' to toggle the `topgit' extension,
|
|||
|
making the corresponding section and commands (un)available.
|
|||
|
|
|||
|
In order to do that automatically (and for every repository), one can
|
|||
|
use for example:
|
|||
|
|
|||
|
(add-hook 'magit-mode-hook 'turn-on-magit-topgit)
|
|||
|
|
|||
|
Magit also allows configuring different extensions, based on the git
|
|||
|
repository configuration.
|
|||
|
|
|||
|
(add-hook 'magit-mode-hook 'magit-load-config-extensions)
|
|||
|
|
|||
|
This will read git configuration variables and activate the relevant
|
|||
|
extensions.
|
|||
|
|
|||
|
For example, after running the following commands, the `topgit'
|
|||
|
extension will be loaded for every repository, while the `svn' one will
|
|||
|
be loaded only for the current one.
|
|||
|
|
|||
|
$ git config --global --add magit.extension topgit
|
|||
|
$ git config --add magit.extension svn
|
|||
|
|
|||
|
Note the `--add' flag, which means that each extension gets its own
|
|||
|
line in the `config' file.
|
|||
|
|
|||
|
|
|||
|
File: magit.info, Node: Interfacing with Subversion, Next: Interfacing with Topgit, Prev: Activating extensions, Up: Using Magit Extensions
|
|||
|
|
|||
|
24.2 Interfacing with Subversion
|
|||
|
================================
|
|||
|
|
|||
|
Typing `N r' runs `git svn rebase', typing `N c' runs `git svn dcommit'
|
|||
|
and typing `N f' runs `git svn fetch'.
|
|||
|
|
|||
|
`N s' will prompt you for a (numeric, Subversion) revision and then
|
|||
|
search for a corresponding Git sha1 for the commit. This is limited to
|
|||
|
the path of the remote Subversion repository. With a prefix (`C-u N s'
|
|||
|
the user will also be prompted for a branch to search in.
|
|||
|
|
|||
|
|
|||
|
File: magit.info, Node: Interfacing with Topgit, Next: Interfacing with StGit, Prev: Interfacing with Subversion, Up: Using Magit Extensions
|
|||
|
|
|||
|
24.3 Interfacing with Topgit
|
|||
|
============================
|
|||
|
|
|||
|
Topgit (http://repo.or.cz/r/topgit.git) is a patch queue manager that
|
|||
|
aims at being close as possible to raw Git, which makes it easy to use
|
|||
|
with Magit. In particular, it does not require to use a different set of
|
|||
|
commands for "commit", "update",… operations.
|
|||
|
|
|||
|
`magit-topgit.el' provides basic integration with Magit, mostly by
|
|||
|
providing a "Topics" section.
|
|||
|
|
|||
|
Topgit branches can be created the regular way, by using a "t/"
|
|||
|
prefix by convention. So, creating a "t/foo" branch will actually
|
|||
|
populate the "Topics" section with one more branch after committing
|
|||
|
`.topdeps' and `.topmsg'.
|
|||
|
|
|||
|
Also, the way we pull (see *note Pushing and Pulling::) such a
|
|||
|
branch is slightly different, since it requires updating the various
|
|||
|
dependencies of that branch. This should be mostly transparent, except
|
|||
|
in case of conflicts.
|
|||
|
|
|||
|
|
|||
|
File: magit.info, Node: Interfacing with StGit, Next: Developing Extensions, Prev: Interfacing with Topgit, Up: Using Magit Extensions
|
|||
|
|
|||
|
24.4 Interfacing with StGit
|
|||
|
===========================
|
|||
|
|
|||
|
StGit (http://www.procode.org/stgit) is a Python application providing
|
|||
|
similar functionality to Quilt (i.e. pushing/popping patches to/from a
|
|||
|
stack) on top of Git. These operations are performed using Git commands
|
|||
|
and the patches are stored as Git commit objects, allowing easy merging
|
|||
|
of the StGit patches into other repositories using standard Git
|
|||
|
functionality.
|
|||
|
|
|||
|
`magit-stgit.el' provides basic integration with Magit, mostly by
|
|||
|
providing a "Series" section, whose patches can be seen as regular
|
|||
|
commits through the "visit" action.
|
|||
|
|
|||
|
You can change the current patch in a series with the "apply" action,
|
|||
|
as well as you can delete them using the "discard" action.
|
|||
|
|
|||
|
Additionally, the `magit-stgit-refresh' and `magit-stgit-rebase'
|
|||
|
commands let you perform the respective StGit operations.
|
|||
|
|
|||
|
|
|||
|
File: magit.info, Node: Developing Extensions, Prev: Interfacing with StGit, Up: Using Magit Extensions
|
|||
|
|
|||
|
24.5 Developing Extensions
|
|||
|
==========================
|
|||
|
|
|||
|
Magit provides a generic mechanism to allow cooperation with Git-related
|
|||
|
systems, such as foreign VCS, patch systems,…
|
|||
|
|
|||
|
In particular it allows to:
|
|||
|
|
|||
|
* Define sections to display specific informations about the current
|
|||
|
state of the repository, and place them relatively to existing
|
|||
|
sections.
|
|||
|
|
|||
|
`magit-define-inserter' automagically defines two hooks called
|
|||
|
`magit-before-insert-SECTION-hook' and
|
|||
|
`magit-after-insert-SECTION-hook' that allow to generate and place
|
|||
|
more sections.
|
|||
|
|
|||
|
In the following example, we use the builtin "stashes" section to
|
|||
|
place our own "foo" one.
|
|||
|
|
|||
|
(magit-define-inserter foo ()
|
|||
|
(magit-git-section 'foo
|
|||
|
"Foo:" 'foo-wash-function
|
|||
|
"foo" "arg1" "arg2"))
|
|||
|
(add-hook 'magit-after-insert-stashes-hook 'magit-insert-foo)
|
|||
|
|
|||
|
* Define new types of objects in those sections.
|
|||
|
|
|||
|
The function `foo-wash-function' defined above post-processes each
|
|||
|
line of the output of the "git foo arg1 arg2" command, and is able
|
|||
|
to associate a type to certain lines.
|
|||
|
|
|||
|
A simple implementation could be:
|
|||
|
|
|||
|
(defun foo-wash-function ()
|
|||
|
(let ((foo (buffer-substring (line-beginning-position) (line-end-position))))
|
|||
|
(goto-char (line-beginning-position))
|
|||
|
(magit-with-section foo 'foo
|
|||
|
(magit-set-section-info foo)
|
|||
|
(forward-line))))
|
|||
|
|
|||
|
In this case, every line of the command output is transformed into
|
|||
|
an object of type `'foo'.
|
|||
|
|
|||
|
* Alter behavior of generic commands to dispatch them correctly to
|
|||
|
the relevant system, optionally making use of the newly defined
|
|||
|
types.
|
|||
|
|
|||
|
(magit-add-action (item info "discard")
|
|||
|
((foo)
|
|||
|
(do-something-meaningful-for-discarding-a-foo)))
|
|||
|
|
|||
|
This will alter the behavior of `k', when applied to those objects.
|
|||
|
|
|||
|
* Plug a different logic into basic commands, to reflect the
|
|||
|
presence of the extension.
|
|||
|
|
|||
|
`magit-define-command' automagically defines a
|
|||
|
`magit-CMD-command-hook' that can contain a list of functions to
|
|||
|
call before the actual core code. Execution stops after the first
|
|||
|
hook that returns a non-nil value. This leaves room for extension
|
|||
|
logic.
|
|||
|
|
|||
|
(add-hook 'magit-create-branch-command-hook 'foo-create-branch)
|
|||
|
|
|||
|
The function `foo-create-branch' will be called each time an
|
|||
|
attempt is made to create a branch, and can, for example, react to
|
|||
|
a certain name convention.
|
|||
|
|
|||
|
* Define new commands and associated menu.
|
|||
|
|
|||
|
This part is not really specific to extensions, except that menus
|
|||
|
take place in the "Extensions" submenu.
|
|||
|
|
|||
|
|
|||
|
It is suggested that Magit extensions authors stick to the
|
|||
|
convention of making extensions minor modes. This has many advantages,
|
|||
|
including the fact that users are able to toggle extensions, and that
|
|||
|
it's easy to configure a specific set of extensions for a given
|
|||
|
repository.
|
|||
|
|
|||
|
Shipped extensions can serve as an example of how to develop new
|
|||
|
extensions.
|
|||
|
|
|||
|
Basically a `foo' extension should provide a `magit-foo-mode' minor
|
|||
|
mode, as well as a `turn-on-magit-foo' function. The main task of the
|
|||
|
minor mode is to register/unregister the various hooks that the
|
|||
|
extension requires. The registered actions on the other hand can be
|
|||
|
left alone and activated globally, since they can be run only on
|
|||
|
displayed items, which won't happen when the minor mode is off.
|
|||
|
|
|||
|
Don't forget to call `magit-refresh' when the minor mode is toggled
|
|||
|
interactively, so that the relevant sections can be shown or hidden.
|
|||
|
|
|||
|
|
|||
|
File: magit.info, Node: Using Git Directly, Next: Customization, Prev: Using Magit Extensions, Up: Top
|
|||
|
|
|||
|
25 Using Git Directly
|
|||
|
*********************
|
|||
|
|
|||
|
For situations when Magit doesn't do everything you need, you can run
|
|||
|
raw Git commands using `:'. This will prompt for a Git command, run
|
|||
|
it, and refresh the status buffer. The output can be viewed by typing
|
|||
|
`$'.
|
|||
|
|
|||
|
|
|||
|
File: magit.info, Node: Customization, Next: Frequently Asked Questions, Prev: Using Git Directly, Up: Top
|
|||
|
|
|||
|
26 Customization
|
|||
|
****************
|
|||
|
|
|||
|
The following variables can be used to adapt Magit to your workflow:
|
|||
|
|
|||
|
`magit-git-executable'
|
|||
|
The name of the Git executable.
|
|||
|
|
|||
|
`magit-git-standard-options'
|
|||
|
Standard options when running Git.
|
|||
|
|
|||
|
`magit-repo-dirs'
|
|||
|
Directories containing Git repositories.
|
|||
|
|
|||
|
Magit will look into these directories for Git repositories and
|
|||
|
offer them as choices for `magit-status'.
|
|||
|
|
|||
|
`magit-repo-dirs-depth'
|
|||
|
The maximum depth to look for Git repos.
|
|||
|
|
|||
|
When looking for a Git repository below the directories in
|
|||
|
`magit-repo-dirs', Magit will only descend this many levels deep.
|
|||
|
|
|||
|
`magit-save-some-buffers'
|
|||
|
Non-nil means that `magit-status' will save modified buffers
|
|||
|
before running. Setting this to `t' will ask which buffers to
|
|||
|
save, setting it to `'dontask' will save all modified buffers
|
|||
|
without asking.
|
|||
|
|
|||
|
`magit-save-some-buffers-predicate'
|
|||
|
Specifies a predicate function on `magit-save-some-buffers' to
|
|||
|
determine which unsaved buffers should be prompted for saving.
|
|||
|
|
|||
|
`magit-commit-all-when-nothing-staged'
|
|||
|
Determines what `magit-log-edit' does when nothing is staged.
|
|||
|
Setting this to `nil' will make it do nothing, setting it to `t'
|
|||
|
will arrange things so that the actual commit command will use the
|
|||
|
`--all' option, setting it to `'ask' will first ask for
|
|||
|
confirmation whether to do this, and setting it to `'ask-stage'
|
|||
|
will cause all changes to be staged, after a confirmation.
|
|||
|
|
|||
|
`magit-commit-signoff'
|
|||
|
When performing `git commit' adds `--signoff'.
|
|||
|
|
|||
|
`magit-log-cutoff-length'
|
|||
|
The maximum number of commits to show in the `log' and `whazzup'
|
|||
|
buffers.
|
|||
|
|
|||
|
`magit-log-infinite-length'
|
|||
|
Number of log used to show as maximum for
|
|||
|
`magit-log-cutoff-length'.
|
|||
|
|
|||
|
`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-next-section'.
|
|||
|
|
|||
|
`magit-process-popup-time'
|
|||
|
Popup the process buffer if a command takes longer than this many
|
|||
|
seconds.
|
|||
|
|
|||
|
`magit-revert-item-confirm'
|
|||
|
Require acknowledgment before reverting an item.
|
|||
|
|
|||
|
`magit-log-edit-confirm-cancellation'
|
|||
|
Require acknowledgment before canceling the log edit buffer.
|
|||
|
|
|||
|
`magit-remote-ref-format'
|
|||
|
What format to use for autocompleting refs, in pariticular for
|
|||
|
remotes.
|
|||
|
|
|||
|
Autocompletion is used by functions like `magit-checkout',
|
|||
|
`magit-interactive-rebase' and others which offer branch name
|
|||
|
completion.
|
|||
|
|
|||
|
The value `'name-then-remote' means remotes will be of the form
|
|||
|
`name (remote)', while the value `'remote-slash-name' means that
|
|||
|
they'll be of the form `remote/name'. I.e. something that's listed
|
|||
|
as `remotes/upstream/next' by `git branch -l -a' will be
|
|||
|
`upstream/next'.
|
|||
|
|
|||
|
`magit-process-connection-type'
|
|||
|
Connection type used for the git process.
|
|||
|
|
|||
|
`nil' mean pipe, it is usually faster and more efficient, and work
|
|||
|
on cygwin. `t' mean pty, it enable magit to prompt for passphrase
|
|||
|
when needed.
|
|||
|
|
|||
|
`magit-completing-read-function'
|
|||
|
Function to be called when requesting input from the user.
|
|||
|
|
|||
|
`magit-create-branch-behaviour'
|
|||
|
Where magit will create a new branch if not supplied a branchname
|
|||
|
or ref.
|
|||
|
|
|||
|
The value `'at-head' means a new branch will be created at the tip
|
|||
|
of your current branch, while the value `'at-point' means magit
|
|||
|
will try to find a valid reference at point...
|
|||
|
|
|||
|
`magit-status-buffer-switch-function'
|
|||
|
Function for `magit-status' to use for switching to the status
|
|||
|
buffer.
|
|||
|
|
|||
|
The function is given one argument, the status buffer.
|
|||
|
|
|||
|
`magit-rewrite-inclusive'
|
|||
|
Whether magit includes the selected base commit in a rewrite
|
|||
|
operation.
|
|||
|
|
|||
|
`t' means both the selected commit as well as any subsequent
|
|||
|
commits will be rewritten. This is magit's default behaviour,
|
|||
|
equivalent to `git rebase -i ${REV~1}'
|
|||
|
|
|||
|
A'---B'---C'---D'
|
|||
|
^
|
|||
|
|
|||
|
`nil' means the selected commit will be literally used as `base',
|
|||
|
so only subsequent commits will be rewritten. This is consistent
|
|||
|
with git-rebase, equivalent to `git rebase -i ${REV}', yet more
|
|||
|
cumbersome to use from the status buffer.
|
|||
|
|
|||
|
A---B'---C'---D'
|
|||
|
^
|
|||
|
|
|||
|
`magit-topgit-executable'
|
|||
|
The name of the TopGit executable.
|
|||
|
|
|||
|
`magit-topgit-branch-prefix'
|
|||
|
Convention prefix for topic branch creation.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
File: magit.info, Node: Frequently Asked Questions, Prev: Customization, Up: Top
|
|||
|
|
|||
|
27 Frequently Asked Questions
|
|||
|
*****************************
|
|||
|
|
|||
|
* Menu:
|
|||
|
|
|||
|
* FAQ - Changes::
|
|||
|
* FAQ 1 - Troubleshooting::
|
|||
|
* FAQ 2 - Display issues::
|
|||
|
|
|||
|
|
|||
|
File: magit.info, Node: FAQ - Changes, Next: FAQ 1 - Troubleshooting, Up: Frequently Asked Questions
|
|||
|
|
|||
|
27.1 Changes
|
|||
|
============
|
|||
|
|
|||
|
* v1.1: Changed the way extensions work. Previously, they were
|
|||
|
enabled unconditionally once the library was loaded. Now they are
|
|||
|
minor modes that need to be activated explicitly (potentially on a
|
|||
|
per-repository basis). See *note Activating extensions::.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
File: magit.info, Node: FAQ 1 - Troubleshooting, Next: FAQ 2 - Display issues, Prev: FAQ - Changes, Up: Frequently Asked Questions
|
|||
|
|
|||
|
27.2 Troubleshooting
|
|||
|
====================
|
|||
|
|
|||
|
* Menu:
|
|||
|
|
|||
|
* FAQ 1-1:: How do I get raw error messages from git?
|
|||
|
|
|||
|
|
|||
|
File: magit.info, Node: FAQ 1-1, Up: FAQ 1 - Troubleshooting
|
|||
|
|
|||
|
27.2.1 Question 1.1
|
|||
|
-------------------
|
|||
|
|
|||
|
How do I get raw error messages from git?
|
|||
|
|
|||
|
Answer
|
|||
|
......
|
|||
|
|
|||
|
If a command goes wrong, you can hit `$' to access the git process
|
|||
|
buffer. There, the entire trace for the latest operation is available.
|
|||
|
|
|||
|
|
|||
|
File: magit.info, Node: FAQ 2 - Display issues, Prev: FAQ 1 - Troubleshooting, Up: Frequently Asked Questions
|
|||
|
|
|||
|
27.3 Display issues
|
|||
|
===================
|
|||
|
|
|||
|
* Menu:
|
|||
|
|
|||
|
* FAQ 2-1:: How do I fix international characters display?
|
|||
|
|
|||
|
|
|||
|
File: magit.info, Node: FAQ 2-1, Up: FAQ 2 - Display issues
|
|||
|
|
|||
|
27.3.1 Question 2.1
|
|||
|
-------------------
|
|||
|
|
|||
|
How do I fix international characters display?
|
|||
|
|
|||
|
Answer
|
|||
|
......
|
|||
|
|
|||
|
Please make sure your Magit buffer uses a compatible coding system. In
|
|||
|
the particular case of file names, git itself quotes them by default.
|
|||
|
You can disable this with one of the following approaches:
|
|||
|
|
|||
|
$ git config core.quotepath false
|
|||
|
|
|||
|
or
|
|||
|
|
|||
|
(setq magit-git-standard-options (append magit-git-standard-options
|
|||
|
'("-c" "core.quotepath=false")))
|
|||
|
|
|||
|
The latter might not work in old versions of git.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Tag Table:
|
|||
|
Node: Top640
|
|||
|
Node: Introduction1593
|
|||
|
Node: Acknowledgments3065
|
|||
|
Node: Sections3745
|
|||
|
Node: Status6295
|
|||
|
Node: Untracked files9034
|
|||
|
Node: Staging and Committing10238
|
|||
|
Node: History14136
|
|||
|
Node: Reflogs17316
|
|||
|
Node: Commit Buffer17720
|
|||
|
Node: Diffing19046
|
|||
|
Node: Tagging20033
|
|||
|
Node: Resetting20482
|
|||
|
Node: Stashing22006
|
|||
|
Node: Branching23064
|
|||
|
Node: The Branch Manager24442
|
|||
|
Node: Wazzup25158
|
|||
|
Node: Merging25949
|
|||
|
Node: Rebasing26999
|
|||
|
Node: Interactive Rebasing27825
|
|||
|
Node: Rewriting29117
|
|||
|
Node: Pushing and Pulling32142
|
|||
|
Node: Submodules34069
|
|||
|
Node: Bisecting34489
|
|||
|
Node: Using Magit Extensions35704
|
|||
|
Node: Activating extensions36001
|
|||
|
Node: Interfacing with Subversion37385
|
|||
|
Node: Interfacing with Topgit37983
|
|||
|
Node: Interfacing with StGit39011
|
|||
|
Node: Developing Extensions40009
|
|||
|
Node: Using Git Directly43787
|
|||
|
Node: Customization44158
|
|||
|
Node: Frequently Asked Questions48702
|
|||
|
Node: FAQ - Changes48933
|
|||
|
Node: FAQ 1 - Troubleshooting49341
|
|||
|
Node: FAQ 1-149589
|
|||
|
Node: FAQ 2 - Display issues49893
|
|||
|
Node: FAQ 2-150122
|
|||
|
|
|||
|
End Tag Table
|
|||
|
|
|||
|
|
|||
|
Local Variables:
|
|||
|
coding: utf-8
|
|||
|
End:
|