Git是一种流行的版本控制系统。 在Git中,一个或几个文件的原子更改称为提交,并且几个连续的提交被合并到一个分支中。 分支用于实现新的想法(功能)。
碰巧这种想法是死胡同,而开发人员却选择了错误的方式,因此他需要回滚到原始版本。 他应该忘记新的分支,切换到主要的dev或master分支,然后继续工作。 在这种情况下,“接穗”将永远挂起,并希望将其卸下。 但是,如何删除历史记录的一部分? 该分支显示了辛勤工作的程序员的努力,即使徒劳。 因此,向老板汇报将更容易,因为结果也是不成功的!
我很高兴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-with-lease
选项。
Rebase也可用于循环分支,尽管重新计算提交的逻辑很复杂。
auto
选项还允许自动关闭所有旧分支。 在这种情况下,关闭提交是启动分支的提交。 使用Git IDE插件,可以定期运行闭包。 在GitExtensions中,有一个类似的插件删除过时的分支 。
IT公司的想法
大型IT公司:Google,Facebook,Apple,DeepMind,Positive Technologies,尤其是Microsoft,正迫切等待关闭,因为现在可以规范分支机构(包括未合并分支机构)的生命周期。
微软的最高经理之一迈克尔·里希特(Michael Richter) 写道 :
当然,Git的新功能将减轻开源开发世界(不仅是)的混乱。 我们的存储库中有很多“悬挂”分支。 例如,在vscode中,我们有200多个,在TypeScript中,则有300多个! 这个问题不仅是我们的。 闭包不仅可以改善组织结构,而且还可以跟踪程序员的推理,有时甚至对同事来说都是完全无法理解的:)闭包使我想起了电影《回到未来》,那里的角色穿越了过去和未来。 我喜欢这部电影,看了好几次。 而且我想我会更喜欢Git,因为如果使用此功能:)
注意事项
如果较早的提交图是有向无环图 (DAG),则闭包可以将其扩展为通用有向图 。 使用Git,您可以描述状态为提交的正则表达式,并且字母是所有消息的集合。 但这是中心“异常编程”的主题,因此超出了本文的范围。 但是,如果您觉得这很有趣,请查看有关如何在Git中存储家谱的文章 。