LoginSignup
4
6

More than 5 years have passed since last update.

Magit を使ってみる

Posted at

はじめに

Windows で Emacs を使うのに MSYS2 入れたりとか Patch 当てたりとか割と面倒なので, Atom や VS Code を試してみたが,どうせ Emacs のキーバインドにしたくなるので,設定やら何やらしていたら,Emacs 使う方が楽な気がしたので,現実逃避しながら,Emacs の設定をいじっていたので備忘録代わりに(>_<).

オールドタイプなので,パッケージ管理の類を使わなかったのですが,試しに package.el を使ったら手放せなくなりました(>_<)オールドタイプとかのたまう前に試してみるべきでした.すごく便利です.try.el と併用して色々試しているところです.

試しながら,書いているので,間違ったことを書いてる場合があります.ご容赦下さい.

インストール

下準備

init.el に下記の設定を追加して,package.eluse-package を使用できるようにする.try は,M-x try Enter package 名package をインストールして手軽に試せます.Emacs を再起動すると try から導入した package は使えなくなります.いらないパッケージが残らないので精神衛生上助かりますね.ちなみに,TEMP フォルダに展開されるので,気になるなら消しましょう.私は,そこまでは気にならないので,自動削除される日までほっときます.

init.el
;;; package.el
(require 'package)
(setq package-enable-at-startup nil)
(add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/"))

;;(package-refresh-contents)
(package-initialize)

;;; Bootstrap 'use-package
(unless (package-installed-p 'use-package)
  (package-refresh-contents)
  (package-install 'use-package))

(use-package try
  :ensure t)

Magit の導入

MSYS2 で導入した git は使えなかったので,Git for Windows を導入しました.Git BashGit Cmd から使うので,環境変数に PATH の追加はしていません.(Git のインストール先を変更しているので,試す方は,magit-git-executable の場所を変更して下さい.あと,設定なども適当に)

init.el
(use-package magit
  :ensure t
  :defer t
  :init
  (when (eq system-type 'windows-nt)
    (setq magit-git-executable "D:/Programs/Git/bin/git.exe"))
  :bind ("C-x g" . magit-status)
  :config
  (setq magit-refs-show-commit-count 'all
        magit-log-buffer-file-locked t
        magit-revision-show-gravatars nil
        magit-display-buffer-function #'magit-display-buffer-same-window-except-diff-v1)
  )

追加したら,Emacs を再起動するか評価して.Magit を導入します.

Git をはじめからていねいに に沿って

Git をはじめからていねいに は,shinpei maruyama さんが作られたものです.この資料は,コマンドラインで Git の使い方を学べます.大変わかりやすく,作者の方に感謝してます.この資料を基に, Magit で操作します.

02_first_commit.md

git init では作業ディレクトリの作成が必要ですが,magit-init では,リポジトリの作成と同時に作られるので必要ないです.

M-x magit-init Enter Create repository in: でリポジトリを作成するディレクトリを指定します.ここでは,~/Documents/my_first_worksapce としています.ドキュメントに my_first_workspace ができています.Emacs には,In the beginning there was darkness と表示されます.

C-x C-fnyan.txt を作成して保存する.

nyan.txt
nyan

C-x g(M-x magit-status) で Magit(status) を起動すると,Untracked files (1)nyan.txt が表示されるので,nyan.txt の上にカーソルを合わせて,s で 追跡を開始する.staged changes (1)nyan,txt の上で u を押すとステージングから外れます.

? でコマンド一覧が表示される.コミットしたいので,c c と入力する.コミットメッセージの入力画面になるので「猫の鳴き声を管理するファイルを作成」と入力して C-c C-C でコミットする.コミットしたブランチ名 master とコミットメッセージが表示される.

03_second_commit.md

nyan.txt を変更して,nyanmew に変更して保存して,C-x g を押すと,Unstaged change (1)modified nyan.txt と表示されるので, nyan,txt の上で k を押すと変更の取り消しができます.nyan.txt を確認すると nayn に戻ります.

git では,状態によって,ステージングされた状態を解除するにに,git checkout -- nyan.txtgit reset HEAD nyan.txt と使い分ける必要があるようですが,Magit で unstage するのは,u で行えます.

もう一度,nyanmew に書き換えてコミットしてみます.s でステージングして c c でコミットメッセージ「猫の鳴き声を nyan から mew に変更」と入力して,C-c C-c でコミットする.

ログを確認するときは,l でメニューが表示するので項目を選択します(l など).

04_more_commits.md

wan.txtboo.txt をコミットする.

wan.txt
wan
boo.txt
boo

Magit では,S でまとめて,ステージングするようですが,git add -u . と同等で,すでに追跡しているファイルのみが対象のようです.boo.txt,wan.txt にそれぞれのカーソルの上で,s で追跡を開始する.コミットメッセージ「犬と豚の鳴き声を追加」でコミットする.

Magit では, git rm のコマンドがないようなので,M-C-m(M-RET)Dired を開いて,boo.txt に 'd' でマークを付け,x で削除する.qDired から Magit に戻る.g で状態を更新して,s で 削除するファイルをステージングしてコミットする.コミットメッセージは「豚の鳴き声は要らないので削除」にする.どうしても,git rm したいときは,: からコマンドを直接入力する.

ファイルのリネームは,? のコマンド一覧には,表示されないようですが,R で変更できます.nyanmew.txtwan.txtbow.txt に変更する.コミットメッセージ「ファイル名を英語に変更」でコミットする.

ファイルの移動は,先にディレクトリを作成する必要があり,M-C-mDired を開いて,+animals のディレクトリを作成する.Rmew.txt,bow.txtanimals に移動する.コミットメッセージ「動物ファイルを animals ディレクトリに移動」でコミットする.

05_branch.md

b n でブランチを作成する.Create branch starting at ... と表示されるので,master のまま変更しないので, Enter を入力し,Branch Name に作成するブランチ名を入力する.ここでは,my_first_branch とします.y でブランチ一覧を表示できる.

bow.txtt を変更して,wanbow に変更して,コミットメッセージ「犬ファイルの中身も英語に合わせた」でコミットする.コミットログを,l L で確認する.

ブランチの変更は,b b で変更する.my_first_branch に変更すると,Magitの ステータス画面のブランチ名が,mastor から my_first_branch になっているのが確認できる.また,y でブランチ一覧を表示して,選択するブランチ上で C-m で変更できる.

my_first_branch でコミットを行う.b bmy_first_branch に変更したので,mow.txt を ディレクトリ animals の中に作成する.

mow.txt
mow

コミットメッセージ「牛の鳴き声を追加」でコミットする.l L コミットの様子を確認する.

ブランチを master に切り替えると,my_first_branch で作成した moe.txt は無く.ブランチを my_first_branch に切り替えると,mow.txt が確認できます.

06_merge.md

ブランチを master に変更する.マージするには,m m でマージするブランチ聞かれるので,my_first_branch(デフォルトでなっている)を指定する.マージするコメントを編集するときは,m e で行える.

無事マージが終わってので,いらないブランチを b k で削除する.l L でログを確認する.

07_more_merges.md

少し疲れてきましたが,続きを始めます.ここからは,新しいリポジトリを作成するので,M-x magit-init から my_second_workspace を作成する.cat_lover_said.txtcat_hater_said.txt をコミットメッセージ「猫好きの話と犬好きの話を作成」で作成する.

cat_lover_said.txt
猫は動物の一種である。

犬とならび、ペットとして飼われることの多い動物である。

猫は人間のことを下僕かなにかだと思っており、また人間も
人間で猫に使役されることを至上の喜びと思う傾向にある。

猫の魅力に取り付かれた人間は二度と猫の魅力から離れることが
できないとも言われており、猫ってほんとうにかわいいですね。

もうほんとうに可愛い、猫。
猫。
猫が本当にかわいい。

猫好きじゃない人間とか頭がおかしいとしか思えない。
cat_hater_said.txt
猫は動物の一種である。

犬とならび、ペットとして飼われることの多い動物である。

猫は人間のことを下僕かなにかだと思っているが、冗談じゃない。
人間が猫を飼ってやっているのである。そこを勘違いする猫は
本当にダメである。

その点犬は良い。犬は人間のことを「ご主人様」だとおもって
なついてくれる。それならばこそかわいがる気も起きるというものである。

犬は賢い。犬がいい。犬かわいい。散歩に行って息が上がった
あの「ヘッヘッヘッヘッへ」がもう私をおかしくしちゃうほんとにかわいい。

犬大好き。犬最高。

猫好きな人間とか頭がおかしいとしか思えない。

文体を統一するブランチ unify_styles を,b c で作成すると,ブランチを切るのと,チェックアウトを同時に行えます.ここでは,文体を直して,コミットメッセージ「文体を統一」でコミットします.

cat_lover_said.txt
猫は動物の一種である。

犬とならび、ペットとして飼われることの多い動物である。

猫は人間のことを下僕かなにかだと思っており、また人間も
人間で猫に使役されることを至上の喜びと思う傾向にある。

猫の魅力に取り付かれた人間は二度と猫の魅力から離れることが
できないとも言われている。

猫というのはかように本当にかわいいものである。

猫好きではない人間は、頭がおかしいのではないだろうか。
cat_hater_said.txt
猫は動物の一種である。

犬とならび、ペットとして飼われることの多い動物である。

猫は人間のことを下僕かなにかだと思っているが、冗談じゃない。
人間が猫を飼ってやっているのである。そこを勘違いする猫は
本当にダメである。

その点犬は良い。犬は人間のことを「ご主人様」だとおもって
なついてくれる。それならばこそかわいがる気も起きるというものである。

犬は賢い。やはり犬がよい。犬はかわいい。

散歩に行ったあとに息が上がっている様など、ほんとうに良いものである。

猫が好きな人間は、頭がおかしいのではないだろうか。

表現がおかしいのを緊急に修正する必要があるので,文体統一前に状態を戻して修正する.
取り敢えず,文体統一前のブランチ master に変更する.緊急に修正するブランチ hotfix を作成して修正する.b chotfix を作成する.それぞれの最後の文章を修正して,コミットメッセージ「頭がおかしいという表現はまずいので修正」でコミットする.

cat_lover_said.txt
猫好きじゃない人間がいるのが不思議。
cat_hater_said.txt
猫好きな人間がいるのが不思議。

修正ができたのので,hotfix の変更を master ブランチに取り込む.master ブランチに戻って,マージする.m m でマージすると Fast-forward になるので,一度変更を基に戻します.

l L でコミット ID を確認する.ここでは,「猫好きの話と犬好きの話を作成」の数字を確認する.X h で調べた ID を入力すると,HEAD(master) が元の位置に戻る.m e でマージすると,--no-ff が自動で付加されるので,Fast-forward したくない場合はこちらを選択すればよい.

マージが終われば,ブランチ hotfix は必要ないので,b k で削除する.

文体統一のブランチの unify_styles の修正が必要になったので,ブランチを unify_styles に変更する.cat_hater_said.txt を修正して,コミットメッセージ「"ヘッヘッヘッヘッ" という表現は残すようにした」でコミットする.

cat_hater_said.txt
猫は動物の一種である。

犬とならび、ペットとして飼われることの多い動物である。

猫は人間のことを下僕かなにかだと思っているが、冗談じゃない。
人間が猫を飼ってやっているのである。そこを勘違いする猫は
本当にダメである。

その点犬は良い。犬は人間のことを「ご主人様」だとおもって
なついてくれる。それならばこそかわいがる気も起きるというものである。

犬は賢い。やはり犬がよい。犬はかわいい。

散歩に行ったあとに息が上がって "ヘッヘッヘッヘッ" と
なっている様など、ほんとうに良いものである。

猫が好きな人間は、頭がおかしいのではないだろうか。

l L でログを見ると時系列になってないので,'l' の後 =o c--date-order を与えて,L でログを確認する.

修正の確認が終わったので,masterunify_styles の修正をマージする.master に切り替えて,m e でマージする.Error が起こったので,$ で確認すると,コンフリクトを起こして自動でマージが行えなかったようです.マージされてないファイル(unmerged cat_xxx.txt)があるので修正する.変更するファイルの上で C-m でファイルを編集する.

cat_hater_said.txt
猫は動物の一種である。

犬とならび、ペットとして飼われることの多い動物である。

猫は人間のことを下僕かなにかだと思っているが、冗談じゃない。
人間が猫を飼ってやっているのである。そこを勘違いする猫は
本当にダメである。

その点犬は良い。犬は人間のことを「ご主人様」だとおもって
なついてくれる。それならばこそかわいがる気も起きるというものである。

犬は賢い。やはり犬がよい。犬はかわいい。

散歩に行ったあとに息が上がって "ヘッヘッヘッヘッ" と
なっている様など、ほんとうに良いものである。

猫が好きな人間が存在するというのが、私には不思議に思える。
cat_lover_said.txt
猫は動物の一種である。

犬とならび、ペットとして飼われることの多い動物である。

猫は人間のことを下僕かなにかだと思っており、また人間も
人間で猫に使役されることを至上の喜びと思う傾向にある。

猫の魅力に取り付かれた人間は二度と猫の魅力から離れることが
できないとも言われている。

猫というのはかように本当にかわいいものである。

猫好きではない人間が存在するのが、私には不思議に思える。

修正が終われば,s でステージに上げ、c cC-c C-c でコミットする.

マージが終われば,ブランチ unify_styles は必要ないので,b k で削除する.

08_rebase.md

my_third_workspace を作成して,cat_lover_said.txtcat_hater_said.txt をコミットメッセージ「猫好きの話と犬好きの話を作成」で作成する.

cat_lover_said.txt
猫は動物の一種である。

犬とならび、ペットとして飼われることの多い動物である。

猫は人間のことを下僕かなにかだと思っており、また人間も
人間で猫に使役されることを至上の喜びと思う傾向にある。

猫の魅力に取り付かれた人間は二度と猫の魅力から離れることが
できないとも言われており、猫ってほんとうにかわいいですね。

もうほんとうに可愛い、猫。
猫。
猫が本当にかわいい。

猫好きじゃない人間とか頭がおかしいとしか思えない。
cat_hater_said.txt
猫は動物の一種である。

犬とならび、ペットとして飼われることの多い動物である。

猫は人間のことを下僕かなにかだと思っているが、冗談じゃない。
人間が猫を飼ってやっているのである。そこを勘違いする猫は
本当にダメである。

その点犬は良い。犬は人間のことを「ご主人様」だとおもって
なついてくれる。それならばこそかわいがる気も起きるというものである。

犬は賢い。犬がいい。犬かわいい。散歩に行って息が上がった
あの「ヘッヘッヘッヘッへ」がもう私をおかしくしちゃうほんとにかわいい。

犬大好き。犬最高。

猫好きな人間とか頭がおかしいとしか思えない。

文体を統一するトピックブランチ unify_styles を作成する.

cat_lover_said.txt
猫は動物の一種である。

犬とならび、ペットとして飼われることの多い動物である。

猫は人間のことを下僕かなにかだと思っており、また人間も
人間で猫に使役されることを至上の喜びと思う傾向にある。

猫の魅力に取り付かれた人間は二度と猫の魅力から離れることが
できないとも言われている。

もうほんとうに可愛い、猫。
猫。
猫が本当にかわいい。

猫好きじゃない人間とか頭がおかしいとしか思えない。
cat_hater_said.txt
猫は動物の一種である。

犬とならび、ペットとして飼われることの多い動物である。

猫は人間のことを下僕かなにかだと思っているが、冗談じゃない。
人間が猫を飼ってやっているのである。そこを勘違いする猫は
本当にダメである。

その点犬は良い。犬は人間のことを「ご主人様」だとおもって
なついてくれる。それならばこそかわいがる気も起きるというものである。

犬は賢い。やはり犬がよい。犬はかわいい。

散歩に行ったあとに息が上がっている様など、ほんとうに良いものである。

犬大好き。犬最高。

猫好きな人間とか頭がおかしいとしか思えない。

文体統一の途中で,急ぎの修正がはいりました.中途半端な状態でコミットしたくはないですが,とりあえずコミットします.コミットメッセージは,「作業途中だがとりあえずコミットしておく」にします.

master ブランチから hotfix ブランチを切り,急ぎの修正を行います.b c でブランチ作成とチェックアウトを同時に行うのですが,Create and checkout branch starting at(..):master を選択して,Branch namehotfix にします.それぞれの最後の文章を修正して,コミットメッセージ「頭がおかしいという表現はまずいので修正」でコミットする.

cat_lover_said.txt
猫好きじゃない人間がいるのが不思議。
cat_hater_said.txt
猫好きな人間がいるのが不思議。

OK が出たので,ブランチを master に切り替え,m ehotfix をマージする.いらなくなった,hotfixb k で削除する.

unify_styles にチェックアウトして, r erebase を行う.l L でログを確認する.また,ファイルを確認すると,hotfix の変更も取り込まれています.

残りの修正を行います.

cat_lover_said.txt
猫は動物の一種である。

犬とならび、ペットとして飼われることの多い動物である。

猫は人間のことを下僕かなにかだと思っており、また人間も
人間で猫に使役されることを至上の喜びと思う傾向にある。

猫の魅力に取り付かれた人間は二度と猫の魅力から離れることが
できないとも言われている。

猫というのはかように本当にかわいいものである。

猫好きではない人間が存在するのが、私には不思議に思える。
cat_hater_said.txt
猫は動物の一種である。

犬とならび、ペットとして飼われることの多い動物である。

猫は人間のことを下僕かなにかだと思っているが、冗談じゃない。
人間が猫を飼ってやっているのである。そこを勘違いする猫は
本当にダメである。

その点犬は良い。犬は人間のことを「ご主人様」だとおもって
なついてくれる。それならばこそかわいがる気も起きるというものである。

犬は賢い。やはり犬がよい。犬はかわいい。

散歩に行ったあとに息が上がって ヘッヘッヘッヘッ と
なっている様など、ほんとうに良いものである。

猫が好きな人間が存在するというのが、私には不思議に思える。

git add でやり直した状態のファイルをステージしてから,git commit --amend で直前のコミットをやり直すことができる.c agit commit --amend を行います.前回のコミットメッセージ「作業途中だがとりあえずコミットしておく」が表示されるが,作業は終わったので、このメッセージを「文体を統一」に変更してコミットする.

unify_styles のチェックが終わったので,ブランチを master に切り替え,m eunify_styles をマージする.m kunify_styles を削除する.

09_clone.md

ここから,複数人での操作です.スタートメニューGitGit Bash で作業します.たかしくんの設定をします.

$ mkdir ~/Documents/takashi_workspace
$ git init
$ git config user.name TAKASHI
$ git config user.email takashi@example.com

EmacsC-x g(magit-status) でリポジトリを takashi_workspace を指定する.取り敢えず何かコミットしたいので,cat_lover_said.txt をコミットメッセージ「猫好きの話を追加」でコミットします.

cat_lover_said.txt
猫は動物の一種である。

犬とならび、ペットとして飼われることの多い動物である。

猫は人間のことを下僕かなにかだと思っており、また人間も
人間で猫に使役されることを至上の喜びと思う傾向にある。

猫の魅力に取り付かれた人間は二度と猫の魅力から離れることが
できないとも言われており、猫ってほんとうにかわいいですね。

もうほんとうに可愛い、猫。
猫。
猫が本当にかわいい。

猫好きじゃない人間とか頭がおかしいとしか思えない。

l L でログを確認して,Takashi がコミットしたのを確認する.開発用のブランチを作るので,b n から development ブランチを作成する.

ここでは,みんなが作業するリポジトリを作成するので,:Git のサブコマンドが入力できるので,

clone --bare ~/Documents/takashi_workspace ~/Documents/shared_repo.git

と入力する.

ゆうすけが作業にさんかすることになったので,ベアリポジトリ から複製する.Git bash から作業します.

$ git clone ~/Documents/shared_repo.git ~/Documents/yuusuke_workspace
$ cd ~/Documents/yuusuke_workspace
$ git config user.name YUUSUKE
$ git config user.email yuusuke@example.com

ゆうすけのリポジトリを Emacs で開きたいので,一度 *scratch* バッファなどに切り替えて, C-x g(magit-status) でリポジトリを yuusuke_workspace を指定する.origin/development を追跡する development ブランチを作成する.b nCreate and checkout branch starting at:origin/development を選択して,Branch name:development にする.

たかしのリポジトリは,clone してないので,リモートリポジトリを登録してない状態なので,M aRemote name:originRemote url:path/to/shared_repo.git を指定する.b u で追跡するブランチを追加する.ブランチを development に切り替え,こちらでも,b u で追加する.

10_push_pull.md

ゆうすけでの作業.magit-statusyuusuke_workspace になっているのを確認する.development ブランチから文体統一の feature/unify_styles を切ってチェックアウトするので,b cCreate and checkout branch starting at:developmentbranch name:feature/unify_styles とする.

cat_lover_said.txt を編集して,コミットメッセージ「文体を統一」でコミットする.

cat_lover_said.txt
猫は動物の一種である。

犬とならび、ペットとして飼われることの多い動物である。

猫は人間のことを下僕かなにかだと思っており、また人間も
人間で猫に使役されることを至上の喜びと思う傾向にある。

猫の魅力に取り付かれた人間は二度と猫の魅力から離れることが
できないとも言われている。

猫というのはかように本当にかわいいものである。

猫好きではない人間は、頭がおかしいのではないだろうか。

たかしでの作業.magit-statustakashi_workspace になっているのを確認する.master ブランチから hotfix を切ってチェックアウトする.

cat_lover_said.txt を編集して,コミットメッセージ「頭おかしいという表現はまずいので修正」でコミットする.

cat_lover_said.txt
猫は動物の一種である。

犬とならび、ペットとして飼われることの多い動物である。

猫は人間のことを下僕かなにかだと思っており、また人間も
人間で猫に使役されることを至上の喜びと思う傾向にある。

猫の魅力に取り付かれた人間は二度と猫の魅力から離れることが
できないとも言われており、猫ってほんとうにかわいいですね。

もうほんとうに可愛い、猫。
猫。
猫が本当にかわいい。

猫好きじゃない人間がいるのが不思議

リモートブランチ origin/hotfix が存在しないので,Push するときに hotfix から複製する.P uChange upstream of hotfix to:origin/hotfix を指定する.

ブランチを master に変更して.m e でマージするには,m m でマージするブランチ聞かれるので,hotfix にする.

Unmerged info origin/master(2) と表示され,origin/master の更新がされてないので,P pPush する.

不要な hotfix ブランチを b k で削除する.リモートブランチも同様に,b korigin/hotfix で削除できる.

hotfix で対応した内容が反映されている masterdevelopment に取り込む.ブランチを development に変更して master をマージする.コミットメッセージは「緊急対応で行った修正をmaster から取り込む」にする.リモートに反映させるのに Push する.たかしの作業が終わったのでゆうすけの作業に戻ります.

ゆうすけでの作業.magit-statusyuusuke_workspace に変更する.l b で今の状態を確認する.共有リポジトリにはまだ feature/unify_styles ないので Push する.P uChange upstream of hotfix to:origin/feature/unify_styles を指定する.

unify_styles の変更を development に取り込みたいが,すでにリモートで更新されている場合があるので,リモートの変更を取り込む必要がある.f a(git remote update) でリモートの変更を手元にコピーする.このままでは,origin/master,origin/master にしか変更が適応されてないので、ローカルの master,development に merge(m m) して変更を取り込む.l L で状態を確認する.

feature/unify_styles の変更を development に適応するので,development ブランチに切り替えマージする.コンフリクトを起こすので修正してコミットする.

cat_lover_said.txt
(最終行)
猫好きではない人間が存在するのが、私には不思議に思える。

コミットメッセージは,「コンフリクトの修正<改行><改行>文体を修正するための修正と、"頭おかしい" の修正で同じ行を修正していたので、どちらの修正も生かすような対応を行った」にする.push してリモートレポジトリに反映する.

おわりに

殴り書きで,文体の統一性がなくおかしいですが,なんとなく Magit の操作がつかめると思います.Git をはじめからていねいに があったので操作の比較ができました.

4
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
6