乱序合并 ActiveRecord 迁移
Merging ActiveRecord migrations out of order
假设我在 git
开发我的 Rails
应用程序,并且我有两个分支,每个分支都有自己的迁移。
1) branch001
通过迁移创建一个名为 tableA
的 table 20160101000000_create_table_A
2) branch002
通过迁移创建一个名为 tableB
的 table 20160101000001_create_table_B
很明显,第二次迁移的时间戳是在第一次之后创建的。
但是假设我先将 branch002
合并到 master
,因为它先准备好了。我的架构文件变成 -
ActiveRecord::Schema.define(version: 20160101000001) do
....
end
模式版本告诉 activerecord 它已经修补到比我的第一个分支 level/version 更大 。
当我终于开始合并我的第一个分支时会发生什么?
- 架构版本会退回到
20160101000000
吗?
- 会不会有任何问题 运行 第一个分支的迁移,因为模式看到它已经 "patched" 并跳过它?
- 一般来说,处理此类事情的最佳做法是什么?我是否应该使用更新的新时间戳重命名第一个分支?
谢谢!
编辑 -
真的想知道当我将第二个分支合并到 master
时我应该如何解决合并冲突。我应该将它保留为较晚的时间戳还是将其退回到较早的时间戳?
<<<<<<< HEAD (master)
ActiveRecord::Schema.define(version: 20160101000001) do
=======
ActiveRecord::Schema.define(version: 20160101000000) do
>>>>>>> 282cda7... Adding Table B
如果发生冲突,您应该select两者中较大的那个。但无论您选择什么,它都不会影响实际迁移。
如果您选择较小的数字,那么下次您 运行 rake db:migrate
它将更改此数字(变为较大的数字)并且您的 schema.rb
和没有迁移。这不是问题 - 只是你的提交会有点奇怪。
Rails rake task 运行s 它找到的所有迁移并且在 schema_migrations
table 中没有值。然后它取最高的迁移时间戳并将这个时间戳放入schema.rb
。整个迁移想法不是基于某些 "most recent timestamp"(模式版本),而是基于 schema_migrations
table 的内容,其中包含它已经 运行 的所有迁移时间戳。所以通过这个table它保证没有迁移被跳过。
非常简短的版本是事情通常很好:假设迁移不会相互干扰(例如,一个删除 table 但另一个假设它仍然存在)你不应该 运行 陷入困境。
虽然您的架构文件中只有一个版本号,但当您 运行 迁移时 rails 会将迁移文件列表与 schema_migrations
table 和 运行s 任何尚未 运行 的迁移,即使有更多最近的迁移已经 运行。
就架构冲突而言,我个人只会 运行 迁移,这将重新生成 schema.rb。
假设我在 git
开发我的 Rails
应用程序,并且我有两个分支,每个分支都有自己的迁移。
1) branch001
通过迁移创建一个名为 tableA
的 table 20160101000000_create_table_A
2) branch002
通过迁移创建一个名为 tableB
的 table 20160101000001_create_table_B
很明显,第二次迁移的时间戳是在第一次之后创建的。
但是假设我先将 branch002
合并到 master
,因为它先准备好了。我的架构文件变成 -
ActiveRecord::Schema.define(version: 20160101000001) do
....
end
模式版本告诉 activerecord 它已经修补到比我的第一个分支 level/version 更大 。
当我终于开始合并我的第一个分支时会发生什么?
- 架构版本会退回到
20160101000000
吗? - 会不会有任何问题 运行 第一个分支的迁移,因为模式看到它已经 "patched" 并跳过它?
- 一般来说,处理此类事情的最佳做法是什么?我是否应该使用更新的新时间戳重命名第一个分支?
谢谢!
编辑 -
真的想知道当我将第二个分支合并到 master
时我应该如何解决合并冲突。我应该将它保留为较晚的时间戳还是将其退回到较早的时间戳?
<<<<<<< HEAD (master)
ActiveRecord::Schema.define(version: 20160101000001) do
=======
ActiveRecord::Schema.define(version: 20160101000000) do
>>>>>>> 282cda7... Adding Table B
如果发生冲突,您应该select两者中较大的那个。但无论您选择什么,它都不会影响实际迁移。
如果您选择较小的数字,那么下次您 运行 rake db:migrate
它将更改此数字(变为较大的数字)并且您的 schema.rb
和没有迁移。这不是问题 - 只是你的提交会有点奇怪。
Rails rake task 运行s 它找到的所有迁移并且在 schema_migrations
table 中没有值。然后它取最高的迁移时间戳并将这个时间戳放入schema.rb
。整个迁移想法不是基于某些 "most recent timestamp"(模式版本),而是基于 schema_migrations
table 的内容,其中包含它已经 运行 的所有迁移时间戳。所以通过这个table它保证没有迁移被跳过。
非常简短的版本是事情通常很好:假设迁移不会相互干扰(例如,一个删除 table 但另一个假设它仍然存在)你不应该 运行 陷入困境。
虽然您的架构文件中只有一个版本号,但当您 运行 迁移时 rails 会将迁移文件列表与 schema_migrations
table 和 运行s 任何尚未 运行 的迁移,即使有更多最近的迁移已经 运行。
就架构冲突而言,我个人只会 运行 迁移,这将重新生成 schema.rb。