之前:我的问题主要集中在Git philopsophy和最佳实践,而不是技术POV。
我想知道Git分支的命运是否最终合并。 我们是否会坚持使用分支来实现自己的生活,而不是在任何时候合并,并且在开始时就知道它?
在这种情况下,使用此分支内容创建新的仓库会更好吗?
答案 0 :(得分:2)
分支名称大多只是提交的名称,就像标记名称一样。没有必要使用它来进行合并提交,但没有令人信服的理由不以这种方式使用它。
当名称(包括分支名称或标记名称)标识某些提交时,例如其哈希ID以1234567...
开头的提交,我们说此名称指向特别提交。 "真名"提交的是哈希ID,任意数量的(非哈希ID)名称 -zero,一,二,一百万 - 都可以指向该提交。哈希ID很难让人类使用(谁能记住a3c921fa60b7...
超过几秒钟?)所以我们通常更喜欢名字。当提交特别重要时,我们可能会给它起一个名字或几个名字。
有一种非常重要的方式,分支名称不就像标记名称一样,这就是Git在你" on"分支,例如,在运行时git status
说on branch xyz
。 在这种情况下,Git将自动更改分支名称,使其指向,而不是刚刚指向它的提交,而是指向新提交你刚才做的。
因此,如果您在分支xyz
上,并且它指向提交1234567
,并且您进行新提交,则名称为{{1} }不再指向xyz
。相反,它指向一些新的提交,例如1234567
。与此同时,您刚刚提交的 new 提交指向提交fedcba9
。这就是分支增长的方式。
此是存储库中的历史记录,它由提交之间的这些父链接组成。分支名称指向任何给定分支的 tip 提交,并且从该提交开始,您和Git可以回溯到之前的每个提交。您访问的每一个提交,当您执行此操作时,通过此步骤流程,从分支提示中返回时间",可到达。
当您运行1234567
时,您可以 1 使Git创建一个新提交,但只有两个父项。这些提交称为合并提交,当您(或Git)执行历史记录时,您(或Git)将访问两个父母及其祖父母等等。所有这些提交都可以从分支提示到达,这可以帮助您进行此合并提交。
这种可达性具有确保Git不删除提交的副作用。所有可到达的提交都是永久性的。所有提交都是只读的。因此,从历史记录中可以看到的所有分支提示都是永久存储的:只读和永久性的,以提交的形式存储。
将分支git merge
合并到feature
后,您可以删除名称mainline
,因为名称feature
要么指向,要么最终到达,合并提交指向之前提交的提交,只能从mainline
到达。因此,合并后,您可以删除名称。但是没有必要合并:你可以保留名称,这可以保留提交。
或者,如果您确定不再需要这些提交,将来您可以删除名称。这使得提交无法访问 -well,至少以此名称;可能还有一些其他名称可以达到它们。如果提交真的无法访问 - 如果它们没有找到它们的分支名称,则没有找到它们的标记名称,也没有其他名称(例如feature
)最终允许Git从名称中找到它们 - 然后在很快就会有一点,当refs/stash
运行时,Git实际上会删除那些真实的提交。
因此,答案是否定的:您没有 来合并分支。只要保留名称,名称就会保留所有这些提交。如果您已合并分支,则某些其他名称现在也会保留这些提交,因此可以(但不必)删除分支名称;但只要你保持分支名称,提交就会一直存在,无论是否合并。这些提交可以从分支的尖端到达:Git有时会将包含在分支中。 (见git gc
。)
1 git branch --contains
命令并不总是进行合并提交。有时,它会快速前进",这实际上不是合并。您可以将它告诉git merge
,它最终也会进行普通(非合并)提交。所以--squash
只会使合并提交有时。
答案 1 :(得分:1)
没有。使用发布分支是很常见的:对于您所做的每个主要版本,您可以例如允许在其发布分支上进行错误修正以创建新的子发行版,而您的主要开发在开发分支上并行完成。