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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby

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

Git

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

PostgreSQL

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

Ruby on Rails

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

Ruby on Rails 4

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

Q&A

1回答

4320閲覧

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

satoshih

総合スコア797

Ruby

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

Git

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

PostgreSQL

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

Ruby on Rails

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

Ruby on Rails 4

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

0グッド

0クリップ

投稿2017/01/18 10:08

編集2022/01/12 10:55

環境

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

実現したいこと

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

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

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

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

詳細な手順

  1. branch_arails 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_bbranch_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_arake db:migrate:down VERSION=xxx でDBのschemaを元に戻してから、
branch_b へ切り替えるようにしています。

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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/18 14:27

編集2017/01/19 14:25
katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

satoshih

2017/01/19 01:54

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問