Git 分支策略 - pull 请求创建 merge 提交,使分支看起来不同,而文件相同

标签 git pull-request branching-and-merging

在我当前的项目中,我们有三个分支; masterdevhotfix

当要实现新功能时,开发人员将从master创建一个新的feature_branch。当功能准备好进行审核和测试时,开发人员将创建 pull 请求以将 feature_branch merge 到 dev 中。 merge 后,将构建并部署开发和测试环境(来自 dev 分支)。在这个环境中将会进行一些测试和质量保证。

测试完成后,开发人员将打开从 feature_branchmaster 的 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)。

有没有好的方法可以让 devmaster 分支在这里显得相等?

这三个分支背后的想法是,如果存在错误,我们可以从 master 分支创建一个 bugfix_branch 并从 打开一个 pull 请求bugfix_branchhotfix 分支。 merge 到 hotfix 分支将构建并部署一个测试环境,可以在其中单独测试错误修复。一旦错误修复获得批准,开发人员将从 bugfix_branchmaster 发起 pull 请求。

hotfix 分支也将与 devmaster 不同。

预先感谢您的帮助。

最佳答案

假设以下历史记录:

* 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/

相关文章:

git - 在 git 中继续处理包含正在审查的 PR 的分支的正确方法是什么?

git - 如何直接将 github pull request merge 到我的私有(private)仓库?

git - 在 GitHub 上更新 pull 请求后如何恢复审查过程?

GitHub - 如何直观地查看两个分支之间的文件差异?

git - 在 git 中恢复 merge 提交后强制 merge

svn - 当 SVN merge 失败而 Mercurial 成功时

python 脚本执行 git 命令并在 html 页面上显示输出

php - git push php 和主机 key 验证失败

mysql - 有没有一种方便的方法可以在我的 git 提交中包含一个 mysqldump?

git - 在 Git 仓库中管理非代码资源的最佳方式