管理 Git 个分行和支行?

Managing Git branches and subbranches?

我正在尝试弄清楚如何管理 Git 分支,以便我的开发过程有一个正确且可读的流程。

基本上我们有一个master分支,一个project分支,那么我们就可以在这个project分支下开始开发features了。我也想做支行。

假设我有 master -> project -> feature 1 -> feature 1 sub 1 ...

我在 Hg 中得到的结果如下所示:

我在git下实际得到的是:

基本上,整个开发流程都丢失了,1 年内将无法知道 "Interface refactoring" 是相关的并且是 "Duplication of speed model" 的子部分。

此外,我正在避免快进合并,因为它只是失去了对所有历史记录的跟踪,但几个月后我什至无法判断 "Update necessary setExecutionMode" 是在 [=39 下完成的=] 而不是 "Duplication of ..."

我正在认真考虑回到 Hg 并使用插件在 Hg 和 Git 之间架起一座桥梁,因为 Git 非常不友好,但我也非常想使用公司工具,因为它仍然是现代高效的 SCM(不像 SVN 或 CVS)。

我仍然认为我可以得到我想要的,我只是不明白如何。
我做错了什么?

Git 没有 Mercurial 调用的 "named branches." 相反,Git 调用的 "branches" 与 Mercurial 调用的 bookmarks 非常相似。有几点不同:

  • 在Git中,每个头都必须有一个分支指针,否则它被认为是半不存在的(一个"detached HEAD")并且可能在一段时间后被垃圾收集。这样的头像不会出现在版本库历史中,但可以从 reflog 中检索到。这与 Mercurial 形成对比,后者的书签完全是可选的。
  • Git 始终保持 "remote branches",而 Mercurial 仅在本地和远程书签出现分歧时才这样做(您会收到 "divergent bookmarks" 警告和名称类似于 foo@default 被添加到存储库)。这意味着 Git 的本地分支必须在拉取后手动快进,而 Mercurial 会在拉取时自动快进本地书签。
  • 在 Mercurial 中,@ 是一个特殊的书签,可能存在也可能不存在。如果是,克隆会默认检查它。它可以用作指向主干(默认分支)的指针,尽管这不是它的唯一用途。在 Git 中,@ 是当前提交的 shorthand,而 "main" 分支被称为 master.

如果你需要类似 Mercurial 的分支,你应该使用 Mercurial 而不是 Git。

Mercurial 分支是附加到提交的字符串。 Git 提交没有这样的专用字符串,但您可以在主题中添加关键字:

  • EDF合并速度倍增
  • DSPEED 东西
  • REFACTOR_INTERFACE东西

有些人放了一个来自 bugtracker 的数字

此外,由于您无论如何都使用非快进合并,因此可以使用命令请求哪些提交对合并有贡献

git log *mergehash*~1..*mergehash*

这个范围查询也可以是各种UI,例如gitk(在视图定义中)和GitExtentions(在分支选择器中)