如何在Git中的多个分支中进行并行开发和'small'合并

How to carry out parallel development and 'small' merges in multiple branches in Git

我们有一个主分支 m,我们有一个线性历史并合并到通常相对较短生命周期的特征分支 F1F2,...像这样:

*   343b52f - (11 days ago) Merge branch 'F495' into 'master' - Torque
|\
| * 52fc5a2 - (11 days ago) Add various QOL tools to make working inside Docker more convenient - Torque
|/
*   1eaa8df - (2 weeks ago) Merge branch 'F494' into 'master' - Boss
|\
| * 9758e64 - (2 weeks ago) Use company-php-commons as source for custom DQL functions - Boss
| * 2c8ee88 - (2 weeks ago) Upgrade to latest company-php-commons (for custom DQL functions) - Boss
|/
*   a1d7acc - (3 weeks ago) Merge branch 'F493' into 'master' - Coworker
|\
| * 149ead1 - (3 weeks ago) Update: Device Amount Calculation - Coworker
|/
*   f69c844 - (3 weeks ago) Merge branch 'F492' into 'master' - Torque
[...]

功能分支并不总是这个短;我不想让 post 膨胀太多。现在,我们正在计划一个新的、长期存在的分支来实现更好的调试日志记录,LD。在该分支中,我们将提交改进现有代码库中的日志记录,我们不想每隔一天将其合并到 master 中,而是在认为完成后合并它。

我们希望在未来的功能分支 Fn+1 中从这些变化中获益(仅在开发期间!),但我们不太清楚如何 - 我们是基于未完成的 LD 分支,一旦我们想将 Fn+1 合并到 master m 中,我看不出 LD 提交如何不会过早地进入 m

有没有办法'temporarily'合并LDFn+1,然后'unmerge'LD合并Fn+1m ?由于 LD 仅包含核心产品中的代码,而 Fn+1 将几乎完全包含孤立的 类 中的(日志记录)代码,我们不希望,或者至少很少,查看合并冲突 and/or 代码路径冲突。

开发新功能-

结账最新 LD:

git checkout LD

创建一个新的功能分支:

git checkout -b f500

在功能分支中做一些事情:

git add ...
git commit ...
git add ...
git commit ...

既然您想在 master 中进行这些更改,请执行变基:

git rebase --onto m LD

这将“移动”您的 f500 分支,就像它从 master 分支出来一样。

但是请注意,如果您的任何 f500 代码依赖于 LD 相关代码,它将无法正常工作,因为 LD 代码不在 master 中,因此请确保您从未实际提交LD依赖代码

最简单的方法是设法以某种方式在 master 中提交代码。

您仍然可以将它从您的生产版本中排除;根据您使用的语言,您可以:

  • 从您的版本 tar.gz
  • 中明确排除目录 debuglogger
  • 编译代码时明确排除 class DebugLogger 的代码
  • ...

一种 hacky 方式:

project/
├── .git
├── debuglogger    # version debuglogger in a separate repo
│   ├── .git       # and clone it locally on the developers' laptops
│   └── sourcefile
├── dir1
├── dir2
├── sourcefile1
├── sourcefile2
...

如果您在工作机器上克隆 debuglogger

  • 运行 git 来自主项目的命令将完全忽略此子目录
  • 您必须在项目代码中添加一个开关,以尽可能包含来自 debuglogger 的代码,例如:
    • 如果 env = dev,包括 debuglogger
    • 如果 DebugLogger class 可用,加载它
    • 如果存在 debuglogger/,请将其包含在您的编译脚本中
    • ...

当您认为您的功能准备就绪时,您可以将其包含在您的主项目中,既可以作为单个提交,也可以导入其历史记录(例如使用 git subtree)。

此设置的 hacky 部分是:它打破了“提交应代表整个项目”的一般 git 想法