我们早就听说你们中的许多人都希望能够在 Zed 中使用 Git。 不一定适用于所有情况,但特别是在 90% 的 "git-commit"、"git-push" 工作流程中,每次都必须进行上下文切换实在太慢了。
我很高兴地宣布,从今天开始,Git 支持已在 Zed v0.177 开始提供!
概述
我们希望构建一个具有三个优先级的 Git 集成
- 速度:从 Zed 中使用 Git 应该比使用命令行更快。
- Git 原生:我们没有重新发明轮子,只是为您提供对您已经知道的 Git 功能的一流访问权限。
- 键盘优先:您受限于手指的速度,而不是肘部的速度。
新的 Git 面板让您可以鸟瞰工作树和 Git 暂存区的状态。您可以一目了然地看到哪些文件已更改,哪些文件已暂存以进行提交。使用键盘,您可以暂存更改,或将文件恢复到 HEAD 中的状态。我们监控存储库,以便您在命令行上所做的更改能够立即反映在 Zed 中。
准备就绪后,您可以使用 cmd-enter
进行提交,并且——因为现在是 2025 年——Zed 可以要求您首选的 LLM 为您编写消息。另一个巧妙之处:当您与团队协作时,Zed 会自动添加 Co-Authored-By
行,因此您可以少做一件事。
当您想要放大时,可以使用 Diff 视图逐行查看您的提交。就像 git add -p
一样,您可以使用键盘暂存或跳过 Hunk。但是,因为 Zed 是一个文本编辑器,所以您也可以在进行过程中对文件进行最后的修改(不需要其他人看到那些 dbg!
)。
也就是说,我在 Zed 中最喜欢的 Git 功能是,您可以始终从命令面板运行 git::Commit
,而无需暂存,它会将所有更改提交到跟踪的文件。就像 git commit -a
一样。 这使得可以轻松地将您正在处理的任何内容快速保存到分支。
我们今天拥有的最后一部分是 fetch、pull 和 push。 这些可以通过应用程序中任何位置的命令面板访问;并且当您聚焦 Git 面板时,您可以使用快捷方式。
底层原理
我们必须重建 Zed 中的文本缓冲区,以确保编辑器中显示的差异正常工作。现在,删除的文本会像任何其他文本一样显示(尽管带有删除的背景),以便您可以使用文本光标选择、复制粘贴和移动,无需鼠标。
虽然这听起来很简单,但我们最初对删除的 Hunk 的实现完全在编辑器的坐标系之外。我们甚至将文本渲染为插入在编辑器数据结构行之间的“块”。但是,从这个巨大的 240 次提交的 PR 开始,删除的 Hunk 是编辑器坐标系的一个普通部分,从而可以实现各种 Hunk 间功能,例如文本搜索以及删除的 Hunk 中的 editor::SelectAllMatches
。
显示差异 Hunk 是否已暂存是另一个有趣的挑战。大多数 Git 客户端会在 UI 的不同部分显示已暂存和未暂存的更改。这肯定更容易实现,但使用键盘暂存和取消暂存会很尴尬,因为暂存一个 Hunk 会导致它移动,从而导致您的焦点丢失。我们选择将已暂存和未暂存的 Hunk 交错在一起,我们亲切地称之为“差异的差异”。首先,我们查看编辑器内容和 HEAD 之间的差异,以了解要显示哪些差异 Hunk。其次,我们计算暂存区和 HEAD 之间的差异。只有通过查看这两个差异的差异,我们才能知道哪些 Hunk 已暂存,哪些未暂存。
弄清楚如何以直观和一致的方式呈现所有这些是我们在 本次发布之前的周五一直在解决的另一个问题。
我们认为您会喜欢我们在权衡空间中着陆的位置,但所有这些管道都是在考虑到未来功能的情况下设计的。我们想向您展示传统的已暂存和未暂存的差异、来自主分支的差异,甚至任何提交及其父项之间的差异。所有这些在技术上都是可能的(尽管我们尚未实现它们 :D)。
下一步
我们这个项目的目标是为 Zed 中的 Git 树立标准:快速、易于使用,并与现有工具和工作流程良好集成。但是,还有很多工作要做,我们计划很快将更多的 Git 功能引入编辑器。特别是
- 冲突解决。 这可能是 Git 中最令人困惑的状态之一,我们可以做很多事情来使其更直观。
- 逐行暂存。 现在,最小的暂存单位是一组连续的行。 我们希望您能够暂存单个行,就像在其他工具中一样。
- 历史记录可视化。 我们在 Git 面板底部为此预留了空间,我们想显示最近的提交并让您查看它们的差异。
- 还有更多… 请在 Discord 或 GitHub 讨论 中告诉我们您想要什么。
因此,请试用新的 Git 支持;如果您遇到问题,请提交问题,并帮助我们确定下一步要构建什么!