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 日 |
#7 in #git-branchless
每月下载 225 次
用于 14 个软件包 (13 个直接使用)
1MB
19K SLoC
Git 的无分支工作流
(这个工具集与分支完全兼容,如果您觉得这个名字令人困惑,您可以在 这里讨论一个新名字.)
关于
git-branchless
是一系列工具,它以多种方式增强了 Git
它 使 Git 更易于使用,无论是对于新手还是高级用户。例如
git undo
: 一个通用的撤销命令。请参阅博客文章 git undo: 我们可以做得更好。- smartlog: 一个方便的可视化工具。
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
呢?
git log --graph
只显示带有分支的提交。如果您更喜欢在没有分支的情况下工作,那么 git log --graph
就不会为您工作。
为了支持广泛重写提交图的用户,git sl
还会指出已被废弃且需要修复的提交(标记为 rewritten as abcd1234
的提交的后代)。它们可以使用 git restack
自动修复,或者手动处理。
操作
无需担忧地编辑您的提交图
为什么不试试 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
。安装完成后,在您的仓库中运行 git branchless init
。
状态
git-branchless
目前处于 alpha 版本。请做好心理准备,因为未来的某些工作流程和架构可能会发生变化。相信它没有重大错误,但它尚未经过全面的实战测试。您可以在 问题追踪器 中查看已知问题。
git-branchless
遵循 语义版本控制。新的 0.x.y 版本和达到 1.0.0 后的新主要版本可能会以不向后兼容的方式更改磁盘格式。
要通知新版本,请选择页面上方的 Github 通知菜单中的 Watch » Custom » Releases。或者使用 GitPunch 通过电子邮件发送通知。
相关工具
这个领域有很多有前景的工具正在开发中。更多信息请参阅 相关工具。
贡献
感谢您对贡献的兴趣!如果您愿意,我很乐意安排一次通话来 帮助您入门。
对于代码贡献,请查看 运行手册 以了解如何设置开发工作流程,以及 编码准则。您还可能想阅读 架构 文档。
有关贡献文档,请参阅 Wiki 风格指南。
贡献者应遵守 行为准则。
lib.rs
:
git-branchless
的命令行选项。
依赖关系
~71MB
~1.5M SLoC