【问题标题】:Managing Git branches and subbranches?管理 Git 分支和子分支?
【发布时间】:2015-09-01 14:46:31
【问题描述】:

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

基本上我们有一个master分支,一个project分支,那么我们就可以在这个project分支下开始开发特性了。我也希望能够做支行。

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

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

我在 git 下实际得到的是这样的:

基本上整个开发流程都丢失了,1年的时间就没有办法知道“接口重构”是不是跟“复制速度模型”的一个子部分有关。

此外,我正在避免快进合并,因为它只是丢失了所有历史记录,但在几个月后,我什至无法判断“更新必要的 setExecutionMode”是在“InterfaceRefactoring”下完成的,而不是“...的重复”

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

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

【问题讨论】:

  • 我建议您实际查看您的 Git 网络图,以便更准确地了解分支结构的外观。
  • 在 git 中,分支只是指向提交的指针。它不包含历史信息。我很好奇你如何避免快进合并。您是否进行了额外的提交以确保发生合并?
  • 什么是 git 网络图?
  • Wolf:有一个 tortoiseGit 合并选项:无快进(命令行:--no-ff)。它强制合并。

标签: git mercurial git-branch branching-and-merging


【解决方案1】:

Git 没有 Mercurial 所说的“命名分支”。相反,Git 所称的“分支”与 Mercurial 所称的 bookmarks 非常相似。有一些区别:

  • 在 Git 中,每个头都必须有一个分支指针,否则它会被视为半不存在(“分离的头”),并且可能会在一段时间后被垃圾收集。这些头不会出现在存储库历史记录中,但可以从reflog 中检索。这与 Mercurial 形成鲜明对比,后者的书签是完全可选的。
  • Git 一直维护“远程分支”,而 Mercurial 仅在本地和远程书签出现分歧时才这样做(您会收到“分歧书签”警告,并且名称类似于 foo@default 的书签已添加到存储库中) .这意味着 Git 的本地分支必须在拉取后手动快进,而 Mercurial 会在拉取时自动快进本地书签。
  • 在 Mercurial 中,@ 是一个特殊的书签,它可能存在也可能不存在。如果是这样,克隆会默认将其检出。它可以用作指向主干(默认分支)的指针,尽管这不是它的唯一用途。在 Git 中,@ 是当前提交的简写,而“主”分支则称为 master

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

【讨论】:

  • 谢谢。请不要说,如果我可以使用 Mercurial,我肯定会:)
【解决方案2】:

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

  • EDF 合并速度复制
  • DSPEED 东西
  • REFACTOR_INTERFACE 的东西

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

【讨论】:

  • 一般来说,功能请求和错误无论如何都应该出现在错误跟踪器中,因此无论 Git 还是 Mercurial,在大多数提交消息中添加错误编号都是一种好习惯。
【解决方案3】:

此外,由于您仍然使用非快进合并,因此可以使用命令请求哪些提交有助于合并

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-22
    • 1970-01-01
    • 2011-03-09
    • 2014-09-08
    • 1970-01-01
    • 1970-01-01
    • 2013-07-07
    相关资源
    最近更新 更多