magit(emacs+git)は快適な予感がする

EmacsからGitを扱いたくなったので、Magitを入れてみた。

ProductName 入門Git
濱野 純(Junio C Hamano)
秀和システム / 2310円 ( 2009-09-19 )


眺めただけでは快適なのかどうなのかよくわからんので、「chapter4の独りで使う」をmagitでやってみた。

gitの初期化

M-x magit-initでディレクトリを指定すればgitリポジトリの初期化をしてくれます。ディレクトリが存在しなければ作成してくれる。

M-x magit-init
magit4と打つ

これでmagit4というディレクトリが作られてgitリポジトリが初期化される

最初のコミット

C-x C-fでindex.htmlを作成します。ファイルの中身

<html>
  <head>
<title>Shizugit</title>
</head>
<body>
<h1>Shizugit</h1>
<p>Shizugitでは、参加者を募集しています。
最新の版管理システムgitについて熱く語り合いましょう。
</p>
<address>
<a href="mailto:magit@test.com">kzfm</a>
</address>
</body>
</html>

C-x C-sで保存します。

さて、ここでおもむろにM-x magit-statusと打つとmagit-modeのバッファーが開きます(下段)。

magit1

カーソルをindex.htmlにあわせてs キーを打つとステージングされます。これはgit add index.htmlと同じ事です。逆を行いたい場合(アンステージ)はuキーです。

magit2

この状態でcを押すとコミットログ編集画面がでるので「第一回参加募集」とでも書いておきます。

C-c C-cを打てばコミットが作られます。

magit3

変更の記録

index.htmlのaddressタグの直前に静岡っぽいテーマを挿入してみます。

<p>第一回会合では、セミナーも開催します</p>
<ul>
<li>お茶の淹れ方
<li>静岡酵母について
<li>Sphinxとか
</ul>

セーブ(C-x C-s)します。

変更を見るには先ほどのmagit-modeでindex.htmlにカーソルをあわせてdを押します。これはつまりgit diffです。先程追加した部分が差分として表示されてます。

magit4

TODO: git diff HEADのやり方を調べる

コミットを作成します。なにもステージングしてない状態でcを押すと、ステージングしてない変更をステージングするかどうか聞いてくるのでyを押してコミットします。

変更履歴を見る

これで2つのコミットログができているはずなので、変更履歴を見てみます。M-x magit-statusでmagit-modeのバッファーを表示してlキーを二回叩きます。

magit5

部分変更の記録

論理的に異なる2つの変更を施します。みんな大好きSEO対策と、おやつのアナウンスです。index.htmlは次のようになります。

<html>
  <head>
<title>Shizugit</title>
<meta name="keywords" content="SEO,SEO対策,SEOアクセス解析,アクセスアップ,SEOツール">
</head>
<body>
<h1>Shizugit</h1>
<p>Shizugitでは、参加者を募集しています。
最新の版管理システムgitについて熱く語り合いましょう。
</p>
<p>第一回会合では、セミナーも開催します</p>
<ul>
<li>お茶の淹れ方
<li>静岡酵母について
<li>Sphinxとか
</ul>
<p>おやつは杉山フルーツの生ゼリーですYo!</p>
<address>
<a href="mailto:magit@test.com">kzfm</a>
</address>
</body>
</html>

それぞれの変更を個別にコミットしたくなる(git add -p) わけですが、magit-statusバッファーのindex.htmlにカーソルをあわせてタブキーを押すと、ハンクが表示されるのでハンクをsでステージします。

下の図は、メタ情報の追加をコミットしたあとの状態です。

magit6

分割してコミットした後のログは以下になります。メタ情報とおやつ情報の2つに分けてコミットしました。

magit7

変更の取り消し

magit-statusバッファーでl l でログを表示させ、おやつ情報のコミットにカーソルをあわせてvを押します。その後cを押してコミット編集画面で編集したらC-c C-cでコミットします。

magit8

杉山フルーツの生ゼリーは美味しいんだけど、そこそこの値段がするので、毎回は出せないですね。

コミットを捨てる

index.cssというファイルを作成し、追加してコミットします。

このコミットを捨てたい時には、magit-statusバッファーでxを押すとresetするかどうか聞いてくるのでyをおすだけです。これはお手軽ですね

コミットをやり直す

コミット編集画面をもう一度表示させてC-c C-aでOK

結論

キーバインドは覚えるまで苦労しそうだけど、一度覚えれば忘れなさそうだしmagitをメインに使っていこうかなと。

  • chapter4のgitの操作はほとんどmagitで操作できた
  • キーバインドに慣れればmagitは快適に使えそう
  • 入門Gitは良書

ProductName 入門Git
濱野 純(Junio C Hamano)
秀和システム / 2310円 ( 2009-09-19 )


legit / Git for Humans

gitにわかりやすい名前のコマンドを追加してくれる。

使いそうなものから

git switch {branch}

checkoutよりもswitchのほうがスイッチした感が得られますね。

git branches

各ブランチが色付きで表示されつつ、それがリモートにpublishされているかどうかもあわせて表示されるので便利。

git graft {branch}

Merge unpublished branch into current branch, then remove it.

ってなってるんだけど、トピックブランチを立ててマージした後に残ったブランチを削除するのも面倒なので こっちのコマンドのほうがいいのかなと思うんだけど。そういう用途向けじゃないのかな。

git sprout {branch}

現在のブランチから新しいブランチを作る

