4 个版本 (2 个重大变更)
0.9.0 | 2024年5月27日 |
---|---|
0.8.0 | 2023年8月28日 |
0.7.0 | 2023年3月2日 |
0.7.0-rc.1 | 2023年2月19日 |
#15 in #undo
159 每月下载量
用于 10 个 crate (8 个直接使用)
635KB
13K SLoC
Git 的无分支工作流程
(这个工具集与分支完全兼容。如果您觉得这很令人困惑,可以在这里 讨论一个新的名称.)
关于
git-branchless
是一套工具,它以多种方式增强了 Git
它 使 Git 更易于使用,无论是对于新手还是高级用户。例如
git undo
: 一个通用的撤销命令。请参阅博客文章 git undo: 我们可以做得更好。- 智能日志: 一个方便的可视化工具。
git restack
: 用于修复损坏的提交图。- 猜想合并: 避免被合并冲突困住。
它 为高级用户提供更多灵活性。例如
- 补丁栈工作流程: 强烈支持 Linux 和 Git 项目以及许多大型科技公司使用的 "补丁栈" 工作流程。(这是 Git "应该" 被使用的方式。)
- 原型设计和实验工作流程: 通过 "发散" 开发强有力地支持原型设计和实验工作。
git sync
: 无需检出即可重新整理所有本地提交堆栈和分支。git move
: 在清理旧分支的同时,能够移动子树而不是“树枝”,不会触及工作副本等。- 匿名分支:减少了实验性工作的分支开销。
- 内存操作:在不需要检出特定提交的情况下修改提交图。
git next/prev
:在提交堆栈中快速跳转到提交和分支。git sw -i/--interactive
:交互式选择要切换到的提交。
它为大型仓库和单体仓库提供了更快的操作,特别是在大型科技公司中。示例
- 请参阅博客文章 使用 git-move 的闪电般快速的变基。
- 性能测试:在 torvalds/linux(1M+ 提交)和 mozilla/gecko-dev(700k+ 提交)上进行了基准测试。
- 内存操作:默认情况下避免触及工作副本(这可能减慢
git status
或使构建工件失效)。 - 稀疏索引:使用自定义的稀疏索引实现,以实现快速的提交和合并操作。
- 分段变更日志DAG:在提交图上进行高效查询,例如,合并基的计算为 O(log n) 而不是 O(n)。
- 预先编译:使用具有良好运行时性能(Rust)的预先编译语言编写。
- 多线程:在适当的情况下将工作分配到多个CPU核心。
- 据我所知,
git-branchless
提供了 Git 工具和 UI 中 最快 的变基实现,原因如上所述。
目录
演示
修复
撤销几乎任何事情
- 提交。
- 修改后的提交。
- 合并和变基(例如,如果您错误地解决了冲突)。
- 检出。
- 创建、更新和删除分支。
为什么不使用 git reflog
?
git reflog
是一个工具,用于查看单个引用(如 HEAD
)的先前位置,可用于撤销操作。但由于它仅跟踪单个引用的位置,因此复杂的操作(如变基)可能难以反向工程。 git undo
在更高层次的抽象级别上操作:您仓库的整个状态。
git reflog
基本上也不能用来撤销一些罕见的操作,比如某些分支的创建、更新和删除。更多详情请参阅架构文档。
git undo
无法处理什么内容?
git undo
需要依赖 Git 近期版本的某些功能才能正常工作。请查看兼容性图表。
目前,git undo
无法撤销以下内容。您可以在 问题 #10 中找到处理这些情况的设计文档。
- 通过撤销提交来“取消提交”,并将更改恢复到工作副本。
- 在原始 Git 中,这可以通过
git reset HEAD^
完成。 - 这种情况下,使用自定义的
git uncommit
命令会更合适。请参阅 问题 #3。
- 在原始 Git 中,这可以通过
- 撤销文件的状态或取消状态。这可以通过上述问题 #10 跟踪。
- 撤销回冲突的“中间”,使得
git status
显示如path/to/file (both modified)
的消息,以便您可以以不同的方式解决特定的冲突。这可以通过上述问题 #10 跟踪。
从根本上讲,git undo
不打算处理对未跟踪文件的变化。
与其他 Git 撤销工具的比较
gitjk
:需要 shell 别名。仅撤销最近的命令。仅处理一些 Git 操作(例如,不处理变基操作)。git-extras/git-undo
:仅撤销当前HEAD
处的提交。git-annex undo
:仅撤销给定文件或目录的最新更改。thefuck
:仅撤销历史 shell 命令。仅处理一些 Git 操作(例如,不处理变基操作)。
可视化
使用 smartlog(git sl
)可视化您的提交历史
为什么不使用 git log --graph
呢?
gitlog --graph
仅显示带有分支的提交。如果您希望在不使用分支的情况下工作,则 gitlog --graph
不会对您有效。
为了支持广泛重写提交图的用户,gitsl
也会指出被遗弃且需要修复的提交(标记为 rewritten as abcd1234
的提交的后代)。它们可以通过 gitrestack
自动修复,或者手动处理。
操作
无需担忧编辑您的提交图
为什么不尝试使用 git rebase
--interactive
呢?
使用 git rebase
--interactive
进行交互式变基完全受支持,但它有几个缺点
git rebase
--interactive
只能修复线性提交序列,而不能修复树。如果您修改了一个有多个子提交的提交,那么您必须确保适当地重新变基所有其他子提交。- 在开始变基之前,您必须制定一个行动计划。对于某些用例,一次操作单个提交可能比一次操作整个提交序列更容易。
当您使用 git rebase
--interactive
与 git-branchless
一起时,如果您遗弃任何提交,您将被提示修复您的提交图。
安装
请参阅 https://github.com/arxanas/git-branchless/wiki/Installation。
简而言之:检查适合您系统的存储库中的软件包,或者运行 cargo install
--locked
git-branchless
。安装完成后,在您的存储库中运行 gitbranchless
init
。
状态
git-branchless
目前处于 alpha 阶段。请准备好可能出现的破坏性更改,因为一些工作流程和架构可能在将来发生变化。相信没有重大错误,但它尚未经过全面的实战测试。您可以在 问题跟踪器 中查看已知问题。
git-branchless
遵循 语义化版本控制。新 0.x.y 版本以及达到 1.0.0 后的新主要版本可能会以向后不兼容的方式更改磁盘格式。
要通知新版本,请在 Github 页面顶部的通知菜单中选择“关注”>“自定义”>“发布”。或者使用 GitPunch 通过电子邮件发送通知。
相关工具
这个领域正在开发许多有希望的工具。有关更多信息,请参阅 相关工具。
贡献
感谢您对贡献项目的兴趣!如果您愿意,我很乐意安排一次电话会议来帮助您加入项目。
关于代码贡献,请查看运行手册,了解如何设置开发工作流程,以及编码指南。您还可以阅读架构文档。
关于文档贡献,请参阅Wiki风格指南。
贡献者应遵守行为准则。
lib.rs
:
此crate用于直接通过子命令(例如 git-branchless foo
)或完全独立的可执行文件(例如 git-branchless-foo
)调用 git-branchless
。目标是通过允许开发者在隔离状态下构建和测试单个子命令来提高开发迭代时间。
依赖项
~71MB
~1.5M SLoC