我创建了一个迁移,运行rake db:migrate
,这突破了我的db / schema.rb版本号。然后我做了一个git fetch origin master
,看到我的团队成员发生了变化。我做了一个git stash
和一个git rebase FETCH_HEAD
,然后是git stash pop
。这导致db / schema.rb与版本号冲突。
Upstream>>>
ActiveRecord::Schema.define(:version => 20110930179257) do
===========
ActiveRecord::Schema.define(:version => 20110930161932) do
<<<Stashed
我认为适当的修复方法是手动将版本号增加到高于上游的值。
这是明智的还是坏消息?
谢谢, 最大
答案 0 :(得分:87)
如果您当前的数据库具有正确的架构,您应该:
运行待定迁移(如果有)
rake db:migrate
从当前数据库架构中覆盖schema.rb
rake db:schema:dump
并提交
答案 1 :(得分:19)
当我发现自己遇到这种冲突时,我只是迁移数据库。无论是否有未决的迁移,冲突都将得到纠正。
答案 2 :(得分:7)
根据this answer,冲突得到保证。用户必须手动合并,并将版本设置为两者中的较高者。
答案 3 :(得分:2)
以下是将master合并到我的功能分支时对db / schema.rb中的冲突进行故障排除时的操作:
{{1}}
答案 4 :(得分:1)
~/bin/update-schema-rb
:
#!/usr/bin/env bash
git co master
bin/rake db:reset db:seed
git co -
bin/rake db:migrate
答案 5 :(得分:1)
接受上游版本并像往常一样运行rake db:migrate
。
不用担心您创建的迁移(这些迁移在上游版本20110930179257
下)。 ActiveRecord使用表schema_migrations
放置所有已运行的迁移。如果您的迁移不在列表中,而是在db/migrate
目录中,则ActiveRecord将运行它们。
很容易以为实际上就是这一行:
ActiveRecord::Schema.define(:version => 20110930179257)
定义了最新的迁移运行,因此不会运行低于该版本的迁移。幸运的是,这不是事实。 Rails将运行db/migrate
文件夹中但尚未在schema_migrations
表中的所有迁移。
答案 6 :(得分:0)
一个选项是拥有一个只有添加剂的手动版本脚本。你想要冲突。如果你没有掌握它,那么Schema会让你很难受。因此,一旦被咬,两次害羞,我不介意保持架构和查询信息(客户类型列表)只有添加剂的变更管理方案。
答案 7 :(得分:0)
我认为最好的方法是使用仅存在于当前分支上的迁移来rake db:drop db:create db:migrate
重新生成模式。这样,来自其他分支的迁移不会泄漏到您的模式文件中,以后会让您头疼 - 如果您经常切换分支。