如何将已签入的Rails迁移还原为git

时间:2015-08-31 12:02:17

标签: ruby-on-rails git rails-migrations

在我的development/feature分支机构上,我提交了20150818113106_add_team_id_to_account.rb(向Account添加了一列)&应用迁移所产生的schema.rb。此提交已被推送,& origin/development/feature也存在。

现在我想恢复此更改 - 毕竟我不想将此列添加到Account。如果我应该恢复git提交,或者运行db:migrate:down&提交那个或两者的结果,或两者都没有。

3 个答案:

答案 0 :(得分:2)

您可以使用以下命令创建另一个迁移文件,该命令将删除该列。

rails g migration remove_team_id_from_accounts team_id:integer

稍后执行rake db:migrate提交并推送到git。

答案 1 :(得分:2)

解决方案(1)

您可以运行以下命令来回滚迁移:

rake db:migrate:down VERSION=2015081811310

然后从存储库中删除迁移,如下所示:

git rm 20150818113106_add_team_id_to_account.rb

然后推送这些更改,如果在服务器上部署,请再次执行这些步骤。

解决方案(2)

创建另一个迁移以删除此列,如下所示:

rails g migration remove_team_id_from_accounts team_id:integer 

然后rake db:migrate,然后提交&按

答案 2 :(得分:2)

您在使用rails遇到了一个常见问题:
数据库状态和程序代码状态是不同的东西。

尝试将这两个概念分开。

通常使用代码可以恢复不需要的代码。

然而,您还需要更新数据库状态。

如果已经运行了迁移,则有两种选择:

  1. 使用rake db:down撤消迁移。如果提交是最近提交的,并且刚刚运行了添加列的迁移,这可能是一个不错的选择。

  2. 使用其他迁移删除列。这可能是最干净的方法,特别是如果其他迁移不是最新的。

  3. 如果迁移已在您的数据库实例上运行 ,那么您可以只恢复代码提交,或者在更复杂的情况下进行新提交以删除代码。

    关于选择哪个可能取决于迁移是否已在其他任何地方运行(除了您的本地环境)。如果已在CI中进行迁移以进行暂存,或者已经为其他已经运行它的开发人员进行了迁移,那么您可能希望选择“保留代码并添加反向迁移”。而不是在本地运行,然后尝试恢复代码提交。迁移已在其他地方运行后,您可能最好使用原始迁移,再加上另一次迁移(我将称之为向下迁移,但这不正确,这将是两次向上迁移)以删除列还原