我有一个Git存储库,它有一个主分支。现在我想创建不同的分支,在每个分支(例如数据库)中具有相同的更改。所以我可以将这些文件放在 master :
中以及两个分支,名为 branch-1 和 branch-2 ,包含以下文件:
和
现在,让我在a.java
中找到一个错误,显然我想修复它并在每个分支中提交相同的更改。我怎样才能实现目标?
注意:数据库文件必须保持不同,其他文件将始终保持不变。
答案 0 :(得分:4)
合并。但是最好在只有database-1.xml的公共起点处更改文件a.java,否则会被破坏。
Cherry pick是另一种方式。但是,通过这种方式管理分支机构很快就会无法管理。
这提出了有关部署配置的观点。您不应该仅仅因为您的配置根据您部署的位置而发生变化而进行分支。使database.xml完全不起作用。依靠部署脚本或涂抹/清理脚本来根据您部署的位置调整配置 - 甚至是本地调整。
这意味着配置应该具有您需要的结构,但只能在需要的区域进行调整 - 通常只是连接字符串。
想想当你需要在数据库文件中调整必须跨越所有分支的东西时会发生什么。
答案 1 :(得分:2)
可能的解决方案取决于您的工作流程。
选项1:重写历史记录
如果您不推送分支到远程存储库,您可以在主分支上提交错误修复,因为这是文件a.java
的公共起点。之后,您可以重新定义每个分支以包含此更改。
选项1a:仅重写主题分支的历史记录
另一个工作流程基于惯例。您可以在推送主分支时将主题分支推送到服务器。惯例是,那些主题分支从未合并到主,允许重写历史。主题分支可以是一个开发人员私有的,也可以是其他人共享的。对于后一种情况,该组必须在rebase发生之前和之后进行协调。完成主题分支工作后,分支将针对主进行重新定位,并且可以轻松应用快进分支。
选项2:樱桃选择
如果将分支推送到远程存储库,则不建议重写历史记录。简而言之,您唯一的选择是在每个分支的顶部提交错误修复。为了避免两次做同样的工作,git cherry-pick
是推荐的命令(正如Adam和Albert已经说过的那样)。
选项3:将主人合并回每个主题分支
这是亚当答案的混合部分。您可以在主分支上提交错误修复,这是受影响文件的常见起点。然后,您可以将 master 合并回主题分支。这实际上与使用主分支上发生的所有更改更新主题分支相同。这个缺点是你不能单独选择bugfix。这是git cherry-pick
允许的内容(参见选项2)。
注意:强>
如果您不计划合并这两个分支,您实际上可以在每个分支上使用相同的database-1.xml
文件进行特定配置。
项目设置
除了使用git的不同方法之外,我完全赞同Adam的答案,因为你应该重新考虑你的项目设置并创建一个允许你指定不同环境的配置文件。一个很好的例子就是您可能知道的RubyOnRails项目的数据库配置文件。
// Rails project: config/database.yml
development:
adapter: sqlite3
database: db/development.sqlite3
pool: 5
timeout: 5000
test:
adapter: sqlite3
database: db/test.sqlite3
pool: 5
timeout: 5000
production:
adapter: mysql2
encoding: utf8
reconnect: false
database: myapp_production
pool: 5
username: username
password: password
socket: /var/run/mysqld/mysqld.sock
答案 2 :(得分:1)
尝试git-cherry-pick
应用特定提交:git-cherry-pick