magitの使い方をまとめておきます。
Table of Contents
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します。