Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git中对分支的需求_Git - Fatal编程技术网

Git中对分支的需求

Git中对分支的需求,git,Git,我已经使用Git一段时间了,我想知道在Git中构造分支是否真的有必要 Git分支可以看作是指向特定提交的指针。以下是一个工作流: 1.git签出主机//在主分支上 2.发展 3.git签出-b新功能 4.git commit-a-m闪亮的新特性完成了! 5.切换到主分支 6.git merge newFeature//快进 7.git分支-d新特性 这样一个简单的任务涉及7个步骤。当然,创建newFeature分支可能是不必要的——我们可以只在master本身上工作。但是如果我们消除分支的概念,

我已经使用Git一段时间了,我想知道在Git中构造分支是否真的有必要

Git分支可以看作是指向特定提交的指针。以下是一个工作流: 1.git签出主机//在主分支上 2.发展 3.git签出-b新功能 4.git commit-a-m闪亮的新特性完成了! 5.切换到主分支 6.git merge newFeature//快进 7.git分支-d新特性

这样一个简单的任务涉及7个步骤。当然,创建newFeature分支可能是不必要的——我们可以只在master本身上工作。但是如果我们消除分支的概念,那么第5步到第7步就没有必要了

摆脱分支还可以将我们从分离的头状态中解救出来,并且每次签出与分支无关的提交时都会显示警告


某些其他VCS可能需要分支。但是为什么Git需要分支呢?如果只是使用和引用提交,难道不能以更高的效率完成所有事情吗?每个Git提交都已经有一个或多个指针记录其父关系。

分支名称只是一种方便,这一点是正确的。然而,摆脱它们并不能使我们摆脱超然的头脑:这意味着我们总是有超然的头脑。这会产生深远的影响,因为包括分支名称在内的引用也会保留提交。但我们可以想象这样一个系统,它不是真的,比如Mercurial

注意,在任何基于提交的版本控制系统中,我们都有当前提交的概念。这就是我们从VCS中提取到工作树中的提交,以便我们可以使用它或处理它。由于每个Git提交的真实名称显然是一个随机的hash ID,如deadc0ffee或feedbeef或其他什么,因此我们必须在下面的某个地方注意到有趣的hash ID。当然,最有趣的一个是当前的一个;所以我们注意到,向下写一个散列ID到我们可以使用名称@或HEAD访问的内容中

这是Git中的一个分离头。它只是头部,它总是分离的,所以在你建议的设置中,我们根本不需要形容词分离

当然,现在我们需要允许分布式开发。虽然我可以做我的东西,爱丽丝和鲍勃有他们自己的副本,并做他们自己的工作。他们有自己的当前提交,这可能会有所不同,尤其是当他们添加新的提交时

假设Alice完成了新的小部件功能,Bob记录了frammitz。我现在无论如何都要去接他们的工作,所以我从艾丽斯那里得到了一些我以前从未有过的承诺。我至少需要知道他们的散列ID,我需要她最新提交的ID,其中有她以前的提交散列。我收集了Bob以前从未有过的文档,还需要他的ID,或者至少一个ID

我最好给这两个提交ID各加一个名字,以免忘记badcafe是Alice的还是Bob的。也许我可以用alice/master作为badcafe的名字。嗯,等等,我想我刚刚发明了远程跟踪分支的名称

还有其他方法来组织这一切。例如,Mercurial使用永久的全局分支名称,并允许在每个分支中使用匿名head1。事实证明,这些永久的全局分支名称有其自身的问题,因此Mercurial用户通常使用称为书签的轻量级名称来跟踪匿名头。事实证明,这些书签直接类似于Git的分支指针:提交ID的名称

最后,我们发现我们想要这些东西。Git的历史,在我看来,糟糕的命名法,有太多听起来相似的词,意味着不同的东西,这使得人们很难习惯Git对事物的描述,但事物本身是非常令人向往的


1这些脑袋在某些方面与Git的脑袋相似,但在其他方面有所不同。不过,一旦它们附加了书签,它们就与Git的分支极其相似。

分支在Git中有两种含义。简单地说,它只是一个临时的、与提交无关的名称/别名,因此我们不必记住散列。这有明显的好处,直接使用提交散列非常尴尬,而且通常只用于特殊场合。理论上,我们可以在没有这些的情况下工作,但这确实会非常麻烦

分支的另一个含义是一个提交可以有多个子提交的现象。这是真正的树枝肉。有趣的是,在git中,除了一个提交有多个子项之外,这个含义实际上并没有以任何技术/物理方式表示

后一种分支行为,以及相反的合并行为,是git提交有向无环图DAG的原因。这对git来说绝对是至关重要的,这就是它背后的魔力。其他系统,例如Subversion,则没有 我喜欢它,所以它绝对值得一提


有关它的更多深入信息,请查看git书籍,特别是关于分支和合并以及内部数据结构的章节

您是否已经学习了git命令,如clone、fetch、push?“如果每个人都在大师身上工作,会发生什么?”JoshLee感谢你阅读我的问题。然而,我无法立即看到你心目中的情景。请提供更多细节好吗?祝你好运,记住几十个甚至几百个提交哈希。@taskino或者你不需要记住每个分支的哈希吗?你是说有数百个分支吗?@flow2k随着时间的推移,可能会有很多分支。每次新提交时,哈希值都会发生变化。这是完全行不通的。我建议用git工作几分钟,这会使主题立即变得完全清晰。感谢torek的详细解释。是的,使用相同的指针(例如alice\master指向不断变化的提交)是很有价值的。你为什么说分支机构的名字?在Git中,分支名称只指向一个提交,要访问其他提交,它需要提交中的父指针,对吗?这是一个实现细节,但Git使用垃圾收集系统来处理旧的、不需要的对象,包括提交,尽管总共有四种类型的对象:带注释的标记,提交、树和blob。Git鼓励创建临时对象的操作,例如用于Git Reere的临时blob、用于带挤压操作的交互式rebase的临时提交等,并允许您使用Git rebase移植提交,以延迟的方式剥离原始对象。为了使这一切都有效,[继续][con'td]为了使这一切都有效,Git使用外部引用的概念,将对象标记为活动对象或正在使用的对象,并将其保留在存储库图之外。git会周期性地自动扫描整个图形,这是一个非常缓慢的操作,在后台完成,并修剪所有无法访问的对象。因此,要删除现在多余的提交,只需简单而快速地删除外部引用。如果没有其他对象或外部引用引用此提交,则此提交现在不受保护:git gc-auto最终将删除它。Mercurial使用另一种技术:在使用hg rebase或hg histedit移植或修改提交时,必须删除不需要的对象。为了方便恢复,Mercurial将对象剥离到一个包中,并将该包写入一个侧存储,而不是因为这一点而延迟垃圾收集Git的系统。事实证明,撤销重基是一种常见的需要,所以我们需要这些保存的捆绑包。这使得在Mercurial中做这些事情要比在Git中慢得多。你指的是哪本Git书籍@新鲜空气