2

我有一个 Git 存储库,它有一个 master 分支。现在我想创建在每个分支(例如数据库)中具有相同更改的不同分支。所以我可以在master中有这些文件:

  • 一个.java
  • b.java
  • 数据库-1.xml

和两个分支,称为branch-1branch-2,带有这些文件:

  • 一个.java
  • b.java
  • 数据库分支 1.xml

  • 一个.java
  • b.java
  • 数据库分支 2.xml

现在,让我在 中找到一个错误a.java,显然我想修复它并在每个分支中提交相同的更改。我怎样才能实现我的目标?

注意:数据库文件必须保持不同,其他文件将始终相同。

4

3 回答 3

4

合并。但最好在只有 database-1.xml 的公共起点更改文件 a.java,否则它将被破坏。

樱桃采摘是另一种方式。但是以这种方式管理分支机构很快就会变得难以管理。

这就提出了关于部署配置的问题。您不应该仅仅因为您的配置会根据您的部署位置而发生变化而进行分支。使 database.xml 根本不起作用。依靠部署脚本或涂抹/清理脚本来根据您的部署位置调整配置 - 甚至在本地。

这意味着配置应该具有您需要的结构,但仅在需要的区域进行调整 - 通常只是一个连接字符串。

想想当您需要调整必须跨越所有分支的数据库文件中的某些内容时会发生什么。

于 2012-08-14T21:13:54.677 回答
2

可能的解决方案取决于您的工作流程。

选项 1:重写历史
如果您不将分支推送到远程存储库,您可以在分支上提交错误修复,因为这是文件的共同起点a.java。之后,您可以重新调整每个分支以包含此更改。

选项 1a:仅重写主题分支的历史
另一个工作流基于约定。您可以在推送分支时将主题分支推送到服务器。惯例是,这些主题分支永远不会合并到主分支中,并且允许重写历史。主题分支可以是一个开发人员私有的,也可以在其他人之间共享。对于后一种情况,小组必须在变基发生之前和之后进行协调。主题分支工作完成后,分支会根据分支重新设置基础,并且可以轻松应用快进分支。

选项 2:Cherry pick
如果您将分支推送到远程存储库,则不建议重写历史记录。简而言之,您唯一的选择是在每个分支的顶部提交一个错误修复。为了避免两次做同样的工作,git cherry-pick推荐的命令是(正如亚当和阿尔伯特已经说过的那样)。

选项 3:将 master 合并回每个主题分支
这是亚当答案的 git 部分。您可以在master分支上提交错误修复,这是受影响文件的公共起点。然后,您可以将master合并回主题分支。这实际上与使用同时在分支上发生的所有更改更新主题分支相同。这个缺点是您不能单独选择错误修复。这是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
于 2012-08-14T21:23:25.860 回答
1

尝试git-cherry-pick应用特定的提交:git-cherry-pick

于 2012-08-14T21:13:19.617 回答