Bob*_*Bob 1 git merge merge-conflict-resolution
我正在使用Flyway跟踪数据库更改,并使用git进行版本控制。
Flyway取决于迁移脚本,每个迁移脚本都以递增的编号命名。
现在,我遇到以下情况:在两个单独的分支(分别称为A和B)上开发了两个功能,都需要更改数据库。两位开发人员都为其分支机构的数据库创建了迁移脚本。当他们大约在同一时间从master分支出来时,他们都为迁移脚本分配了相同的文件名:V42__migration.sql。
现在,分支A合并为master。合并分支B时,由于V42__migration.sql文件原因,发生了合并冲突。解决此冲突的正确方法是将分支B的迁移脚本重命名为V43__migration.sql。但是,在合并git时,尝试将两个文件合并为一个,实际上我实际上需要两个文件都未更改,但是将其重命名。
解决这种与git合并冲突的最佳方法是什么?
git报告冲突后,您会迅速提示您,并且完全能够按照所需的任何方式来编辑索引,以解决冲突。因此,如果您要合并feature_x,则可以:
1)获取分支的脚本并将其命名为V43
git checkout feature_X -- V42__migration.sql
mv V42__migration.sql V43__migration.sql
Run Code Online (Sandbox Code Playgroud)
2)从先前合并的提交中获取V42脚本
git checkout HEAD -- V42__migration.sql
Run Code Online (Sandbox Code Playgroud)
3)确保索引正确更新并完成合并
git add .
git commit
Run Code Online (Sandbox Code Playgroud)
继续考虑的另一件事是,您真的不希望git尝试合并这些文件。因此,您可以使用.gitattributes将文件标记为二进制文件,或对它们应用自定义合并类型。我会假设使用一种模式whatever/path/to/V*__migration.sql来识别文件。
这个想法是,如果git认为必须合并这样的路径,它应该自动标记一个冲突,并且应该选择一个或另一个版本作为暂定解决方案。解决冲突的人然后只需要放置其他版本即可。
从逻辑上讲,在合并过程中保留“我们的”是有意义的,因为那是最终将获得该文件名的版本。如果将路径标记为二进制,就会发生这种情况。
但是,如果保留“他们的”,务实的解决方案会更简单。
mv conflicted_file next_filename
git checkout HEAD -- conflicted_file
Run Code Online (Sandbox Code Playgroud)
因此,您可能想在gitattributes文档中查找如何创建自定义合并驱动程序。(它并不像听起来那样难;驱动程序可以是类似的东西cp %B %A && false。因此只需几个配置命令。)