我正试图找出如何管理git分支,以便为我的开发过程提供一个正确且可读的流程。
基本上,我们有一个主分支,一个项目分支,然后我们可以开始在这个项目分支下开发特性。我也希望能做支行。
假设我有主->项目->功能1->功能1子1…
我在hg中得到的结果是这样的:
我在git下面得到的是:
基本上,整个开发流程都丢失了,在一年内,我们将无法知道“接口重构”是相关的,也是“速度模型复制”的一个子部分。
此外,我正在避免快进合并,因为它只是失去了所有的历史记录,但仍然,在几个月内,甚至我将无法告诉“更新必要的setExecutionMode”是在“interfaceRefactoring”下完成的,而不是“复制…”。
我正在认真考虑回到hg并使用一个插件在hg和git之间架起一座桥梁,因为git非常不友好,但我也非常想使用公司的工具,因为它仍然是一个现代和高效的scm(不像svn或cvs)。
我仍然认为我可以得到我想要的,我只是不明白如何。
我做错什么了?
最佳答案
git没有mercurial所称的“命名分支”,相反,git所称的“分支”与mercurial所称的bookmarks非常相似。有几个不同点:
在Git中,每个头必须有一个分支指针,或者它被认为是半不存在的(一个“独立的头”),并且可能在一段时间后被垃圾收集起来。这些头不会出现在存储库历史记录中,但可以从reflog中检索。这与Mercurial不同,Mercurial的书签是完全可选的。
git始终维护“远程分支”,而mercurial只在本地和远程书签出现分歧时才这样做(您会收到“分歧书签”警告,并且存储库中会添加一个名为foo@default
的书签)。这意味着git的本地分支必须在pull之后手动快速转发,而mercurial则在pull时自动快速转发本地书签。
在水银中,@
是一个特殊的书签,它可能存在,也可能不存在。如果是,则默认情况下克隆会将其签出。它可以用作指向主干(默认分支)的指针,尽管这不是它的唯一用途。在git中,@
是当前提交的简写,而“main”分支被称为master
。
如果您需要像mercurial一样的分支,应该使用mercurial而不是git。