git - git-flow 是否在某些分支上强制执行线性历史

标签 git git-flow

我仍在尝试从 git 转向 git-flow。我知道我可以在 git-flow 中使用任何类型的 git 功能,但我最感兴趣的是它自动处理的内容。

假设有两个开发人员 Alice 和 Bob,分别负责功能 A 和 B。当 Alice 完成后,她可以执行 git flow feature finish A 以基于提交 C 在她的本地 develop 分支上创建 merge 提交。现在如果 Bob 在以下位置完成他的功能同时,他获取了相同的东西,他的 merge 提交也将基于 C。现在如果 Alice 推送然后 bob 再次获取,他将不得不 merge 或 rebase ,我们最终会在develop 分支,以防他 merge 。

到目前为止这是正确的,还是 git-flow 以某种方式自动处理这种情况?如果有某种自动机制,必须设置什么才能使其工作?

最简单的解决方案可能是在完成功能之前始终获取 develop。但是我不确定这是否真的可行,具体取决于存储库的共享方式(当时可能不可用)。

编辑(问题的澄清):

正如答案所暗示的,我的例子并不清楚。所以首先一张我认为是问题的图片:

C 是开发分支上的初始提交。

Alice 在功能分支上创建了一些功能工作:

develop    feature/A
|           |
v           v
C-A1-A2-A3-A4

同时 Bob 也在为另一个功能工作

C-A1-A2-A3-A4
 \
  B1-B2-B3-B4

现在 Alice 完成了功能并添加了 merge 提交以开发(我想要那个)。

  A1-A2-A3-A4
 /           \
C-  -  -  -   MA

现在 Bob 完成了该功能并再次添加 merge 提交以开发(我也想要那个,只是在另一个地方:

  A1-A2-A3-A4
 /           \
C-  -  -  -   MA <- develop for Alice
 \
  \ -  -  -   - MB <-develop for Bob
   \           /
    B1-B2-B3-B4

但是现在 Alice 或 Bob 必须 merge 开发,创建一个额外的提交:

  A1-A2-A3-A4
 /           \
C-  -  -  -   MA-MAB <- I don't want this MAB commit
 \               / 
  \ -  -  -   - MB <-develop for Bob
   \           /
    B1-B2-B3-B4

我想要的是这样的:

  A1-A2-A3-A4
 /           \
C-  -  -  -   MA-MB
 \               / 
  B1-B2-B3-B4- -

如您所见,历史仍然是非线性的,但是开发分支的主线仅包含来自功能的 merge 提交(并且没有其他情况下的其他 merge 提交)。

我喜欢这个的一点是,您可以轻松地跟踪历史记录中的更改,并查看它们是否属于以前的功能分支,或者它们是否在开发中 merge 。所有这些信息都可以直接从 DAG 中获取。

此外,如果您在开发中为您的 merge 提交使用了良好的消息,在第二种情况下,您可以通过始终遵循开发中的第一个父级轻松地导出变更日志。但是,在第二种情况下,您有时只需要跟随第一个 parent ,有时甚至不止一个 parent 。而且我看不出什么时候可以编码的简单方法。

最佳答案

git-flow 不会那样做。

它旨在支持 the branching model described here (对于 Git 开发人员推荐的各种东西,这真的只是一幅漂亮的图画)。 该图片包含 merge 。您会在整个文本中看到相同的内容。在每种类型的分支下,您会看到它们应该 merge 到的分支类型。有一些示例命令,使用 --no-ff 强制避免线性历史记录,而是记录 merge 提交。

这是一个真正使用 Git 的工作流程,而 Git 的核心优势之一就是分支和 merge 。这个工作流程在 merge 时蓬勃发展;非线性历史不仅不可避免,而且需要

您应该从工作流程的描述中阅读标题为“在开发中 merge 已完成的功能”的部分。简短的引述:

The --no-ff flag causes the merge to always create a new commit object, even if the merge could be performed with a fast-forward. This avoids losing information about the historical existence of a feature branch and groups together all commits that together added the feature.

...

Unfortunately, I have not found a way to make --no-ff the default behaviour of git merge yet, but it really should be.

你想要那些 merge 提交。你真的会。

关于git - git-flow 是否在某些分支上强制执行线性历史,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8807245/

相关文章:

git - 将可执行文件放在 Ubuntu 的 git 项目中

git - 适用于 Windows 的 Vim - 我应该输入什么来保存和退出文件?

java - 在 Java 项目中获取所有构建错误的最快方法是什么?

atlassian-sourcetree - Sourcetree - 升级到最新版本,缺少 git-flow

Git Flow 发布完成 - 权限被拒绝

Git 克隆过程失败,出现 curl 56 错误

git - 推送前多次提交

git - 从另一个分支在 Git 中创建一个分支

Git - 将 master merge 回 develop?

git-flow:制作 "release candidates"/QA 网络 Artifact 的工作流程