アクトインディ開発者ブログ

子供とお出かけ情報「いこーよ」を運営する、アクトインディ株式会社の開発者ブログです

Real (World) Git

火曜日担当のkomagataです。

gitよく分からないのでどういう風に使ってるのかデモってくれと言われたので実際に仕事のコードにコミットしてみました。

実録!git!

アクトインディでは「子供とのお出かけ先を探すサイト」いこーよhttp://iko-yo.net)というサイトを運営しています。 リポジトリはデザイナーさんがDreamweaverCodasvnクライアントを使うのでSubversionです。

svnの最新リビジョンだけを持ってくる。(全部持ってくると死ぬほど時間がかかる。)

% git svn clone -r HEAD https://svn.actindi.net/svn/oyaiku/trunk/outing outing --username=komagata

Redmineのチケットを見る。 予め仕込んでおいた簡単そうなチケットを発見。(redmineではイシューというみたいです)

いこーよ - 新機能 #3487: cityモデルのテストを書く - Redmine(タスク管理)

チケットに対応したブランチを作る。

% git branch issue3487

作業ブランチを切り替える。

% git checkout issue3487

(git branch foo; git checkout fooはgit checkout -b fooと同じ)

ブランチ確認。

% git branch
  master
* issue3487

shouldaスタイルのマクロが使いたいのでremarkableを入れる。

# config/environment.rb
Rails::Initializer.run do |config|
  config.gem 'remarkable_rails', :lib => false
end
# spec/spec_helper.rb
require 'spec/rails' # ここの下に書く
require 'remarkable_rails'
% sudo rake gems:install
% rake gems:unpack
% rake gems:refresh_spec

一旦、コミット。

% git add vendor vendor/gems/remarkable_rails-3.1.12
% git commit -a -m'added remarkable'

app/model/city.rbのテストを作る。

# app/model/city.rb
class City < ActiveRecord::Base
  belongs_to :prefecture

  validates_presence_of :name, :reading, :roman
  validates_length_of :name, :within => 1..40
  validates_length_of :reading, :within => 1..40
  validates_length_of :roman, :within => 1..40
  validates_uniqueness_of :roman
end
# spec/models/city_spec.rb
require 'spec_helper'

describe City do
  fixtures :cities

  should_belong_to :prefecture
  should_validate_presence_of :name
  should_validate_presence_of :reading
  should_validate_presence_of :roman
  should_validate_length_of :name, :within => 1..40
  should_validate_length_of :reading, :within => 1..40
  should_validate_length_of :roman, :within => 1..40
  should_validate_uniqueness_of :roman
end

テスト実行(ホントは全部のテストを実行する)

% ./script/spec spec/models/city_spec.rb

City
- should belong to prefecture
- should require name to be set
- should require reading to be set
- should require roman to be set
- should ensure length of name is within 1..40 characters
- should ensure length of reading is within 1..40 characters
- should ensure length of roman is within 1..40 characters
- should require unique values for roman

Finished in 0.770165 seconds

8 examples, 0 failures

コミット

% git add spec/models/city_spec.rb
% git ci -a -m'added city_spec. fixed #3487'

masterに移る。

% git checkout master

最新版を持ってくる

% git svn rebase

issue3487をマージする

% git merge issue3487

svnにコミット。

% git svn dcommit

完了。

その他の便利機能</3>

いっこ前のコミットなかったことにする

% git reset HEAD^

昔のコミットを修正したい

% git log --oneline
c5524b2 * removed foo * removed remarkable
460bfa1 [デザイン] TOPページ「外へおでかけ」の変更 (refs #3490) * 谷さん修正分
9b819fd * add city_spec * add remarkable * add foo
695b1eb [システム] [mobile] /facilities/:id のレイアウト変更。 (refs #2899) * いらないhrを削除。
% git rebase -i 695b1eb

エディタが立ち上がるので修正したいリビジョンのpickをeditに変更して終了する。

pick 9b819fd * add city_spec * add remarkable * add foo
pick 460bfa1 [デザイン] TOPページ「外へおでかけ」の変更 (refs #3490) * 谷さん修正分
edit c5524b2 * removed foo * removed remarkable</pre>

指定したリビジョンの状態に戻るので好きにaddしたり編集したりする。

% git commit --amend
% git rebase --continue

修正完了

複数の適当なコミットを一つにまとめたい

% git log --oneline
68fb234 add text2 in foo
5cd81d6 add text in foo
43fdcb7 add foo
fb91711 removed old paperclip
aa21e65 fixed
% git rebase -i fb91711
pick 43fdcb7 add foo
pick 5cd81d6 add text in foo
pick 68fb234 add text2 in foo

次のリビジョンとまとめたいリビジョンの先頭をpickからsquashに変える。

pick 43fdcb7 add foo
squash 5cd81d6 add text in foo
squash 68fb234 add text2 in foo

コミットメッセージをいれて終了。

みなさんおっしゃってますが、やはり、svnからgitにして嬉しいのはbranchの作成やcommitが気軽できるところですね。一つの作業をやってる途中に別の優先タスクが入った場合も、現在のbranchをほっぽってすぐにそちらのタスクに移れるのは精神的にもとても楽です。

適当にfixed, fixedなどとコミットしていっても後で綺麗にまとめられるところもいいですね。

gitは他にもいろいろ出来るみたいですが、今のところリアルにこんな感じで使っています。便利な使い方があれば教えて頂けると嬉しいです。