在 rails 上处理 ruby 时坚持使用 git,即使在还原提交后也无法撤消创建的表(模型)

stucking with git when working on ruby on rails, can't undo tables (models) created even after revert commits

  1. 首先我有我的应用程序并且我是 master,我创建了一个名为 "one" 的分支并切换到它。
  2. 我写了一些代码然后提交了,然后我创建了一个名为 "category" 的模型并提交了它
  3. 现在我不希望这个 table 不复存在,所以我想恢复到旧的提交。
  4. 我写了 "git log",当还没有创建类别 table 时,我得到了旧提交的 ssh,然后我从旧提交之一创建了一个新分支,新分支叫 "two",然后我切换到 "two" 分支
  5. 这意味着,现在在名为 "two" 的新分支上,我没有创建类别模型,因为该分支是根据分支 "one" 的旧提交创建的,其中没有创建类别模型还
  6. 但是我发现很奇怪,当在 sublime text 上打开应用程序时,没有名为 category 的模型,也没有针对名为 category 的模型的迁移......而当尝试查看数据库时使用 "db browser for sqlite" 的应用程序,即使在刷新后我仍然看到类别模型存在,并且当尝试在分支 "two" 上创建类别模型并迁移它时,出现错误指出类别模型已经存在....

所以这怎么会发生,你知道有什么方法可以恢复提交并完全删除之前创建的 table 吗?

即使您删除了迁移文件,table 也已经创建。因此,您可以创建迁移以删除 table 或使用当前模式重新创建数据库,该模式没有类别迁移。

原因是 - 一旦迁移 运行s,就会创建 table。无论应用程序中的文件如何,它将一直保留在那里直到被删除或更改。所以你必须创建一个迁移来删除它,然后 运行 在创建它之后。

创建迁移

rails g migration drop_category_table

在文件里面

def change
  drop_table :category
end

如果使用 git 回滚无法解决这个问题,我建议通过迁移删除 table。在您的情况下,您可以执行以下操作:

在Terminal/Command中:rails g migration DropCategoryTable

class DropCategoryTable < ActiveRecord::Migration
  def up
    drop_table :category
  end

  def down
    # recreate table logic here
  end
end

然后回到 Terminal/Command:rails db:migrate

您的数据库是您的应用程序的独立实体,因此它的状态不是您的版本控制或 git 存储库的一部分......当您还原提交因为还原提交只会删除模型和迁移文件,但不会删除数据库本身table

所以你必须在恢复你的提交之前回滚数据库迁移。

rake db:rollback

在你 git 还原之前。

结论:要删除 table,您有两个选择之一

第一个选项

"回滚以从数据库中删除模型 + git 登录以获取您拥有的所有 git 版本的列表并选择其中一个版本 + 检出 git 的旧版本并创建它的一个分支,它将删除已删除模型的左侧迁移和模型文件

rake db:rollback
git log
git checkout -b old-state 0d1d7fc32

第二个选项

“回滚以删除模型 + rails 销毁以删除左侧的迁移和模型文件,无需检出文件已被删除的旧版本 git”

  rake db:rollback
  rails destroy model <model_name>