如何在Git中的多个分支中进行并行开发和'small'合并
How to carry out parallel development and 'small' merges in multiple branches in Git
我们有一个主分支 m
,我们有一个线性历史并合并到通常相对较短生命周期的特征分支 F1
,F2
,...像这样:
* 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'合并LD
到Fn+1
,然后'unmerge'LD
合并Fn+1
到m
?由于 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
想法
我们有一个主分支 m
,我们有一个线性历史并合并到通常相对较短生命周期的特征分支 F1
,F2
,...像这样:
* 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'合并LD
到Fn+1
,然后'unmerge'LD
合并Fn+1
到m
?由于 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 中明确排除目录
- 编译代码时明确排除 class
DebugLogger
的代码 - ...
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
想法