git - 将修补程序 merge 到 dev 和 master 中会导致分歧

标签 git branch

我正在关注 a success Git branching model (又名 git-flow)。

我按照完成修补程序分支部分的指导进行了修补程序。

我在 master 之外创建了一个hotfix 分支:

> git checkout -b hotfix upstream/master

做了一些工作并手动将其 merge 到master:

> git checkout master 
> git merge --no-ff hotfix

然后手动将其 merge 回dev:

> git checkout dev
> git merge --no-ff hotfix

我做了更多工作 - 针对 dev 进行了提交。一切似乎都很好。但是当我去 merge devmaster 时,它不能。

> git checkout master
> git merge --ff-only dev
fatal: Not possible to fast-forward, aborting.

hotfix 的 merge 提交似乎是不同之处。

我假设遵循这个过程会保持共同的历史记录。我做错了什么?

最佳答案

您没有提供有关历史拓扑结构的细节,因此从一般情况开始并创建 hotfix 给出

$ git checkout -b hotfix upstream/master
$ git lola
* 81a514a (dev) Stupendous feature
* cb4d5e6 Great feature
* d4a7906 Cool feature
| * 39e449a (HEAD, upstream/master, hotfix) v0.2
|/
* 264ddbc (master) v0.1

备注:git lola是一个非标准但非常有用的别名。

merge hotfixmaster 给出

*   567f066 (HEAD, master) Merge branch 'hotfix'
|\
| * 1b1b6e3 (hotfix) Fix nasty bug
| * 39e449a (upstream/master) v0.2
|/
| * 81a514a (dev) Stupendous feature
| * cb4d5e6 Great feature
| * d4a7906 Cool feature
|/
* 264ddbc v0.1

hotfix 单独 merge 到 dev 是偏离正轨的地方。

*   36aa1c8 (HEAD, dev) Merge branch 'hotfix' into dev
|\
* | 81a514a Stupendous feature
* | cb4d5e6 Great feature
* | d4a7906 Cool feature
| | *   567f066 (master) Merge branch 'hotfix'
| | |\
| |/ /
|/| /
| |/
| * 1b1b6e3 (hotfix) Fix nasty bug
| * 39e449a (upstream/master) v0.2
|/
* 264ddbc v0.1

此时,master 不是dev 的直接祖先,而是它的兄弟。

dev 添加更多提交使 master 成为他的叔叔。

* d89aa74 (HEAD, dev) Jason does it again
* a4dd5bf Jason saves the day
*   36aa1c8 Merge branch 'hotfix' into dev
|\
* | 81a514a Stupendous feature
* | cb4d5e6 Great feature
* | d4a7906 Cool feature
| | *   567f066 (master) Merge branch 'hotfix'
| | |\
| |/ /
|/| /
| |/
| * 1b1b6e3 (hotfix) Fix nasty bug
| * 39e449a (upstream/master) v0.2
|/
* 264ddbc v0.1

回想一下,dev 通过功能分支并通过 --no-ff merge 到达 master。也许 release-1.0 从您的修补程序开始并获得另一个错误修复。

* f0398ba (HEAD, release-1.0) Bugfix for v1.0
* d89aa74 (dev) Jason does it again
* a4dd5bf Jason saves the day
*   36aa1c8 Merge branch 'hotfix' into dev
|\
* | 81a514a Stupendous feature
* | cb4d5e6 Great feature
* | d4a7906 Cool feature
| | *   567f066 (master) Merge branch 'hotfix'
| | |\
| |/ /
|/| /
| |/
| * 1b1b6e3 (hotfix) Fix nasty bug
| * 39e449a (upstream/master) v0.2
|/
* 264ddbc v0.1

假设按下释放按钮,这将返回到 master

$ git merge --no-ff -m "v1.0" release-1.0
$ git lola
*   5a384c8 (HEAD, master) v1.0
|\
| * f0398ba (release-1.0) Bugfix for v1.0
| * d89aa74 (dev) Jason does it again
| * a4dd5bf Jason saves the day
| *   36aa1c8 Merge branch 'hotfix' into dev
| |\
| * | 81a514a Stupendous feature
| * | cb4d5e6 Great feature
| * | d4a7906 Cool feature
* | |   567f066 Merge branch 'hotfix'
|\ \ \
| |/ /
|/| /
| |/
| * 1b1b6e3 (hotfix) Fix nasty bug
| * 39e449a (upstream/master) v0.2
|/
* 264ddbc v0.1

当然,具体的解决方案取决于您的病史。

关于git - 将修补程序 merge 到 dev 和 master 中会导致分歧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21337169/

相关文章:

git - 如何在 Git/HG/Bzr 中找到当前版本的最新标签?

mercurial - merge Mercurial 中的分支

git - 在 GitLab 中设置 PuTTY 创建的 SSH key

git - 从 github.com 中删除贡献者?

eclipse - 如何在 Windows 上通过 SSH 使用 EGit?

git - 递归保留目录和所有子目录,文件除外

c++ - Boost,在存储库中插入静态库

mercurial - 如何按名称更新到分支?

npm - 如何安装react-admin的 `next`分支?

version-control - 如何获取按最近使用顺序排列的 Mercurial (hg) 书签列表?