在持续重构的项目中使用 git/mercurial?

2024-03-29

我试图了解我是否真的有使用 git/mercurial 的情况。

我工作的项目是java和c#项目,通常有5-20人致力于 一个共同的目标(“发布”)。大多数开发人员都是专业开发人员 重构代码一直。所以典型的linux内核有大量的 单独文件中相对独立的更改,我们有不断的重构更改 - 经常打一个lot文件和一个lot的代码。这里没有人害怕更改代码。

现在,通过 subversion,我们可以通过非常接近 SVN HEAD 来解决这个问题。我们中的一些人甚至有 自动 svn up 在构建服务器的 jabber 广播上触发。我们大多数人也都学会了 (或者快速学习)如何规划我们的工作以保持接近 SVN HEAD。如果您正在进行重大重构,我们 逐渐将源树向新方向弯曲,而不是消失太久。有时你只是计划 重构操作并从竞争较少的领域开始。几年后 以这种方式工作就成为第二天性。我们大多数人永远不会离开低于自己的“舒适区” 距离svn头2小时。自动化构建和 svn head 是项目“pulse”,我们喜欢它。

当然,我们对每个版本进行分支,但是从发布分支返回到主干的反向合并数量会减少 下降得足够快,可以忽略不计(我们有不错的测试覆盖率)。与源声音的私人分支一起运行几天/几周 就像我们积极想要阻止的事情一样,但这种情况并不经常发生。

git 和 Mercurial 听起来都很酷,git 更酷一点,因为我更像是 McGyver 类型,而不是詹姆斯邦德类型。 但当谈到构建实际切换的案例时,感觉莱纳斯和我生活在两个不同的星球上。 大多数时候我们want我们的团队继续专注于 HEAD。

GIT 如何让我的版本控制更好? GIT 如何让我改进我的流程?我是颠覆恐龙吗?


从心态上来说,有时能够创建一个软分支,执行软分支中的所有更改,测试软分支中更改的结果,然后当软分支“完成”时会有一个好处”,在本地将其与主分支重新集成,重新测试,然后传播。

在某些情况下,这比匆忙的头脑要好,因为您不会因为其他调试代码的存在而不断中断,从而弄乱您的代码以添加非错误来处理。

这也意味着您可以更频繁地提交,提供更全面的历史记录,因为提交不会立即出现在任何地方,从而产生问题。

此外,当协调软分支与共享主线时,您可以看到一个很好的完整变更集,向您显示所有集体变更以及它们的所有集体变更,这为良好的代码审查机会打开了大门。

此外,从测试的角度来看,如果您有更多的软分支,您可以在将软分支合并回主分支之前运行测试,并制定一个标准,根据该标准,分支不会合并回主分支分支直到有

  1. 自行通过测试
  2. 主分支更改已协调到软分支后通过测试

从而为您提供了代码质量的额外保证,因为您的主要协作分支非常干净,因为不允许出现失败的代码。

(这也限制了解决问题的领域,因为大部分情况下你只需要测试自己的更改,当你“完成”时,你才需要担心其他人做了什么,以及他们做了什么还应该通过测试,这意味着当某事does失败了,你只需要看看是什么you确实解决了问题)

但我会持续更新吗 中央仓库进入我的软分支? 这确实是我的本质 问题

分支系统的美妙之处在于,您可以根据需要将“其他人认为稳定的任何内容”拉入本地副本。

“持续更新”变得没有必要,因为你不会再出现同样的问题。

a  b   center
         |
         |
         /      Key:   / - | \   = Flow
/----<---|             < >       = Flow Directions
|  /--<--/             *         = Commit 
*  |     |             T         = Test
|  *     |             M         = Merging with "Current" state of common branch
*  |     |             C         = Tests Complete and Current state is "sane"
|  *     |
T  |     |
|  T     |
|  C     |
|  |/-<--/
*  M     |
|  T     |
*  C     |
|  \--->-\
*  /---<-/
T  |     |
C  *     |
|/-----<-/
M  |     |
T  *     |
|  T     |
*  C     |
|  |/-<--/
*  M     |
T  T     |
C  \-->--\
|/---<---/
M        |
T        |
C        |
\---->---\
         |

此外,由于系统的工作方式,稍后也可能会发生这种情况:

a  b   center
|  |     |
T  |     |
C  *     |
|/</     |
M  |     |
|  *     |
T        |
C        |
|/----<--/
M        |
T        |
C        |
\-->-----\
         |

在这种情况下,他们作为“头”的整个概念就消失了。如果有几十个头,你看到哪一个就容易透视。

我还可以补充一点,这些逻辑分支虽然在这里显示为单独的,但可以非常可行地表示单独的结帐位置,或者仅表示单个计算机上的不同软分支。 a 和 b 实际上可以是单个开发人员。

本质上,“从主分支持续更新我的软分支”在概念上是没有意义的。因为事实上,还会有一些变化尚未在主分支中体现出来,你什么时候才能知道它们是否已被推送? SVN 给你一种“单一”代码状态的错误幻觉,而实际上,当用户在文本编辑器中打开文件的那一刻,他们实际上创建了一个生命周期非常短的软分支,这是一种正在发生的变化,没有人知道这一点,并且为了让这种幻觉以您认为的方式持续下去,实际上,用户必须在每个字符之后进行提交,这几乎不切实际。所以在现实中,人们习惯了不同地点彼此“不同步”的事实,并学习解决它的方法,这样它就不再是问题了。

另外,“用其他人的更改不断更新我的树”有一个核心问题,即你有太多的干扰,你不断受到其他人正在做的所有事情的轰炸,如果他们正在制作一系列 1 line 承诺测试他们无法在自己的机器上测试的东西,然后你就会因为不断变化的文件而陷入噩梦,而用户看到看似随机的变化却无法理解它们。

通过允许提交之间的运行时间更长,然后查看最终结果batches并且只看到最终结果您的同行的所有更改都会立即发生,您可以立即看到自您签出以来更改了哪些代码,以及它对您的代码意味着什么的连贯概述,因此您可以编写自己的代码并完成它。

如果您有任何疑问

从简单的事情开始,不要突然转变,DSCM 中的一些概念可能有点令人畏惧(我见过许多人未能理解垂直堆叠软分支的概念),移动一个小的非- Git/Mercurial 代码库的重要组成部分,并使用它一段时间,尝试其优点和功能。没有比亲自体验更好的证据了,我所有可爱的解释都不太可能传达你需要理解的内容,只能通过尝试和失败几次来学习(因为失败是学习的关键部分)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在持续重构的项目中使用 git/mercurial? 的相关文章

随机推荐