火曜日担当のkomagataです。
gitよく分からないのでどういう風に使ってるのかデモってくれと言われたので実際に仕事のコードにコミットしてみました。
実録!git!
アクトインディでは「子供とのお出かけ先を探すサイト」いこーよ(http://iko-yo.net)というサイトを運営しています。 リポジトリはデザイナーさんがDreamweaverやCodaのsvnクライアントを使うのでSubversionです。
svnの最新リビジョンだけを持ってくる。(全部持ってくると死ぬほど時間がかかる。)
% git svn clone -r HEAD https://svn.actindi.net/svn/oyaiku/trunk/outing outing --username=komagata
Redmineのチケットを見る。 予め仕込んでおいた簡単そうなチケットを発見。(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は他にもいろいろ出来るみたいですが、今のところリアルにこんな感じで使っています。便利な使い方があれば教えて頂けると嬉しいです。