4 个版本 (2 个重大变更)

0.9.0 2024年5月27日
0.8.0 2023年8月28日
0.7.0 2023年3月2日
0.7.0-rc.12023年2月19日

#383 in 可视化

Download history 10/week @ 2024-04-13 11/week @ 2024-04-20 8/week @ 2024-04-27 11/week @ 2024-05-04 7/week @ 2024-05-11 5/week @ 2024-05-18 204/week @ 2024-05-25 48/week @ 2024-06-01 25/week @ 2024-06-08 18/week @ 2024-06-15 29/week @ 2024-06-22 12/week @ 2024-06-29 12/week @ 2024-07-06 9/week @ 2024-07-13 14/week @ 2024-07-20 56/week @ 2024-07-27

每月92次下载
用于 git-branchless

MIT/Apache

670KB
14K SLoC

git-branchless logo

Git 的无分支工作流程

(这个工具集与分支完全兼容。如果你觉得这很令人困惑,你可以在 这里讨论一个新的名字.)


Linux build status Windows build status macOS build status
Github Discussions Discord

▼ 跳转到安装 ▼
▼ 跳转到目录 ▼

关于

git-branchless 是一套工具,它以多种方式增强 Git

使 Git 更易于使用,无论是对于新手还是高级用户。例如

为高级用户提供更多灵活性。例如

  • 补丁堆工作流程:对“补丁堆”工作流程提供强大的支持,如 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中最快的rebase实现,以上原因。

请参阅用户指南设计目标

目录

演示

修复

几乎可以撤销任何事情

  • 提交。
  • 修改后的提交。
  • 合并和重新合并(例如,如果您错误地解决了冲突)。
  • 检出。
  • 创建、更新和删除分支。

为什么不使用git reflog

git reflog 是一个查看单个引用(如 HEAD)之前位置的工具,可用于撤销操作。但由于它只跟踪单个引用的位置,复杂的操作如变基可能难以逆向工程。 git undo 在更高的抽象级别上运行:整个仓库的状态。

git reflog 基本上也不能用于撤销某些罕见操作,例如某些分支的创建、更新和删除。请参阅架构文档获取更多详情。

git undo 不能处理什么?

git undo 需要依赖 Git 近期版本中的功能才能正常运行。请参阅兼容性图表

目前,git undo 不能撤销以下内容。您可以在 问题 #10 中找到处理这些情况的设计文档。

  • 通过撤销提交并将其更改恢复到工作副本来“取消提交”提交。
    • 在标准 Git 中,可以使用 git reset HEAD^ 实现此操作。
    • 此场景最好使用自定义的 git uncommit 命令来实现。请参阅 问题 #3
  • 撤销文件的暂存或不暂存。这在上面的问题 #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 --interactivegit-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 后的新主要版本,可能会以不兼容的方式更改磁盘格式。

要获取新版本的提醒,请选择页面顶部的通知菜单中的“Watch » Custom » Releases”。或者使用 GitPunch 通过电子邮件发送通知。

这个领域正在开发许多有前途的工具。有关更多信息,请参阅 相关工具

贡献

感谢您对贡献的热情!如果您愿意,我很乐意安排一次通话,帮助您加入

关于代码贡献,请查看操作手册了解如何设置开发工作流程,以及编码规范。您还可能想阅读架构文档。

关于文档贡献,请参阅Wiki 风格指南

贡献者应遵守行为准则


lib.rs:

Git钩子的回调。

Git使用“钩子”在特定事件后运行用户定义的脚本。我们广泛使用这些钩子来跟踪用户活动,例如决定是否将提交视为过时。

这些钩子由branchless init命令安装。此模块包含钩子的实现。

依赖关系

~72MB
~1.5M SLoC