在 rails 上处理 ruby 时坚持使用 git,即使在还原提交后也无法撤消创建的表(模型)
stucking with git when working on ruby on rails, can't undo tables (models) created even after revert commits
- 首先我有我的应用程序并且我是 master,我创建了一个名为 "one" 的分支并切换到它。
- 我写了一些代码然后提交了,然后我创建了一个名为 "category" 的模型并提交了它
- 现在我不希望这个 table 不复存在,所以我想恢复到旧的提交。
- 我写了 "git log",当还没有创建类别 table 时,我得到了旧提交的 ssh,然后我从旧提交之一创建了一个新分支,新分支叫 "two",然后我切换到 "two" 分支
- 这意味着,现在在名为 "two" 的新分支上,我没有创建类别模型,因为该分支是根据分支 "one" 的旧提交创建的,其中没有创建类别模型还
- 但是我发现很奇怪,当在 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>
- 首先我有我的应用程序并且我是 master,我创建了一个名为 "one" 的分支并切换到它。
- 我写了一些代码然后提交了,然后我创建了一个名为 "category" 的模型并提交了它
- 现在我不希望这个 table 不复存在,所以我想恢复到旧的提交。
- 我写了 "git log",当还没有创建类别 table 时,我得到了旧提交的 ssh,然后我从旧提交之一创建了一个新分支,新分支叫 "two",然后我切换到 "two" 分支
- 这意味着,现在在名为 "two" 的新分支上,我没有创建类别模型,因为该分支是根据分支 "one" 的旧提交创建的,其中没有创建类别模型还
- 但是我发现很奇怪,当在 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>