Git是一种流行的版本控制系统。 其中,一个或多个文件的原子更改称为提交,并且几个连续的提交被合并到一个分支中。 分支用于实现新的想法(功能)。
碰巧这种想法最终是死路一条,开发人员关闭了错误的方式,并且需要回滚到原始版本,为此您需要忘记新的分支并切换到主要的dev或master ,然后继续工作,就好像什么都没发生一样。 在这种情况下,“拍摄”将永远挂起,就像要删除它一样。 但是,如果它是故事的一部分,该如何删除? 这个过程显示了工作狂程序员的努力,尽管是徒劳的。 向当局报告比较容易,因为结果也是不成功的!
我赶紧取悦:版本3中的Git开发人员将引入一个新命令来关闭此类杂散分支。 让我提醒您,当前的当前版本是2.21.0 。
如何使用这个团队,它给我们带来什么,IT公司如何看待? 本文回答了这些问题和其他问题。
内容描述
现在,您可以使用先前的提交之一关闭不成功的分支。 在下图中,断层的电弧被涂成黄色。
这里,提交4
是不成功功能的最后一个。 他从1
开始关闭,然后回到主节点,然后从提交5
转到另一方向。
您还可以将提交锁定在自身中,从而创建循环 :
您可以将自己锁定在任何提交中-智能Git将计算差异并正确组合所有内容:
使用方法
merge
命令不包含闭包功能,因为对于第一种情况,分支将是快速伪造的 ;对于第二种情况,它将不执行任何操作( git already up to date
)。
为了不改变旧的行为,开发人员决定输入命令关闭:
git closure -s $source_commit -d $dest_commit -m $message
第一个参数-s $source_commit
指定要从其扩展循环的提交的哈希,第二个可选参数-d $dest_commit
指定要在其中关闭循环的提交。 如果不存在,则关闭发生在当前的检出分支中。 -m $message
参数设置关闭消息(例如failed feature, revert to origin
。 但是,-- --allow-empty-message
选项也可用,该选项允许没有消息文本的提交。 默认情况下,Git允许两次提交完全关闭。 要解决此限制,可以使用--allow-multiple-closures
选项。
执行命令后,git本身将计算更改,并且在最后一次提交中,将在基数和尾随分支中看到double diff。 通常,这是一个n维差异,也就是说,您可以根据需要执行多次关闭。 Closure-commit与merge-commit类似,区别在于它存储了几条消息,而不是一条。
不幸的是,与Git一起使用的现有GUI尚未完全支持关闭。 GitExtensions的预览版可以像合并一样生成曲线,而不是优美的弧线。 注意新的Closure message
和Closure diff
字段:
值得注意的是, closure
团队总是会更改历史记录(不过,现在Git是一台成熟的时间机器!),因此现在您只能使用--force
选项或借助安全的--force-with-lease
--force
分支。
还可以为带循环的分支提供重新基准,但是,重新计算分支中的提交的逻辑很复杂。
另外, auto
选项允许您自动关闭所有旧分支。 在这种情况下,关闭提交是从其开始分支的提交。 使用Git IDE插件,可以定期运行闭包。 在GitExtensions中,一个类似的“ 删除过时的分支”插件将删除过时的分支。
IT公司的意见
大型IT公司:Google,Facebook,Apple,DeepMind,Positive Technologies,尤其是Microsoft,都希望关闭,因为现在可以规范分支机构(包括不连续分支机构)的生命周期。
微软的最高管理者之一迈克尔·里希特(Michael Richter) 写道 :
git的新功能肯定会减轻开放源代码开发领域的混乱,不仅如此。 我们的存储库有很多悬挂的分支。 例如, vscode中有200 多个 ,而TypeScript中有300多个! 这不仅仅是微软的问题。 闭包不仅可以改善组织,而且还可以让您跟踪程序员的推理,有时甚至对同事来说都是完全无法理解的:)闭包使我想起了电影《回到未来》(Back to the Future),那里的角色穿越了过去和未来。 我喜欢这部电影,我看了几次。 而且我认为我会更喜欢git,因为它:)
注意事项
如果更早的提交图是有向无环图 (DAG),则闭包可以将其扩展为广义有向图 。 使用Git,可以描述状态为提交的正则表达式,而字母是所有消息的集合。 但是,这种“集线器异常编程”的痕迹,因此超出了本文的范围。 但是,如果您对此感兴趣,请查看描述如何在Git中存储族谱的文章 。