2017-02-23 31 views
0

我用SVN并有3 environments凡使用Git(分行或中继)

  • 发展环境
  • 试制环境
  • 生产环境

实际工作, 一个该团队将与trunk一起工作。

我们想迁移到Git。 我们应该在开发环境中工作?

我们应该与分支机构合作,当我们将代码上传到生产环境时,将分支机构重新集成到主机(中继线)?

回答

1

Git和SVN对提交和分支的“思考”非常不同。具体而言,Git 没有中继线

在其他版本控制系统中,分支和分支名称非常稳固(并且相应地非常重),在某些情况下完全不可分割。例如,在Mercurial中,一旦某个分支提交了,那个提交是分支,而只有那个分支,永远。 (在SVN中,分支是非常重的,但不同于Mercurial与Git相比,我喜欢使用Mercurial作为比较器,因为Git和Mercurial都是分布式,而SVN是集中式的。也从根本上改变了怎么一个使用版本控制。混帐允许你指定一个中央同步资料库,但它是可选的,而不是强制性的。)

与此相反,在Git中,分支是一个微小的,轻量级的东西,的几乎不重要。它只是一个人类可读的名称提交,与另一个特殊属性。 Git有两个方便的,人类可读的提交名称:分支名称和标签名称。它们之间最大的区别是分支名称是假设移动 - 以便Git自动移动 - 并且标签名称不够,这样Git可以防止您意外移动它们。

注意这个区别小心,在Git中,分支之间,和分支,呃,东西或 - 其他。 Git并没有完全做出这样的区分。至少有两种不同的东西,都称为“一个分支”。关于这方面的更多信息,请参阅What exactly do we mean by "branch"?我会尽量总结一下,说实际的历史 - 构成一个分支的一组事件是由提交本身构成的。承诺,一旦提出,永久和不变。没有人 - 不是你,也不是Git-可以改变一个提交,因为它的哈希ID--它的“真实名称”,它是完全不可读的 - 是其内容的加密散列。更改这些内容的一个位,并更改哈希ID,以便您有一个新的不同的提交。

每次提交含有作为它的数据的一部分,其(直接祖先)的ID提交,或用于多个父多个ID提交,如果所述提交是合并提交。就是这些形成分支的ID链,它在Git中形成分支,这意味着任何给定的提交可能同时在多个分支上。在某些情况下,一个提交可能在没有分支!

当你做一个新的提交时,Git通过将其提交到存储库数据库并将其父设置为当前提交,将新提交添加到当前分支。因此,总是存在当前提交,其被称为HEAD。一旦新提交被永久安全地保存,Git就会将新提交的ID写入分支名称。 HEAD实际上是作为一个文件实现的,但该文件通常只包含当前分支的名称。它是提供当前提交的哈希ID的分支到提交ID映射。

分公司名称可以添加和删除在任何时间,虽然在脚注1中,移除分支名可以,如果这些提交有没有其他名通过找到他们,放弃提交到了冷酷的死神收藏家。

因为所有这些,Git应该以一种非常不同的方式使用。你可以并且应该在帽子下方创建新的分支。当你完成任何需要分支的任务时,合并它,重新分配它,重新压缩它,或者扔掉它,无论你想要什么:所有这些都非常快。当你完成后,无论提交你有的历史,你查看历史通过启动Git出一些分行名称或其他起点(标签,甚至原始提交散列ID,例如)。它会向您显示这些具体的提交,然后显示他们的父母以及他们父母的父母等等,一直回到第一位(无父母,或根)提交。


永久,即,除了 “抛弃” 提交(和其他GIT中的对象)。这些最终是垃圾收集使用git gc。分支名称服务额外的目的:他们保护承诺从这样的收集。但是,任何名称分支名称,标签名称,来自git stash命令的stash,来自git notes的任何notes名称等都将保护提交。然后该提交保护其父提交,回溯所有提交历史。

这条规则有一个例外。必须要处理一个空的仓库,它根本没有任何提交。这个例外也用于所谓的孤儿未出生的分支(某些Git使用第一学期,一些使用第二学期),但大多数人只会在新的空知识库中看到异常。