git publish {branch}

リモートにブランチをパブリッシュ。

トピックブランチはリモートにpushしないのであまり使わないけど便利そう。

git unpublish {branch}

逆にこっちをgitのコマンドで実行するやり方がわからない。

git harvest {branch}

よくわからん。というかrebaseをきちんと理解してないのを理解したので調べた

結果、単独開発の場合はあまり必要ない感じだった。

git sync

複数人で作業することはないのでほとんど使わなさそう

ProductName 入門Git
濱野 純(Junio C Hamano)
秀和システム / 2310円 ( 2009-09-19 )


モジュールのグルーブはこのままキープでー

gitのブランチを使った流れは何かに似てるなぁと思ったら、DJingだった。今、blogのテンプレートをhamlish-jinjaにするかpyjadeにするか悩んでいてトピックブランチを切って両方書いてみている。

フロアー(つまり自分と自分を取り巻く環境)の反応を見ながらtrunkにmergeするbranchを選択するという行為そのものがまさにアートなわけですな。

ProductName Via [DVD]
田中フミヤ
インディーズ・メーカー / ?円 ( 2007-09-28 )


というわけで4デッキ対応のVCI-100MK2が欲しいなぁ。

bashのプロンプトにGitのbranch名を表示させる

最近トピックブランチをきる習慣が定着してきたので、プロンプトにブランチ名を表示させたくなった。

このとおりにやっただけだけど快適になった。

ProductName 入門Git
濱野 純(Junio C Hamano)
秀和システム / 2310円 ( 2009-09-19 )


gitでcommitしたらsphinxのmake htmlが走るようにする設定

うちのサーバー(これとかこれ)も同じような構成でGit管理しているので、@ Git で集中リポジトリーに push したら、自動でワーク・ディレクトリーにも反映させるを見ながら、git pushしたらそのまま公開できるようにしたら快適。

ついでに、Sphinxで管理している文書もcommitしたらmake htmlするようにしてみた。

cd .git/
cd hooks/
cp post-commit.sample post-commit
vim post-commit

post-commitにはmake htmlって書いておくだけ

1
2
3
#!/bin/sh

make html

これでOK

余談だが、本読んだけどpost-update post-receiveの違いが分からなかったので後で調べる。

ProductName 入門Git
濱野 純(Junio C Hamano)
秀和システム / 2310円 ( 2009-09-19 )


入門Gitを読み直している

最近Flaskで色々作っているので、Gitもブランチ切りまくって色々試している。

そんなわけで入門Gitを読み直しているのだ(4章から8章はいい内容だ)。あとコミットの単位を論理的に切り分けるとかコミットログの書き方も本書に沿って実践しつつある。

ProductName 入門Git
濱野 純(Junio C Hamano)
秀和システム / ¥ 2,310 ( 2009-09-19 )


gitのバックアプリポジトリをつくる

手元のmacbookだけでGit使って管理しているコードがあるんだけど、そろそろ自宅サーバーにバックアップリポジトリ欲しいなぁと思った。

既に用意してあるMercurialで管理しなおそうかなぁと思ったのだけど、HTTP経由でpush,pullしないからGitのままでいいやという結論になった。以下手順。

サーバー側にバックアップリポジトリを作る

mkdir /usr/local/repos/flascore
cd /usr/local/repos/flascore
git --bare init

手元のmacbookの作業履歴をコピー

git push ssh://kzfm@myserver/usr/local/repos/flascore master

改めて、手元のmacbookにclone

git clone ssh://kzfm@myserver/usr/local/repos/flascore

サーバーに送りたい時にはgit pushでok

ProductName 入門Git
濱野 純(Junio C Hamano)
秀和システム / ¥ 2,310 ( 2009-09-19 )
在庫あり。

「入門Git」を読んだ

単に手っ取り早く使いたい場合には入門gitでもよいと思うが、版管理の思想とかを学ぶのにはこっちのほうがおすすめ。

ProductName 入門Git
濱野 純(Junio C Hamano)
秀和システム / ¥ 2,310 ()
在庫あり。

1-5章と16章を丁寧に読んで、あとは軽く流す程度。細かいところは使いながら読み直す予定。

あとはこの本読んで、創薬プロジェクトにおけるバージョン管理みたいなのを強烈にイメージ出来たのが収穫であった。

バージョンがツリーごとに並んでないで単なる集合として表現されているのが特許だと考えれば化合物特許解析というのは化合物集合を歴史として並べ直すことなんだよなぁとつくづく感じた。

そういうエントリを書こうと思っているんだけど、図とか作るのが面倒で放ってあるのでそのうち文章にまとめたい。

「入門git」を読んだ

入門subversionが読みやすかったので。GitHubを快適に使うために読んでみた。

ProductName 入門git
Travis Swicegood
オーム社 / 2520円 ( 2009-08-12 )


  • ステージの話がわかりやすかった
  • git blame便利そう

手っ取り早く使いたいだけだったら、分かりやすくてよい(薄いし) もう少し使ってみて色々覚えてきたら入門Gitも読んでみよう。

ProductName 入門Git
濱野 純(Junio C Hamano)
秀和システム / 2310円 ( 2009-09-19 )


macbookのgitを1.6.2にあげた

gitのバージョンを1.6.1から1.6.2にあげた

sudo port upgrade git-core

これで、いままでうまくいかなかったpushがOKになった。(バージョンのせいではないかもしれないけど)