在我当前的项目中,我们有三个分支; master
、dev
和 hotfix
。
当要实现新功能时,开发人员将从master
创建一个新的feature_branch
。当功能准备好进行审核和测试时,开发人员将创建 pull 请求以将 feature_branch
merge 到 dev
中。 merge 后,将构建并部署开发和测试环境(来自 dev
分支)。在这个环境中将会进行一些测试和质量保证。
测试完成后,开发人员将打开从 feature_branch
到 master
的 pull 请求。 merge 到 master
后,将开始构建并部署到登台和生产。
这工作正常,唯一的问题是 pull 请求 merge 所做的不同 merge 提交使得分支看起来不同。在 Azure DevOps(这是我们的 DevOps 环境)中的分支 View 中,dev
分支似乎比比较分支(这是 master
)落后 1 次提交,领先 1 次提交> 分支)。这是因为 dev
分支有一个 master 分支没有的提交(从 feature_branch
merge 到 dev
的 PR),并且缺少master
分支拥有的一个(从 feature_branch
merge 到 master
的 PR)。
有没有好的方法可以让 dev
和 master
分支在这里显得相等?
这三个分支背后的想法是,如果存在错误,我们可以从 master
分支创建一个 bugfix_branch
并从 打开一个 pull 请求bugfix_branch
到 hotfix
分支。 merge 到 hotfix
分支将构建并部署一个测试环境,可以在其中单独测试错误修复。一旦错误修复获得批准,开发人员将从 bugfix_branch
向 master
发起 pull 请求。
hotfix
分支也将与 dev
和 master
不同。
预先感谢您的帮助。
最佳答案
假设以下历史记录:
* 99a48ee (feature_branch) Add feature a
* 499665a (HEAD -> dev, master) Initial commit
从 feature_branch 到 dev 的 merge 将创建 merge 提交:
git merge --no-ff feature_branch
* 8aa6422 (HEAD -> dev) Merge branch 'feature_branch' into dev
|\
| * 99a48ee (feature_branch) Add feature a
|/
* 499665a (master) Initial commit
Once the testing is complete, the developer will open a pull request from the feature_branch into master.
这是非常规的一点。您最终将得到以下结果:
git checkout master
git merge --no-ff feature_branch
* 9a3f2e7 (HEAD -> master) Merge branch 'feature_branch'
|\
| | * 8aa6422 (dev) Merge branch 'feature_branch' into dev
| | |\
| |/ /
|/| /
| |/
| * 99a48ee (feature_branch) Add feature a
|/
* 499665a Initial commit
这看起来已经是错误的了! dev
现在是 [前面 1,后面 1]
,因为它包含 8aa6422 并缺少 9a3f2e7。
dev 8aa6422 [ahead 1, behind 1] Merge branch 'feature_branch' into dev
feature_branch 99a48ee [behind 1] Add feature a
* master 9a3f2e7 Merge branch 'feature_branch'
不应该将功能分支 merge 到 master 中,而应该将 dev merge 到 master 中。让我们用上面最新 merge 之前的存储库状态来尝试一下。
git reset --hard HEAD^ # rollback the merge we just did above
git merge --no-ff dev
* c59be01 (HEAD -> master) Merge branch 'dev'
|\
| * 8aa6422 (dev) Merge branch 'feature_branch' into dev
| |\
|/ /
| * 99a48ee (feature_branch) Add feature a
|/
* 499665a Initial commit
看起来更好,没有重叠的线! dev
不再既领先又落后,它只是落后,因为它没有 merge 到 master。
dev 8aa6422 [behind 1] Merge branch 'feature_branch' into dev
feature_branch 99a48ee [behind 2] Add feature a
* master c59be01 Merge branch 'dev'
它们不一样,但它们只是在后面,所以如果你做同样的事情,它们将来会完全 merge 。
如果您确实希望它们相同,则需要快进 merge 而不是创建 merge 提交。让我们再倒回看看它是什么样子的:
git reset --hard HEAD^ # rollback again
git merge dev # without --no-ff will default to --ff (fast forward)
* 8aa6422 (HEAD -> master, dev) Merge branch 'feature_branch' into dev
|\
| * 99a48ee (feature_branch) Add feature a
|/
* 499665a Initial commit
现在 master 和 dev 是相同的!
dev 8aa6422 Merge branch 'feature_branch' into dev
feature_branch 99a48ee [behind 1] Add feature a
* master 8aa6422 Merge branch 'feature_branch' into dev
关于Git 分支策略 - pull 请求创建 merge 提交,使分支看起来不同,而文件相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60379859/