はじめに
Windows で Emacs を使うのに MSYS2 入れたりとか Patch 当てたりとか割と面倒なので, Atom や VS Code を試してみたが,どうせ Emacs のキーバインドにしたくなるので,設定やら何やらしていたら,Emacs 使う方が楽な気がしたので,現実逃避しながら,Emacs の設定をいじっていたので備忘録代わりに(>_<).
オールドタイプなので,パッケージ管理の類を使わなかったのですが,試しに package.el を使ったら手放せなくなりました(>_<)オールドタイプとかのたまう前に試してみるべきでした.すごく便利です.try.el と併用して色々試しているところです.
試しながら,書いているので,間違ったことを書いてる場合があります.ご容赦下さい.
インストール
下準備
init.el に下記の設定を追加して,package.el と use-package を使用できるようにする.try は,M-x try Enter package 名 で package をインストールして手軽に試せます.Emacs を再起動すると try から導入した package は使えなくなります.いらないパッケージが残らないので精神衛生上助かりますね.ちなみに,TEMP フォルダに展開されるので,気になるなら消しましょう.私は,そこまでは気にならないので,自動削除される日までほっときます.
;;; 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 Bash や Git Cmd から使うので,環境変数に PATH の追加はしていません.(Git のインストール先を変更しているので,試す方は,magit-git-executable の場所を変更して下さい.あと,設定なども適当に)
(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-f で 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 を変更して,nyan を mew に変更して保存して,C-x g を押すと,Unstaged change (1) に modified nyan.txt と表示されるので, nyan,txt の上で k を押すと変更の取り消しができます.nyan.txt を確認すると nayn に戻ります.
git では,状態によって,ステージングされた状態を解除するにに,git checkout -- nyan.txt,git reset HEAD nyan.txt と使い分ける必要があるようですが,Magit で unstage するのは,u で行えます.
もう一度,nyan を mew に書き換えてコミットしてみます.s でステージングして c c でコミットメッセージ「猫の鳴き声を nyan から mew に変更」と入力して,C-c C-c でコミットする.
ログを確認するときは,l でメニューが表示するので項目を選択します(l など).
04_more_commits.md
wan.txt と boo.txt をコミットする.
wan
boo
Magit では,S でまとめて,ステージングするようですが,git add -u . と同等で,すでに追跡しているファイルのみが対象のようです.boo.txt,wan.txt にそれぞれのカーソルの上で,s で追跡を開始する.コミットメッセージ「犬と豚の鳴き声を追加」でコミットする.
Magit では, git rm のコマンドがないようなので,M-C-m(M-RET) で Dired を開いて,boo.txt に 'd' でマークを付け,x で削除する.q で Dired から Magit に戻る.g で状態を更新して,s で 削除するファイルをステージングしてコミットする.コミットメッセージは「豚の鳴き声は要らないので削除」にする.どうしても,git rm したいときは,: からコマンドを直接入力する.
ファイルのリネームは,? のコマンド一覧には,表示されないようですが,R で変更できます.nyan を mew.txt,wan.txt を bow.txt に変更する.コミットメッセージ「ファイル名を英語に変更」でコミットする.
ファイルの移動は,先にディレクトリを作成する必要があり,M-C-m で Dired を開いて,+ で animals のディレクトリを作成する.R で mew.txt,bow.txt を animals に移動する.コミットメッセージ「動物ファイルを animals ディレクトリに移動」でコミットする.
05_branch.md
b n でブランチを作成する.Create branch starting at ... と表示されるので,master のまま変更しないので, Enter を入力し,Branch Name に作成するブランチ名を入力する.ここでは,my_first_branch とします.y でブランチ一覧を表示できる.
bow.txtt を変更して,wan を bow に変更して,コミットメッセージ「犬ファイルの中身も英語に合わせた」でコミットする.コミットログを,l L で確認する.
ブランチの変更は,b b で変更する.my_first_branch に変更すると,Magitの ステータス画面のブランチ名が,mastor から my_first_branch になっているのが確認できる.また,y でブランチ一覧を表示して,選択するブランチ上で C-m で変更できる.
my_first_branch でコミットを行う.b b で my_first_branch に変更したので,mow.txt を ディレクトリ animals の中に作成する.
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.txt と cat_hater_said.txt をコミットメッセージ「猫好きの話と犬好きの話を作成」で作成する.
猫は動物の一種である。
犬とならび、ペットとして飼われることの多い動物である。
猫は人間のことを下僕かなにかだと思っており、また人間も
人間で猫に使役されることを至上の喜びと思う傾向にある。
猫の魅力に取り付かれた人間は二度と猫の魅力から離れることが
できないとも言われており、猫ってほんとうにかわいいですね。
もうほんとうに可愛い、猫。
猫。
猫が本当にかわいい。
猫好きじゃない人間とか頭がおかしいとしか思えない。
猫は動物の一種である。
犬とならび、ペットとして飼われることの多い動物である。
猫は人間のことを下僕かなにかだと思っているが、冗談じゃない。
人間が猫を飼ってやっているのである。そこを勘違いする猫は
本当にダメである。
その点犬は良い。犬は人間のことを「ご主人様」だとおもって
なついてくれる。それならばこそかわいがる気も起きるというものである。
犬は賢い。犬がいい。犬かわいい。散歩に行って息が上がった
あの「ヘッヘッヘッヘッへ」がもう私をおかしくしちゃうほんとにかわいい。
犬大好き。犬最高。
猫好きな人間とか頭がおかしいとしか思えない。
文体を統一するブランチ unify_styles を,b c で作成すると,ブランチを切るのと,チェックアウトを同時に行えます.ここでは,文体を直して,コミットメッセージ「文体を統一」でコミットします.
猫は動物の一種である。
犬とならび、ペットとして飼われることの多い動物である。
猫は人間のことを下僕かなにかだと思っており、また人間も
人間で猫に使役されることを至上の喜びと思う傾向にある。
猫の魅力に取り付かれた人間は二度と猫の魅力から離れることが
できないとも言われている。
猫というのはかように本当にかわいいものである。
猫好きではない人間は、頭がおかしいのではないだろうか。
猫は動物の一種である。
犬とならび、ペットとして飼われることの多い動物である。
猫は人間のことを下僕かなにかだと思っているが、冗談じゃない。
人間が猫を飼ってやっているのである。そこを勘違いする猫は
本当にダメである。
その点犬は良い。犬は人間のことを「ご主人様」だとおもって
なついてくれる。それならばこそかわいがる気も起きるというものである。
犬は賢い。やはり犬がよい。犬はかわいい。
散歩に行ったあとに息が上がっている様など、ほんとうに良いものである。
猫が好きな人間は、頭がおかしいのではないだろうか。
表現がおかしいのを緊急に修正する必要があるので,文体統一前に状態を戻して修正する.
取り敢えず,文体統一前のブランチ master に変更する.緊急に修正するブランチ hotfix を作成して修正する.b c で hotfix を作成する.それぞれの最後の文章を修正して,コミットメッセージ「頭がおかしいという表現はまずいので修正」でコミットする.
猫好きじゃない人間がいるのが不思議。
猫好きな人間がいるのが不思議。
修正ができたのので,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 を修正して,コミットメッセージ「"ヘッヘッヘッヘッ" という表現は残すようにした」でコミットする.
猫は動物の一種である。
犬とならび、ペットとして飼われることの多い動物である。
猫は人間のことを下僕かなにかだと思っているが、冗談じゃない。
人間が猫を飼ってやっているのである。そこを勘違いする猫は
本当にダメである。
その点犬は良い。犬は人間のことを「ご主人様」だとおもって
なついてくれる。それならばこそかわいがる気も起きるというものである。
犬は賢い。やはり犬がよい。犬はかわいい。
散歩に行ったあとに息が上がって "ヘッヘッヘッヘッ" と
なっている様など、ほんとうに良いものである。
猫が好きな人間は、頭がおかしいのではないだろうか。
l L でログを見ると時系列になってないので,'l' の後 =o c で --date-order を与えて,L でログを確認する.
修正の確認が終わったので,master に unify_styles の修正をマージする.master に切り替えて,m e でマージする.Error が起こったので,$ で確認すると,コンフリクトを起こして自動でマージが行えなかったようです.マージされてないファイル(unmerged cat_xxx.txt)があるので修正する.変更するファイルの上で C-m でファイルを編集する.
猫は動物の一種である。
犬とならび、ペットとして飼われることの多い動物である。
猫は人間のことを下僕かなにかだと思っているが、冗談じゃない。
人間が猫を飼ってやっているのである。そこを勘違いする猫は
本当にダメである。
その点犬は良い。犬は人間のことを「ご主人様」だとおもって
なついてくれる。それならばこそかわいがる気も起きるというものである。
犬は賢い。やはり犬がよい。犬はかわいい。
散歩に行ったあとに息が上がって "ヘッヘッヘッヘッ" と
なっている様など、ほんとうに良いものである。
猫が好きな人間が存在するというのが、私には不思議に思える。
猫は動物の一種である。
犬とならび、ペットとして飼われることの多い動物である。
猫は人間のことを下僕かなにかだと思っており、また人間も
人間で猫に使役されることを至上の喜びと思う傾向にある。
猫の魅力に取り付かれた人間は二度と猫の魅力から離れることが
できないとも言われている。
猫というのはかように本当にかわいいものである。
猫好きではない人間が存在するのが、私には不思議に思える。
修正が終われば,s でステージに上げ、c c,C-c C-c でコミットする.
マージが終われば,ブランチ unify_styles は必要ないので,b k で削除する.
08_rebase.md
my_third_workspace を作成して,cat_lover_said.txt と cat_hater_said.txt をコミットメッセージ「猫好きの話と犬好きの話を作成」で作成する.
猫は動物の一種である。
犬とならび、ペットとして飼われることの多い動物である。
猫は人間のことを下僕かなにかだと思っており、また人間も
人間で猫に使役されることを至上の喜びと思う傾向にある。
猫の魅力に取り付かれた人間は二度と猫の魅力から離れることが
できないとも言われており、猫ってほんとうにかわいいですね。
もうほんとうに可愛い、猫。
猫。
猫が本当にかわいい。
猫好きじゃない人間とか頭がおかしいとしか思えない。
猫は動物の一種である。
犬とならび、ペットとして飼われることの多い動物である。
猫は人間のことを下僕かなにかだと思っているが、冗談じゃない。
人間が猫を飼ってやっているのである。そこを勘違いする猫は
本当にダメである。
その点犬は良い。犬は人間のことを「ご主人様」だとおもって
なついてくれる。それならばこそかわいがる気も起きるというものである。
犬は賢い。犬がいい。犬かわいい。散歩に行って息が上がった
あの「ヘッヘッヘッヘッへ」がもう私をおかしくしちゃうほんとにかわいい。
犬大好き。犬最高。
猫好きな人間とか頭がおかしいとしか思えない。
文体を統一するトピックブランチ unify_styles を作成する.
猫は動物の一種である。
犬とならび、ペットとして飼われることの多い動物である。
猫は人間のことを下僕かなにかだと思っており、また人間も
人間で猫に使役されることを至上の喜びと思う傾向にある。
猫の魅力に取り付かれた人間は二度と猫の魅力から離れることが
できないとも言われている。
もうほんとうに可愛い、猫。
猫。
猫が本当にかわいい。
猫好きじゃない人間とか頭がおかしいとしか思えない。
猫は動物の一種である。
犬とならび、ペットとして飼われることの多い動物である。
猫は人間のことを下僕かなにかだと思っているが、冗談じゃない。
人間が猫を飼ってやっているのである。そこを勘違いする猫は
本当にダメである。
その点犬は良い。犬は人間のことを「ご主人様」だとおもって
なついてくれる。それならばこそかわいがる気も起きるというものである。
犬は賢い。やはり犬がよい。犬はかわいい。
散歩に行ったあとに息が上がっている様など、ほんとうに良いものである。
犬大好き。犬最高。
猫好きな人間とか頭がおかしいとしか思えない。
文体統一の途中で,急ぎの修正がはいりました.中途半端な状態でコミットしたくはないですが,とりあえずコミットします.コミットメッセージは,「作業途中だがとりあえずコミットしておく」にします.
master ブランチから hotfix ブランチを切り,急ぎの修正を行います.b c でブランチ作成とチェックアウトを同時に行うのですが,Create and checkout branch starting at(..): で master を選択して,Branch name を hotfix にします.それぞれの最後の文章を修正して,コミットメッセージ「頭がおかしいという表現はまずいので修正」でコミットする.
猫好きじゃない人間がいるのが不思議。
猫好きな人間がいるのが不思議。
OK が出たので,ブランチを master に切り替え,m e で hotfix をマージする.いらなくなった,hotfix を b k で削除する.
unify_styles にチェックアウトして, r e で rebase を行う.l L でログを確認する.また,ファイルを確認すると,hotfix の変更も取り込まれています.
残りの修正を行います.
猫は動物の一種である。
犬とならび、ペットとして飼われることの多い動物である。
猫は人間のことを下僕かなにかだと思っており、また人間も
人間で猫に使役されることを至上の喜びと思う傾向にある。
猫の魅力に取り付かれた人間は二度と猫の魅力から離れることが
できないとも言われている。
猫というのはかように本当にかわいいものである。
猫好きではない人間が存在するのが、私には不思議に思える。
猫は動物の一種である。
犬とならび、ペットとして飼われることの多い動物である。
猫は人間のことを下僕かなにかだと思っているが、冗談じゃない。
人間が猫を飼ってやっているのである。そこを勘違いする猫は
本当にダメである。
その点犬は良い。犬は人間のことを「ご主人様」だとおもって
なついてくれる。それならばこそかわいがる気も起きるというものである。
犬は賢い。やはり犬がよい。犬はかわいい。
散歩に行ったあとに息が上がって ヘッヘッヘッヘッ と
なっている様など、ほんとうに良いものである。
猫が好きな人間が存在するというのが、私には不思議に思える。
git add でやり直した状態のファイルをステージしてから,git commit --amend で直前のコミットをやり直すことができる.c a で git commit --amend を行います.前回のコミットメッセージ「作業途中だがとりあえずコミットしておく」が表示されるが,作業は終わったので、このメッセージを「文体を統一」に変更してコミットする.
unify_styles のチェックが終わったので,ブランチを master に切り替え,m e で unify_styles をマージする.m k で unify_styles を削除する.
09_clone.md
ここから,複数人での操作です.スタートメニュー → Git → Git Bash で作業します.たかしくんの設定をします.
$ mkdir ~/Documents/takashi_workspace
$ git init
$ git config user.name TAKASHI
$ git config user.email takashi@example.com
Emacs で C-x g(magit-status) でリポジトリを takashi_workspace を指定する.取り敢えず何かコミットしたいので,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 n で Create and checkout branch starting at: に origin/development を選択して,Branch name: を development にする.
たかしのリポジトリは,clone してないので,リモートリポジトリを登録してない状態なので,M a で Remote name: を origin,Remote url: を path/to/shared_repo.git を指定する.b u で追跡するブランチを追加する.ブランチを development に切り替え,こちらでも,b u で追加する.
10_push_pull.md
ゆうすけでの作業.magit-status が yuusuke_workspace になっているのを確認する.development ブランチから文体統一の feature/unify_styles を切ってチェックアウトするので,b c で Create and checkout branch starting at: に development,branch name: に feature/unify_styles とする.
cat_lover_said.txt を編集して,コミットメッセージ「文体を統一」でコミットする.
猫は動物の一種である。
犬とならび、ペットとして飼われることの多い動物である。
猫は人間のことを下僕かなにかだと思っており、また人間も
人間で猫に使役されることを至上の喜びと思う傾向にある。
猫の魅力に取り付かれた人間は二度と猫の魅力から離れることが
できないとも言われている。
猫というのはかように本当にかわいいものである。
猫好きではない人間は、頭がおかしいのではないだろうか。
たかしでの作業.magit-status が takashi_workspace になっているのを確認する.master ブランチから hotfix を切ってチェックアウトする.
cat_lover_said.txt を編集して,コミットメッセージ「頭おかしいという表現はまずいので修正」でコミットする.
猫は動物の一種である。
犬とならび、ペットとして飼われることの多い動物である。
猫は人間のことを下僕かなにかだと思っており、また人間も
人間で猫に使役されることを至上の喜びと思う傾向にある。
猫の魅力に取り付かれた人間は二度と猫の魅力から離れることが
できないとも言われており、猫ってほんとうにかわいいですね。
もうほんとうに可愛い、猫。
猫。
猫が本当にかわいい。
猫好きじゃない人間がいるのが不思議
リモートブランチ origin/hotfix が存在しないので,Push するときに hotfix から複製する.P u で Change upstream of hotfix to: に origin/hotfix を指定する.
ブランチを master に変更して.m e でマージするには,m m でマージするブランチ聞かれるので,hotfix にする.
Unmerged info origin/master(2) と表示され,origin/master の更新がされてないので,P p で Push する.
不要な hotfix ブランチを b k で削除する.リモートブランチも同様に,b k で origin/hotfix で削除できる.
hotfix で対応した内容が反映されている master を development に取り込む.ブランチを development に変更して master をマージする.コミットメッセージは「緊急対応で行った修正をmaster から取り込む」にする.リモートに反映させるのに Push する.たかしの作業が終わったのでゆうすけの作業に戻ります.
ゆうすけでの作業.magit-status が yuusuke_workspace に変更する.l b で今の状態を確認する.共有リポジトリにはまだ feature/unify_styles ないので Push する.P u で Change 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 ブランチに切り替えマージする.コンフリクトを起こすので修正してコミットする.
(最終行)
猫好きではない人間が存在するのが、私には不思議に思える。
コミットメッセージは,「コンフリクトの修正<改行><改行>文体を修正するための修正と、"頭おかしい" の修正で同じ行を修正していたので、どちらの修正も生かすような対応を行った」にする.push してリモートレポジトリに反映する.
おわりに
殴り書きで,文体の統一性がなくおかしいですが,なんとなく Magit の操作がつかめると思います.Git をはじめからていねいに があったので操作の比較ができました.