dvcs-“克隆到分支”是常见的工作流程吗?


9

我最近正在与一位同事讨论dvc,因为我们的办公室开始考虑从TFS切换(我们是一家MS商店)。在此过程中,我感到非常困惑,因为他说尽管他使用Mercurial,但他没有听说过“分支”或“结帐”命令,这些术语对他来说并不陌生。在想知道他可能不了解它们并解释了dvcs分支如何在您的本地文件上“就地”工作之后,他感到非常困惑。

他解释说,类似于TFS的工作原理,当他想创建一个“分支”时,可以通过克隆来完成,因此他拥有回购协议的完整副本。这对我来说确实很奇怪,但是我必须承认的好处是,由于文件是分开的,因此您可以同时查看或处理两个分支。

在搜索此站点以查看是否有人问过这个问题之前,我看到有评论说许多在线资源都在推广这种“从分支到分支”的方法,这使发布者感到沮丧。这实际上在dvcs社区中很常见吗?这样做的利弊是什么?我永远都不会这样做,因为我不需要一次看到多个分支,切换速度很快,而且我不需要所有克隆都填满我的磁盘。


7
这是CVS和SVN工作流程的

1
@JarrodRoberson-仅当您约束自己的工作方式时git。有了hg这通常是第一个工作流教导,它仍然是一个非常有用的一个。
Mark Booth 2012年

Answers:


3

除了可以看到两个分支的一般优势/劣势之外,我认为这样做还有Mercurial的特定优势。

如果克隆以创建分支,则如果不想保留所做的更改,则可以稍后删除该克隆。如果您决定合并它们,那么其他人将看不到您决定以这种方式将更改分开的事实。

相比之下,如果hg branch用于创建新的命名分支,则在您提交时,分支名称会记录在历史记录中,其他所有人都可以看到,并且必须相当唯一,以避免以后出现潜在的混乱。如果您的分支机构是为了开发某些实验性功能,或者所做的更改可能很小,那么这可能不合适。

如果您使用命名分支来维护软件的发行版本,并使用它们来开发短期功能或错误修正,则很容易感到困惑,因为没有办法(除命名约定外)将这两种分支分开。

http://mercurial.selenic.com/wiki/StandardBranching对此进行了更详细的说明。还值得一提的是,自Mercurial 1.8起,就可以创建书签(hg bookmark)-短暂分支的一次性名称。可以推,拉,到处移动和删除书签。


2
我没有使用Mercurial,但是Git没有这个问题。我可以整天在本地分支,合并到开发分支,进行推送,而无需查看我的分支名称。
Andrew T Finnell 2012年

3
@AndrewFinnell:并不是真的适合这个问题,但是我想说这不一定是一个问题-Mercurial工作中命名分支的方式也有一些优势。例如,您可以查看最初在哪个分支上进行提交,这对了解很有用。
benj 2012年

1
@AndrewFinnell-我确实很想念命名分支git,因为他们已经习惯了hg。另外,git branchhg的自动创建未命名分支相比,每次创建一个分支都要记住明确地烦人。
Mark Booth 2012年

您仍然可以使用捆绑的扩展名删除hg中的分支。通过使用“阶段”,Mercurial现在更好地支持历史修改
dukeofgaming 2012年

2

每次在DVCS中进行提交时,从技术上讲,您都是在历史记录中进行分支,每次将其推回到有福的存储库中时,您都会将其集成回去,这是有趣的部分:

  • 如果在提交期间没有人进行更改,则它看起来不会像DAG中的分支(有向无环图)
  • 如果其他人在提交期间进行了更改,则它看起来像DAG中的分支,只是未命名

还记得Bitbucket / github?中的“ fork”按钮,fork可以看作是分支的同义词,“ fork”按钮的作用只是该存储库到您帐户的克隆。

“克隆到分支”的唯一优点是能够在历史记录的两个点上同时工作,而具有讽刺意味的是,对于您的同事来说,这是一个可以同时在不同分支上工作的通用工作流(而不必来回移动) )。

告诉您的同事学习如何分支,这很容易,这里有一个教程:

D:\>mkdir lol

D:\>cd lol

D:\lol>hg init

D:\lol>hg branch
default

D:\lol>touch lol

D:\lol>hg add lol

D:\lol>hg commit -m "lol"

D:\lol>hg branch lol
marked working directory as branch lol
(branches are permanent and global, did you want a bookmark?)

D:\lol>hg branches
default                        0:35d562fafaf2

D:\lol>echo "lol" > lol

D:\lol>hg commit -m "New lol branch"

D:\lol>hg branches
lol                            1:9384f923e78d
default                        0:35d562fafaf2 (inactive)

D:\lol>hg branch
lol

D:\lol>hg update default
1 files updated, 0 files merged, 0 files removed, 0 files unresolved

D:\lol>hg branch
default

D:\lol>hg update lol
1 files updated, 0 files merged, 0 files removed, 0 files unresolved

D:\lol>hg branch
lol

D:\lol>hg update default
1 files updated, 0 files merged, 0 files removed, 0 files unresolved

D:\lol>hg branch
default

D:\lol>hg merge lol
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)

D:\lol>hg commit -m "lol merge"

D:\lol>hg branch
default

D:\lol>hg update lol
0 files updated, 0 files merged, 0 files removed, 0 files unresolved

D:\lol>hg branch
lol

当您同时在不同的分支中工作,或者想要尝试在历史记录中不创建永久分支但仍能够将其集成到现有分支中的情况下进行实验,“克隆分支”很有意义。

我个人不喜欢这种做法,并且喜欢做分支并在必要时关闭它们。在这里,这是您的操作方式:

D:\lol>hg branches
default                        2:46420aca1612
lol                            1:9384f923e78d (inactive)

D:\lol>hg branch
lol

D:\lol>hg commit --close-branch -m "Obai, glorious lol branch"

D:\lol>hg branches
default                        2:46420aca1612

D:\lol>hg branch
lol

D:\lol>hg update default
0 files updated, 0 files merged, 0 files removed, 0 files unresolved

D:\lol>hg branches
default                        2:46420aca1612

D:\lol>hg branches --closed
default                        2:46420aca1612
lol                            3:4b79c577e029 (closed)

希望这可以消除您对DVCS分支的疑虑,这里的分支不再令人恐惧。


0

我个人不会担心代码会填满磁盘...首先,这只是代码,其次,您不会永远保留所有克隆。

许多在线资源都推广了这种方法,尤其是对于汞。我从未见过将其用于生产环境,在CI环境中,具有短暂功能的分支比其他存储库克隆更为常见。我看不出这样做的好处,即使有什么事情会使您的历史更加混乱,而不是更少,这也不会给您带来任何好处。如果要与旧代码并排查看新代码,可以使用diff / merge工具查看彼此相邻的两个提交,其附加优点是您将看到突出显示的更改。


我已经在生产中广泛使用了hg。能够在多个hg存储库之间进行推拉是一种非常强大的协作工具。只有能够从非裸存储库中提取git信息,才能大大限制此类工作流程的选择。
Mark Booth
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.