Django:合并迁移冲突的最佳方式

Django: Best way to merge migrations conflicts

我目前正在开发一个 dev 分支,有一天我需要将它合并到 master。我的 dev 分支上有多达 20 个迁移文件,目前在 master 分支上有大约相同的数量。我需要在两个分支上进行迁移,这将导致迁移具有相同的前缀,

(例如 0003_auto

换句话说,如果您有由 makemigrations 生成的具有相同前缀的迁移文件,那么 best/secure 的处理方式是什么。

以下是我自己认为的两种方式(可能完全错误):

  1. 删除所有迁移文件,合并代码,然后运行一个新的makemigrationsmigrate,这将导致只有一个迁移文件。

  2. 使用 --merge 标志让 django 进行合并:

    makemigrations --merge
    

现在,了解所有这些后,我想知道处理此问题的最佳方法是什么。一般来说,我应该使用什么来正确合并冲突,并在每次模型更新时为我的项目提供一个新版本。

编辑

我认为提供一个循序渐进的解决方案对我和未来的用户来说是理想的,因为有大量关于这个主题的信息,但似乎没有一个是简洁明了的。

准备就绪后,您应该从 master 分支合并到您的开发分支。那时你应该解决所有冲突,你的迁移应该在 master 的迁移之后进行,并且在所有这些之后你的数据库应该看起来像你想要的那样。

由于这个过程需要时间,而且非常痛苦,所以大多数人都认为生命周期短的开发分支。这样你需要一次处理一个或两个迁移文件。

来自Django docs

Because migrations are stored in version control, you’ll occasionally come across situations where you and another developer have both committed a migration to the same app at the same time, resulting in two migrations with the same number.

Don’t worry - the numbers are just there for developers’ reference, Django just cares that each migration has a different name [emphasis added].

无忧无虑地执行此操作的最简单方法是:

  1. 恢复到稳定点(冲突前):

python manage.py migrate usersmaster 0021_signup_status

  1. 删除新的迁移文件。

  2. 重新迁移:

python manage.py makemigrations

您可以使用 django-migration-fixer

解决迁移错误

可以使用

修复开发分支上的迁移
$ git checkout [dev-branch]
$ git merge [main/master]

按照安装说明进行操作here

运行

$ python manage.py makemigrations --fix -b [main/master]

提交更改并推送到远程分支

$ git add .
$ git commit -am ...
$ git push ...