emacsのmagitパッケージの使い方

magitの使い方をまとめておきます。


1 magitとは

emacs上でgitクライアントの操作を可能にするelispパッケージです。

emacsを使ったままブランチを切り替えたり、コミットしたりすることができます。

2 magitのインストール方法

emacs24ではpackage-list-packagesコマンドでインストールします。

gnuのリポジトリにないので.emacsにmarmaladeのリポジトリを追加します。

;; repository for package-list-packages
(require 'package)
(add-to-list 'package-archives
             '("marmalade" .
               "http://marmalade-repo.org/packages/"))
(package-initialize)

M-x package-list-packagesと入力してmagitを選択します。

macrostep          0.8          available  interactive macro stepper for Emacs Lisp
mactag             0.0.1        available  Mode for automatically handle multiple tags files with Mactag rubygem
magit              2.2.1        available  A Git porcelain inside Emacs
magit-find-file    1.0.4        available  completing-read over all files in Git
magit-gh-pulls     0.3          available  GitHub pull requests extension for Magit

3 .emacsの設定

package-list-packagesコマンドでパッケージをインストールした場合はrequreの追記は不要です。

magit-statusコマンドのショートカットのみを追加します。

C-x gをショートカットにします(Ctrl + xを押してからgを押す)。

;; magit
(global-set-key (kbd "C-x g") 'magit-status)

3.1 256色でない環境でのdiffの色を変更

GNU Screenを使っている場合、TERM変数がscreenとなり8色表示となります。

magitは256色前提で作られている為、diffが大変見づらいです。

.screenrcでtermを256色のものに変えても良いのですが、私は以下を.emacsに追加しています。

(custom-set-faces
 '(magit-diff-added ((t (:background "black" :foreground "green"))))
 '(magit-diff-added-highlight ((t (:background "white" :foreground "green"))))
 '(magit-diff-removed ((t (:background "black" :foreground "blue"))))
 '(magit-diff-removed-highlight ((t (:background "white" :foreground "blue"))))
 '(magit-hash ((t (:foreground "red"))))
)

M-x customizeでmagitを検索して、色を変更してC−xキーC-sキーでセーブすれば、.emacsに反映されます。

4 magit-statusコマンド

git cloneしたディレクトリでemacsを起動します。

C-x gでmagit-statusコマンドを呼び出すと以下のようなバッファに切り替わります。

Remote:   master @ origin (ssh://acer//home/hiroom2/repo/test.git)
Local:    master ~/tmp/test/
Head:     23f6e53 Add new file with multiple line commit message. refs #0 Hello, World

以降で使用するショートカットはmagit-statusコマンド等のバッファ上で実行する必要があります。

一度ソースコードの編集バッファに移った場合はmagit関連のバッファに戻るか、C-x gでmagit-statusを呼び出す必要があります。

5 ブランチの操作

bキーを押すとブランチ操作のバッファが開きます。

Actions
v: Branch manager    c: Create            r: Rename
k: Delete            b: Checkout

bキー vキーを押すことでブランチの一覧が表示されます。

Local:
23f6e53 # master [@ origin]

origin (ssh://acer//home/hiroom2/repo/test.git):
          HEAD -> master
23f6e53   master

bキー cキーを押すことでブランチを作成できます。

testというブランチ名にします。

Create branch: test

masterから派生したものにします。

Parent (default master): master

別途anythingパッケージを入れておくことで入力を選択形式で選ぶことができます。

もう一度bキー vキーを押すとtestというブランチが追加されたことがわかります。masterにカーソルを合わせてEnterキーを押すことでmasterブランチに戻すこともできます。

Local:
23f6e53   master [@ origin]
23f6e53 # test

origin (ssh://acer//home/hiroom2/repo/test.git):
          HEAD -> master
23f6e53   master

bキー kキーを押すことでブランチを削除できます。

Branch to delete: test

testブランチでマージされていないコミットがある場合は以下のエラーが出て削除に失敗します。マージするかコミットを削除してください。

The branch 'test' is not fully merged. ... [Hit $ or see
buffer *magit-process* for details]

6 変更の操作

6.1 変更の種類

変更がある時にmagit-statusコマンドを実行すると変更があるファイルの一覧をみることができます。

Local:    test ~/tmp/test/
Head:     23f6e53 Add new file with multiple line commit message. refs #0 Hello, World

Changes:
  Modified   hello.txt

Changes等の分類は以下の意味を持ちます。

 

Untracked files 新規作成されたファイル
Changes 変更があるファイル
Staged changes git addされた変更
Unstaged changes git addされた後に変更があるファイル

 

ファイルにカーソルを合わせた状態で以下のキーを押すことで変更を管理できます。

 

sキー Staged changesに移動
uキー ChangedとUntracked filesに移動
vキー 変更を破棄

 

vキーによる変更の破棄については、Changesにあるファイルに対してのみ実行できます。つまりStaged ChangesにあるファイルはChangesに戻してから破棄させる必要があります。

6.2 一度Staged Changesに移動したファイルに対する変更

Staged Changesに移動したファイルに対して、さらに変更を加えると以下の状態になります。

Local:    test ~/tmp/test/
Head:     23f6e53 Add new file with multiple line commit message. refs #0 Hello, World

Untracked files:
  a

Unstaged changes:
  Modified   hello.txt

Staged changes:
  Modified   hello.txt

Unstaged changesのファイルに合わせてsキーを押すことで変更のすべてをStaged changesに含めることができます。

6.3 インライン展開

Changes等に表示されているファイルにカーソルを合わせた状態でTABキーを押すことでインライン展開の操作ができます。以下はStaged changesにあるファイルをインライン展開した状態です。

Local:    test ~/tmp/test/
Head:     23f6e53 Add new file with multiple line commit message. refs #0 Hello, World

Untracked files:
  a

Staged changes:
  Modified   hello.txt
diff --git a/hello.txt b/hello.txt
index ce01362..640bb73 100644
--- a/hello.txt
+++ b/hello.txt
@@ -1 +1,3 @@
 hello
+hello
+hello

インライン展開された変更にカーソルを合わせることで細かい変更管理が実行できます。

"@@ -数字 +数字 @@"で区分けされた変更の単位に対してsキー、uキー、vキーの操作ができます。

Local:    test ~/tmp/test/
Head:     23f6e53 Add new file with multiple line commit message. refs #0 Hello, World

Untracked files:
  a

Unstaged changes:
  Modified   number.txt
diff --git a/number.txt b/number.txt
index 190423f..ec08a2d 100644
--- a/number.txt
+++ b/number.txt
@@ -8,6 +8,7 @@
 8
 9
 10
+10.5
 11
 12
 13
@@ -68,6 +69,7 @@
 68
 69
 70
+70.5
 71
 72
 73

Staged changes:
  Modified   hello.txt
  New        number.txt

7 コミット

Staged changesにファイルを移動した後にcキー cキーを押すことでmagit-diffバッファが開きます。

ここでコミットのパッチを確認できます。

さらにcキーを押すことでコミットログの編集画面に以降します。

C-cキー C-cキーで決定するとコミットが反映されます。

8 コミットログの確認

lキー lキーを押すことでコミットログを確認するmagit-logバッファが表示されます。

Commits in HEAD
068a878 * test Modify hello text
23f6e53 * origin/master master Add new file with multiple line commit message. refs #0 Hello, World
4b53240 * Initial commit refs #0

リモートのmasterブランチであるorigin/master、ローカルのmasterブランチであるmaster、ローカルに新規作成したブランチであるtestがログの前に表示されます。

9 マージ

testブランチの変更をmasterブランチにマージします。bキー vキーでmasterブランチに切り替えます。

Local:
23f6e53 # master [@ origin]
068a878   test

origin (ssh://acer//home/hiroom2/repo/test.git):
          HEAD -> master
23f6e53   master

mキー mキーを押してマージ元となるブランチを指定します。

Merge: test

lキー lキーでコミットログを確認するとmasterの位置が先ほどと変わっており、コミットがマージされたことがわかります。

Commits in HEAD
068a878 * test master Modify hello text
23f6e53 * origin/master Add new file with multiple line commit message. refs #0 Hello, World
4b53240 * Initial commit refs #0

10 プッシュ

masterブランチをリモートのorigin/masterにプッシュします。masterブランチに切り替えた状態でPキー Pキーを押します。

Commits in HEAD
068a878 * origin/master test master Modify hello text
23f6e53 * Add new file with multiple line commit message. refs #0 Hello, World
4b53240 * Initial commit refs #0

新規に作成したブランチをプッシュする場合はそのブランチに切り替えてプッシュします。

11 プル

Fキー Fキーでリモートから変更をプルします。fetchが必要な場合はfキー aキーでfetchします。