如何将已签入的 Rails 迁移恢复到 git

How to revert a Rails migration that has been checked in to git

在我的 development/feature 分支上,我有一个带有 20150818113106_add_team_id_to_account.rb 的提交(向 Account 添加了一列)和应用迁移产生的 schema.rb。此提交已被推送,并且还存在于 origin/development/feature 上。

现在我想还原此更改 - 毕竟我不想将此列添加到 Account。我不知道是否应该因此恢复 git 提交,或 运行 a db:migrate:down 并提交其结果,或两者兼而有之。

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

rails g migration remove_team_id_from_accounts team_id:integer

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

解法(一)

您可以运行 回滚迁移:

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,然后提交并推送

您 运行 遇到了 rails 的常见问题:
数据库状态和程序代码状态是不同的东西。

尝试将这两个概念分开。

通常使用代码,您可以还原不需要的代码。

这里你还需要更新数据库状态。

如果已经向上迁移运行有两种选择:

  1. 使用rake db:down反向迁移。如果提交是最近的提交并且添加列的迁移只是 运行.

  2. ,这可能是一个不错的选择
  3. 使用另一个迁移删除该列。这可能是最干净的方法,特别是如果其他迁移不是最新的。

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

至于选择哪一个可能取决于迁移是否运行其他任何地方(除了您的本地环境)。如果迁移已在 CI 中 运行 进行暂存,或为其他拥有 运行 的开发人员拉取,那么您可能希望选择 'leave code and add a reversing migration' 而不是 运行在本地关闭,然后尝试恢复代码提交。一旦迁移到 运行 其他地方,您可能最好使用原始迁移,再加上另一次迁移(我本来打算称其为向下迁移,但这是不正确的,这将是两次向上迁移)以删除该列没有回复。