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日

#5 in #undo

Download history 13/week @ 2024-04-22 7/week @ 2024-04-29 13/week @ 2024-05-06 3/week @ 2024-05-13 6/week @ 2024-05-20 232/week @ 2024-05-27 37/week @ 2024-06-03 24/week @ 2024-06-10 16/week @ 2024-06-17 26/week @ 2024-06-24 24/week @ 2024-07-01 14/week @ 2024-07-08 9/week @ 2024-07-15 12/week @ 2024-07-22 30/week @ 2024-07-29 17/week @ 2024-08-05

每月 69 次下载
git-branchless 中使用

MIT/Apache 许可

775KB
17K SLoC

git-branchless logo

Git 的无分支工作流程

(此工具套件与分支100%兼容。如果您觉得这很令人困惑,可以在这里 讨论新的名称.)


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中变基的最快实现。

另请参阅用户指南设计目标

目录

演示

修复

撤销几乎所有操作

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

为什么不使用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后的新主要版本,可能会以向后不兼容的方式更改磁盘格式。

要通知新版本,请选择页面上方的Github通知菜单中的“Watch”>“Custom”>“Releases”。或者使用GitPunch通过电子邮件发送通知。

这个领域有很多有潜力的工具正在开发中。有关更多信息,请参阅相关工具

贡献

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

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

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

贡献者应遵守行为准则


lib.rs:

允许将仓库还原到之前的状态。

这是通过找到自某个时间以来发生的事件并将它们反转来实现的。

依赖关系

~79MB
~1.5M SLoC