[Emacs] magitチュートリアル


# はじめに

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

# インストールについて

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

![magit_inst1.png](https://qiita-image-store.s3.amazonaws.com/0/39647/e74cbf78-f640-f88c-6acd-2db97a751d8d.png)

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

![magit_inst2.png](https://qiita-image-store.s3.amazonaws.com/0/39647/4b035e31-7c05-732e-8adc-4243179d7675.png)

<kbd>x</kbd>キーでインストールできる。

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

# リポジトリ作成

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

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


![magit_tut2.png](https://qiita-image-store.s3.amazonaws.com/0/39647/33a45d3d-f6ad-4e79-5b02-308173960913.png)

以下のように出れば作成完了
![magit_tut3.png](https://qiita-image-store.s3.amazonaws.com/0/39647/e746925e-5036-e0f0-b74b-636c5547229f.png)

# magitへの入り口

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

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

# <kbd>?</kbd>から始める

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

![magit_tut4.png](https://qiita-image-store.s3.amazonaws.com/0/39647/354ed1ff-0c14-4545-e813-fc5f20ac2764.png)

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

# コミットしてみる

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

```:$HOME/magit_tut/test.txt
A
```

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

![magit_tut5.png](https://qiita-image-store.s3.amazonaws.com/0/39647/da455768-2992-140d-1906-7e2738cc54f5.png)

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

![magit_tut6.png](https://qiita-image-store.s3.amazonaws.com/0/39647/cef22bff-2cf2-f006-3a6b-a085cdabf649.png)

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

![magit_tut7.png](https://qiita-image-store.s3.amazonaws.com/0/39647/af93bd04-1051-fe49-c183-661068c39bcf.png)

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

![magit_tut8.png](https://qiita-image-store.s3.amazonaws.com/0/39647/f326dfea-3f5b-07cc-9c7e-dd835f7fe764.png)

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

# コミットログを見る

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

```:$HOME/magit_tut/test.txt
A
B
```

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

![magit_tut9.png](https://qiita-image-store.s3.amazonaws.com/0/39647/73abf9ab-2231-fd51-dc3d-0d1c71352b7b.png)

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

![magit_tut10.png](https://qiita-image-store.s3.amazonaws.com/0/39647/9f0613a9-4a83-7825-adcf-911a019b9807.png)

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

![magit_tut11.png](https://qiita-image-store.s3.amazonaws.com/0/39647/bbf72e8d-339c-ed38-bdae-8ce219d0f65a.png)

# ブランチを作成する

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

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

![magit_tut12.png](https://qiita-image-store.s3.amazonaws.com/0/39647/d87de2e2-4e8b-4c35-7f3c-c4119cb1f1b4.png)

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

![magit_tut13.png](https://qiita-image-store.s3.amazonaws.com/0/39647/cb242687-0db7-6c03-7d13-6c89b6b3afed.png)

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

![magit_tut14.png](https://qiita-image-store.s3.amazonaws.com/0/39647/2cc47d75-260a-5187-22bf-d070e705dc21.png)

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

![magit_tut15.png](https://qiita-image-store.s3.amazonaws.com/0/39647/16dd7563-bc76-ffef-905e-3af46118e647.png)

# マージする

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

```:$HOME/magit_tut/test.txt
A
B
C
```

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

![magit_tut16.png](https://qiita-image-store.s3.amazonaws.com/0/39647/b0a7c6b7-c985-6c67-1259-1dc2006ca9d7.png)

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

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

![magit_tut17.png](https://qiita-image-store.s3.amazonaws.com/0/39647/173b3e09-65de-5382-3d78-1edc8aeb87a2.png)

<kbd>b</kbd>を押して、masterをチェックアウト（ここではそのまま<kbd>Enter</kbd>）
![magit_tut18.png](https://qiita-image-store.s3.amazonaws.com/0/39647/4ecca14f-5e34-cfc0-50e3-009ee57e36e3.png)

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

![magit_tut19.png](https://qiita-image-store.s3.amazonaws.com/0/39647/e0339150-28d5-8783-78ff-cacc56d5d564.png)

<kbd>m</kbd>キーを押すと、マージするブランチを聞かれるのでbr_from_Bを指定(ここでは単純に<kbd>Enter</kbd>)
![magit_tut20.png](https://qiita-image-store.s3.amazonaws.com/0/39647/95ab616a-f7dd-afdc-3905-ebe1fe7e07ef.png)

コンフリクト等が起きなけえればこれでマージ完了。ログを見るとマージできていることがわかる。
![magit_tut21.png](https://qiita-image-store.s3.amazonaws.com/0/39647/4a07db75-819f-2fff-6d26-d8e011187906.png)

# プッシュする

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

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

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

Emacs上のmagit-statusに戻り<kbd>Shift</kbd>+<kbd>p</kbd>を押してプッシュモードに入る
![magit_tut22.png](https://qiita-image-store.s3.amazonaws.com/0/39647/15f082a9-304e-b9f5-0e6d-7fdb3bac66e0.png)

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

![magit_tut23.png](https://qiita-image-store.s3.amazonaws.com/0/39647/1824dfd8-9e63-87b3-7651-5e908f0b6b7d.png)

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

![magit_tut24.png](https://qiita-image-store.s3.amazonaws.com/0/39647/25c6b9f0-1ab3-e85e-34f0-77076ef66a95.png)

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

![magit_tut25.png](https://qiita-image-store.s3.amazonaws.com/0/39647/9b8724b0-f7de-3794-e726-0ccbc625473f.png)

# ログからのブランチ作成

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

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

![magit_tut26.png](https://qiita-image-store.s3.amazonaws.com/0/39647/7918aba8-8840-a028-ad30-9f4d190df73b.png)

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

![magit_tut27.png](https://qiita-image-store.s3.amazonaws.com/0/39647/65b69938-e8c1-2095-8f6b-9329447b38db.png)

ブランチ名はbr_from_Aとする

![magit_tut28.png](https://qiita-image-store.s3.amazonaws.com/0/39647/70e0901f-e07e-b0c8-957a-fa578ef1cd26.png)

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

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

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

```:$HOME/magit_tut/test.txt
A
D
```

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

コンフリクトした。
![magit_tut29.png](https://qiita-image-store.s3.amazonaws.com/0/39647/285636f8-ecc1-8bce-1f76-66a00209840e.png)

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

![magit_tut30.png](https://qiita-image-store.s3.amazonaws.com/0/39647/2548968a-cb13-b914-7e7d-182ca61e803c.png)

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

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

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

![magit_tut31.png](https://qiita-image-store.s3.amazonaws.com/0/39647/1109cf22-f99e-1cce-ab9d-261af64ef4d3.png)

あとは通常コミット時と同様に<kbd>c</kbd> <kbd>c</kbd>でコミットメッセージ入力画面にして`C-c C-c`でコミット実行
![magit_tut32.png](https://qiita-image-store.s3.amazonaws.com/0/39647/6b874c8a-3cbb-eed4-e9a7-5d7ee3e15d07.png)

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

![magit_tut33.png](https://qiita-image-store.s3.amazonaws.com/0/39647/25bcb580-3720-4eca-78ed-4f8b3b9343bf.png)

# 編集の一部をコミット

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

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

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

![magit_tut34.png](https://qiita-image-store.s3.amazonaws.com/0/39647/403dd53d-73b8-6c4c-fada-fceb54752ce8.png)

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

![magit_tut35.png](https://qiita-image-store.s3.amazonaws.com/0/39647/8563ab18-40fe-1015-3801-daf9368fdbb2.png)

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

## 編集の一部をUndo

上記の状態で同様にkbd>Ctrl</kbd>+<kbd>Space</kbd>で「+FUGA」を選択し<kbd>k</kbd>を押すことでその部分をUndoできる。
![magit_tut36.png](https://qiita-image-store.s3.amazonaws.com/0/39647/74dfd1d0-6a7a-0699-2848-ce68f21e298e.png)

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

![magit_tut37.png](https://qiita-image-store.s3.amazonaws.com/0/39647/dc1e39e0-0b5b-f24d-580c-7bfff82825d5.png)

<kbd>y</kbd>を入力すればUndoされる。

![magit_tut38.png](https://qiita-image-store.s3.amazonaws.com/0/39647/3474a833-fa07-71c8-5d44-0e7708e567b1.png)

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

![magit_tut39.png](https://qiita-image-store.s3.amazonaws.com/0/39647/678c482e-ca57-827a-bdaa-1f3af109c44e.png)

<kbd>y</kbd>を押して変更を取り消す

# ここまでをプッシュ

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

# プルの準備

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

![magit_tut40.png](https://qiita-image-store.s3.amazonaws.com/0/39647/c763ea0a-7ad7-731e-aa29-6b6cbe42fb84.png)

↓↓↓↓

![magit_tut41.png](https://qiita-image-store.s3.amazonaws.com/0/39647/f7b05b57-9603-024c-0597-73712b5414cb.png)

# フェッチ/プルする

## フェッチする

<kbd>f</kbd>でフェッチモードに入る

![magit_tut42.png](https://qiita-image-store.s3.amazonaws.com/0/39647/3e86757c-d80c-08d9-84cc-3746ec6e6c97.png)

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

![magit_tut43.png](https://qiita-image-store.s3.amazonaws.com/0/39647/acfe22c1-7c87-ac9a-8402-584a6b0218a4.png)

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

## プルする

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

<kbd>Shift</kbd>+<kbd>f</kbd>でプルモードに入る

![magit_tut44.png](https://qiita-image-store.s3.amazonaws.com/0/39647/55bbcb0a-b294-daba-1c7c-ca8a88d30263.png)

<kbd>u</kbd>でorigin/masterからプルする

![magit_tut45.png](https://qiita-image-store.s3.amazonaws.com/0/39647/944dc508-8c72-34e8-e4a9-498d7902f218.png)

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

# おわりに

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