質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.52%

  • Ruby

    7634questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

  • Ruby on Rails

    7238questions

    Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

  • Ruby on Rails 4

    2433questions

    Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

  • Git

    1271questions

    Gitはオープンソースの分散バージョン管理システム(DVCS)です。

  • PostgreSQL

    1058questions

    PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

rake db:migrateで他のbranchで作成したschemaをconfig/schema.rbに反映しないようにしたい

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 987

satoshih

score 471

 環境

Ruby on Railsのアプリをgitを利用し、開発しています。
フレームワーク: Ruby on Rails 4.2
言語: ruby 2.2.5
データベース: PostgreSQL v9.6.1

 実現したいこと

他のbranchのschema情報を config/schema.rb へ反映を抑制したい

発生している問題・エラーメッセージ

現象

  1. branch_a で rails g migration を実行し、 rake db:migrate で、 DBへ反映 
  2. git checkout branch_b で branch_b に切り替え、 rake db:migrate を行う

=> branch_a で作成したDBの情報が config/schema.rb に反映されてしまうため、
不要なdiffができてしまう。

 詳細な手順

  1. branch_a で rails g migration を実行し、 rake db:migrate で、 DBへ反映
$ git branch
* branch_a
  branch_b
  master

$ rails g model user name:string
      invoke  active_record
      create    db/migrate/20170119014258_create_users.rb
      create    app/models/user.rb
      invoke    test_unit
      create      test/models/user_test.rb
      create      test/fixtures/users.yml

$ rake db:migrate
== 20170119014258 CreateUsers: migrating ======================================
-- create_table(:users)
   -> 0.0481s
== 20170119014258 CreateUsers: migrated (0.0482s) =============================

$ git status
On branch branch_a
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   db/schema.rb

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        app/models/user.rb
        db/migrate/20170119014258_create_users.rb
        test/fixtures/users.yml
        test/models/user_test.rb

$ git add .
$ git commit -m "add user model"


2.git checkout branch_b で branch_b に切り替え、 rake db:migrate を行う

$ git checkout -b branch_b
$ git branch
  branch_a
* branch_b
  master

$ rake db:migrate #←ここでdiffが発生する
$ git diff
diff --git a/db/schema.rb b/db/schema.rb
index 305532e..1c0d0dc 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -10,7 +10,7 @@
 #
 # It's strongly recommended that you check this file into your version control system.

-ActiveRecord::Schema.define(version: 20161230062212) do
+ActiveRecord::Schema.define(version: 20170119014258) do

   # These are extensions that must be enabled in order to support this database
   enable_extension "plpgsql"
@@ -29,4 +29,10 @@ ActiveRecord::Schema.define(version: 20161230062212) do
     t.datetime "updated_at",  null: false
   end

+  create_table "users", force: :cascade do |t|
+    t.string   "name"
+    t.datetime "created_at", null: false
+    t.datetime "updated_at", null: false
+  end
+
 end

 現在の対応方法

branch_a で rake db:migrate:down VERSION=xxx でDBのschemaを元に戻してから、
branch_b へ切り替えるようにしています。

このような場合、皆さんどのように開発されてますか?
良い方法があればご教示ください

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

git stash
git stash apply を使うとよいとおもいます。
branch を変更する前に 未コミットのファイルを退避し、 別ブランチに行って返ってきたら、退避していたものを戻すことが可能です。

次の2つの操作例をみてください。
はじめの操作例は、質問文で述べられていた操作の真似です。(db/seed.rb の変更の代わりに x.txt ファイルに echo を使って変更を加えています)

[katoy@katoy-MacBook-Pro xxx (a)]$ git branch
* a
  b
  master

[katoy@katoy-MacBook-Pro xxx (a)]$ git status
On branch a
nothing to commit, working tree clean

[katoy@katoy-MacBook-Pro xxx (a)]$ echo "A" >> x.txt
[katoy@katoy-MacBook-Pro xxx (a)]$ git checkout b
M    x.txt
Switched to branch 'b'

[katoy@katoy-MacBook-Pro xxx (b)]$ git diff
diff --git a/x.txt b/x.txt
index 8b13789..1212ca5 100644
--- a/x.txt
+++ b/x.txt
@@ -1 +1,2 @@

+A

[katoy@katoy-MacBook-Pro xxx (b)]$ echo "B" >> x.txt
[katoy@katoy-MacBook-Pro xxx (b)]$ git diff
diff --git a/x.txt b/x.txt
index 8b13789..2b6e41a 100644
--- a/x.txt
+++ b/x.txt
@@ -1 +1,3 @@

+A
+B


branch b では x.txt に branch a での変更も入ってしまっています。

次は、stash をつかった操作です。

[katoy@katoy-MacBook-Pro xxx (a)]$ git branch
* a
  b
  master

[katoy@katoy-MacBook-Pro xxx (a)]$ git status
On branch a
nothing to commit, working tree clean

[katoy@katoy-MacBook-Pro xxx (a)]$ echo "A" >> x.txt
[katoy@katoy-MacBook-Pro xxx (a)]$ git stash
Saved working directory and index state WIP on a: 827ae56 init
HEAD is now at 827ae56 init

[katoy@katoy-MacBook-Pro xxx (a)]$ git checkout b
Switched to branch 'b'
[katoy@katoy-MacBook-Pro xxx (b)]$ echo "B" >> x.txt
[katoy@katoy-MacBook-Pro xxx (b)]$ git diff
diff --git a/x.txt b/x.txt
index 8b13789..bfff0f2 100644
--- a/x.txt
+++ b/x.txt
@@ -1 +1,2 @@

+B

[katoy@katoy-MacBook-Pro xxx (b)]$ git stash
Saved working directory and index state WIP on b: 827ae56 init
HEAD is now at 827ae56 init

[katoy@katoy-MacBook-Pro xxx (b)]$ git checkout a
Switched to branch 'a'
[katoy@katoy-MacBook-Pro xxx (a)]$ cat x.txt 

[katoy@katoy-MacBook-Pro xxx (a)]$ git stash list
stash@{0}: WIP on b: 827ae56 init
stash@{1}: WIP on a: 827ae56 init
stash@{2}: WIP on a: 827ae56 init
stash@{3}: WIP on a: 827ae56 init
stash@{4}: WIP on a: 827ae56 init

[katoy@katoy-MacBook-Pro xxx (a)]$ git stash apply stash@{1}
On branch a
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   x.txt

no changes added to commit (use "git add" and/or "git commit -a")
[katoy@katoy-MacBook-Pro xxx (a)]$ cat x.txt

A

branch a, branch b それぞれで、そのブランチでの変更だけをファイルに残すことができます。

参考情報

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/19 10:54

    丁寧な回答ありがとうございます。
    ファイルの変更に関してはおっしゃる通り、stashで対応できるかとおもいます。
    問題は データベースへmigrationを行った際に他のブランチの config/schema.rb に反映されてしまうところなんです。

    詳細な手順を質問に追加しました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Ruby

    7634questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

  • Ruby on Rails

    7238questions

    Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

  • Ruby on Rails 4

    2433questions

    Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

  • Git

    1271questions

    Gitはオープンソースの分散バージョン管理システム(DVCS)です。

  • PostgreSQL

    1058questions

    PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。