簡體   English   中英

管理 Git 操作創建的 schema.rb 中的沖突

[英]Managing conflict in schema.rb created by Git operation

我創建了一個遷移,運行rake db:migrate ,這增加了我的 db/schema.rb 版本號。 然后我做了一個git fetch origin master ,看到我的團隊成員有變化。 所以我做了一個git stash和一個git rebase FETCH_HEAD ,然后是一個git stash pop 這導致 db/schema.rb 中的版本號沖突。

Upstream>>>
ActiveRecord::Schema.define(:version => 20110930179257) do
===========
ActiveRecord::Schema.define(:version => 20110930161932) do
<<<Stashed

我認為適當的解決方法是手動將版本號增加到高於上游的版本號。

這是明智的,還是壞消息?

謝謝,馬克斯

如果您當前的數據庫具有正確的架構,您應該:

  • 運行掛起的遷移(如果有)

     rake db:migrate
  • 從您當前的數據庫架構覆蓋您的schema.rb

     rake db:schema:dump
  • 並提交

當我發現自己遇到這種沖突時,我只需遷移數據庫。 無論是否有待處理的遷移,沖突都會得到糾正。

域名

接受上游版本並像往常一樣運行rake db:migrate

為什么這是要走的路

不要擔心您創建的遷移(低於上游版本20110930179257 )。 ActiveRecord 使用表schema_migrations將所有已運行的遷移放在其中。 如果您的遷移不在列表中,而是在db/migrate目錄中,則 ActiveRecord 將運行它們。

這是表格,以便您可以更好地對其進行可視化: schema_migrations 表

人們很容易認為實際上是這一行: ActiveRecord::Schema.define(:version => 20110930179257)定義了最新的遷移運行,因此不會運行低於它的版本的遷移。 幸運的是,事實並非如此。 Rails 將運行db/migrate文件夾中但還沒有在schema_migrations表中的任何遷移。

根據這個答案,沖突是有保證的。 用戶必須手動合並,並將版本設置為兩者中較高的版本。

以下是我在將 master 合並到我的功能分支時執行的操作,以解決 db/schema.rb 中的沖突:

$ git merge --abort
$ git checkout master
$ rake db:drop db:create db:migrate
$ git checkout -- db/schema.rb
$ git checkout my_feature_branch
$ rake db:migrate
$ git add db/schema.rb
$ git commit -m 'Updated schema'
$ git merge master

~/bin/update-schema-rb :

#!/usr/bin/env bash

git co master
bin/rake db:reset db:seed
git co -
bin/rake db:migrate

我覺得最好的方法是執行rake db:drop db:create db:migrate以使用僅存在於當前分支上的rake db:drop db:create db:migrate來重新生成模式。 這樣,從其他分支的遷移就不會泄漏到您的架構文件中,並在以后讓您頭疼——以防您頻繁切換分支。

一個選項是使用手動版本腳本,該腳本僅可添加。 你想要沖突。 如果你不掌握它,Schema 就會讓你很難受。 因此,一旦被咬,兩次害羞,我不介意將架構和查找信息(客戶類型列表)與僅添加的更改管理方案保持一致。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM