Emacs
Git
magit

[Emacs] magitチュートリアル

More than 1 year has passed since last update.

はじめに

magitはEmacsからgitリポジトリの操作ができるツール。
一度慣れたらあまりの便利さに手放せなくなるのだが、少しとっつきにくいところもある。
そこで、Emacs,git共に少し触れる程度の人を対象にチュートリアルを作成してみた。

インストールについて

標準のパッケージマネージャを使用している場合は、M-x package-list-packagesでパッケージリストを出し、

magit_inst1.png

magitにカーソルを合わせてiキーを押しマークをつけて

magit_inst2.png

xキーでインストールできる。

標準以外のパッケージマネージャ(Cask, el-get等)を使っている人は各マネージャの方法に従ってほしい。

リポジトリ作成

以下$HOME/magit_tutで作業をする。
($ mkdir $HOME/magit_tut、またはEmacs上ならdiredで+キーでディレクトリ作る)

リポジトリ作成(git init)を行う場合M-x magit-initを実行すれば良い

magit_tut2.png

以下のように出れば作成完了
magit_tut3.png

magitへの入り口

M-x magit-statusが通常magitへの入り口となる。以下のキーバインドを設定しておくと便利

init.el
(global-set-key (kbd "C-x g") 'magit-status)

?から始める

magit-statusで?キーを押すとコマンド一覧が出るので「迷ったらまず?」を覚えておくとよい。

magit_tut4.png

各モードに入るには、カーソルを合わせてEnterでも良いが、例えばCyerry-Pickingならshift + aを押すだけで良い

コミットしてみる

$HOME/magit_tut/test.txtを開いて以下の入力を行う

$HOME/magit_tut/test.txt
A

保存した後magit-statusを開くと

magit_tut5.png

このように出るのでtest.txtにカーソルを合わせてsを押すことでstagingする。

magit_tut6.png

この状態でcを押すとコミットモードとなる。

magit_tut7.png

さらにcを押してstagingしたものをコミットする。このときコミットメッセージの入力画面が出る。

magit_tut8.png

コミットメッセージを入力しC-c C-cでコミット完了。

コミットログを見る

$HOME/magit_tut/test.txtを以下のように編集し、同様にコミットした後コミットログを見てみる。

$HOME/magit_tut/test.txt
A
B

magit-statusでlを押すとログモードとなる。

magit_tut9.png

いくつか種類があるが、ここではbを選択する。以下のようにコミットログが表示される(qキーを押せばmagit-statusに戻る)

magit_tut10.png

コミットにカーソルを合わせてEnterを押せばそのコミットでの変更点を見ることができる(ログに戻るときはqキー)

magit_tut11.png

ブランチを作成する

現在のmasterからブランチを作成してみる。

magit-statusでbキーを押し、ブランチモードにする。

magit_tut12.png

今回はブランチを作って、そのブランチをチェックアウトするのでc(Checkout new branch)を選択する。
ミニバッファでブランチ元を聞かれるが、今回はmasterをブランチ元とするのでそのままEnter

magit_tut13.png

次に新しく作るブランチ名を聞かれるので、入力してEnter

magit_tut14.png

magit-statusの先頭を見ると新しいブランチになったことがわかる。

magit_tut15.png

マージする

ブランチbr_from_B上でtest.txtを編集、コミットする

$HOME/magit_tut/test.txt
A
B
C

コミットログ(l b)をみるとこうなっているはず

magit_tut16.png

この状態からmasterにbr_from_Bをマージしてみる。

まずはmasterをチェックアウトするため、magit-statusでbでブランチモードにする。

magit_tut17.png

bを押して、masterをチェックアウト(ここではそのままEnter
magit_tut18.png

magit-statusの先頭をみてmasterになっていることを確認したら、mを押してマージモードへ

magit_tut19.png

mキーを押すと、マージするブランチを聞かれるのでbr_from_Bを指定(ここでは単純にEnter)
magit_tut20.png

コンフリクト等が起きなけえればこれでマージ完了。ログを見るとマージできていることがわかる。
magit_tut21.png

プッシュする

ここまでをgithubにプッシュしてみる。

リモートの追加もEmacs上で可能だが、あまり頻繁に行うものでもないので、今回はシェル上で行ってしまう。
github上にmagit_tutというリポジトリを作成して、originとして追加する。

$ git remote add origin https://github.com/<あなたのアカウント>/magit_tut.git

Emacs上のmagit-statusに戻りShift+pを押してプッシュモードに入る
magit_tut22.png

uを押してプッシュ先にorigin/masterを指定する。

magit_tut23.png

magit-statusの先頭がこのようになればOK

magit_tut24.png

なお、u(upstream指定)でプッシュしたので、次回からプッシュモードはこのようになり、uを指定すれば即座にプッシュされる

magit_tut25.png

ログからのブランチ作成

magitではコミットログ画面からコミットを指定してブランチを作成することもできる。

magit-statusからl bでコミットログを表示して「add A」にカーソルを合わせる

magit_tut26.png

以前ブランチを作った時と同じようにb cと押すとブランチ元に選択したコミットが入った状態でミニバッファが表示されるのでそのままEnter

magit_tut27.png

ブランチ名はbr_from_Aとする

magit_tut28.png

これでブランチが作成された。

マージコンフリクトに対処する

ブランチbr_from_Aにいる状態でファイルを編集してコミットする。(コミットメッセージは「add D」)

$HOME/magit_tut/test.txt
A
D

masterへ戻りbr_from_Aをマージしてみる。
bでブランチモードに入り、bでmasterをチェックアウト。
前回同様にm mでbr_from_Aを指定してマージを実行してみる。

コンフリクトした。
magit_tut29.png

「unmerged test.txt」でEnterを押すと編集画面となる。

magit_tut30.png

以下のように編集して保存。

$HOME/magit_tut/test.txt
A
B
C
D

magit-statusを表示させ、「unmerged test.txt」でsを押してstagingする。

magit_tut31.png

あとは通常コミット時と同様にc cでコミットメッセージ入力画面にしてC-c C-cでコミット実行
magit_tut32.png

コミットログ(l b)でマージされていることが確認できる。

magit_tut33.png

編集の一部をコミット

masterで作業を続ける。
ファイルを以下のように編集する

$HOME/magit_tut/test.txt
A
HOGE
FUGA
B
C
D
E

magit-statusを表示し「modified test.txt」にカーソルを合わせTabを押すと以下のように表示される

magit_tut34.png

「+E」の部分にカーソルを合わせCtrl+Spaceを押し「+E」だけを選択した状態でsを押すとそこだけstagingすることができる。

magit_tut35.png

この状態でコミットすれば「E」の追加だけをコミットすることが可能となる。

編集の一部をUndo

上記の状態で同様にkbd>Ctrl+Spaceで「+FUGA」を選択しkを押すことでその部分をUndoできる。
magit_tut36.png

元に戻せない(注意!)ので本当に消してよいかミニバッファで質問される。

magit_tut37.png

yを入力すればUndoされる。

magit_tut38.png

また「modified test.txt」にカーソルを合わせてkキーでファイルの変更全体をUndoできる。
これも元には戻せないため、ミニバッファに警告が出る。

magit_tut39.png

yを押して変更を取り消す

ここまでをプッシュ

Shift+p uでここまでをプッシュしておく

プルの準備

github側でファイルの編集をおこなう。
githubでtest.txtを表示して右上の鉛筆マークでファイルが編集できるので最終行に「F」を追加してコミットする。

magit_tut40.png

↓↓↓↓

magit_tut41.png

フェッチ/プルする

フェッチする

fでフェッチモードに入る

magit_tut42.png

aで全てのリモートからフェッチを行ってくれる

magit_tut43.png

githubでの変更点がフェッチされているのがわかる。この時点ではmasterに反映はされていない。

プルする

origin/masterをmasterにマージしても良いが、ここではプルしてみる。なお、フェッチせずいきなりプルしても問題はない。

Shift+fでプルモードに入る

magit_tut44.png

uでorigin/masterからプルする

magit_tut45.png

githubでの変更分が反映された。

おわりに

必要最小限のmagitの機能説明はできたと思う。
magitには他にも便利な機能がたくさんあるため、ぜひ使いこなしていって欲しい。