← 返回博客

Zed 中的原生 Git 支持

2025年3月12日

我们很早就听说,许多用户希望能够在 Zed 中使用 Git。不一定是为了所有操作,但特别是对于 90% 的“git-commit”、“git-push”工作流程,每次都切换上下文实在是太慢了。

我很高兴地宣布,从今天开始,Git 支持已在 Zed v0.177 中提供!

Zed 原生 Git 支持的简要演示。

概述

我们希望构建一个具有三个优先级的 Git 集成:

  • 速度:在 Zed 中使用 Git 应该比使用命令行更快。
  • Git 原生:我们不是在重新发明轮子,只是为您提供对您已知的 Git 功能的一流访问。
  • 键盘优先:您的速度受限于您的手指,而不是您的手肘。

新的 Git 面板为您提供了工作树和 Git 暂存区状态的鸟瞰图。您可以一目了然地看到哪些文件已更改,哪些文件已暂存以提交。使用键盘,您可以暂存更改,或将文件恢复到 HEAD 中的状态。我们监控存储库,以便您在命令行上所做的更改会立即反映在 Zed 中。

在键盘驱动流程中导航和暂存更改。

准备就绪后,您可以使用 cmd-enter 进行提交,而且——因为现在是 2025 年——Zed 可以请求您首选的 LLM 为您编写提交消息。另一个巧妙的细节:当您与团队协作时,Zed 会自动添加 Co-Authored-By 行,这样您就少了一件要做的事情。

由 AI 驱动生成提交消息。

当您想放大时,使用差异视图逐行审查您的提交。就像 git add -p 一样,您可以使用键盘暂存或跳过代码块。但是,由于 Zed 是一个文本编辑器,您也可以在进行过程中对文件进行最后修改(其他人不需要看到那个 dbg!)。

尽管如此,我在 Zed 中最喜欢的 Git 功能是,您可以随时从命令面板运行 git::Commit,无需暂存,它将提交所有对已跟踪文件的更改。就像 git commit -a 一样。这使得快速保存您正在处理的内容到分支变得容易。

使用命令面板操作快速提交。

我们今天已实现的功能包括 fetch、pull 和 push。这些功能可以通过应用程序中的任何位置的命令面板访问;当您聚焦 Git 面板时,您可以使用快捷方式。

幕后

我们必须在 Zed 中重建文本缓冲区,以确保编辑器中显示的差异“正常工作”。现在,删除的文本显示得像任何其他文本一样(尽管背景是删除的),因此您可以选择、复制粘贴,并使用文本光标移动,无需鼠标。

尽管这听起来很简单,但我们最初的删除代码块实现完全独立于编辑器的坐标系统。我们甚至将文本渲染为插入在编辑器数据结构中的行之间的“块”。但自这个巨大的 240 次提交的 PR 以来,删除的代码块已成为编辑器坐标系统的普通部分,从而实现了各种代码块间功能,如文本搜索和已删除代码块中的 editor::SelectAllMatches

显示差异代码块是否已暂存是另一个有趣的挑战。大多数 Git 客户端会在 UI 的不同部分显示已暂存和未暂存的更改。这无疑更容易实现,但它使得使用键盘暂存和取消暂存变得笨拙,因为暂存代码块会导致它移动,从而焦点丢失。我们选择将已暂存和未暂存的代码块交错在一起,我们亲切地称之为“差异的差异”。首先,我们查看编辑器内容与 HEAD 之间的差异,以了解要显示哪些差异代码块。其次,我们计算暂存区与 HEAD 之间的差异。只有通过查看这两个差异的差异,我们才能分辨出哪些代码块已暂存,哪些未暂存。

如何以直观和一致的方式渲染所有这些是另一个我们直到 发布前那个星期五 仍在解决的问题。

我们相信您会喜欢我们在权衡空间中的选择,所有这些底层管道都设计时考虑了未来的功能。我们希望向您展示传统的已暂存和未暂存差异、与主分支的差异,甚至任何提交及其父提交之间的差异。所有这些在技术上都是可行的(尽管我们尚未实现它们 :D)。

下一步

我们这个项目的目标是为 Zed 中的 Git 设定标准:快速、易用,并与现有工具和工作流程良好集成。然而,还有很多领域需要覆盖,我们计划很快将更多 Git 功能引入编辑器。特别是:

  • 冲突解决。这可能是 Git 中最令人困惑的状态之一,我们可以做很多事情来使其更直观。
  • 逐行暂存。目前,最小的暂存单位是连续的行组。我们希望您能够像在其他工具中一样,逐行暂存。
  • 历史可视化。我们在 Git 面板底部有空间,我们希望显示最近的提交并让您查看它们的差异。
  • 还有更多……请在 DiscordGitHub 讨论 中告诉我们您想要什么。

所以,请尝试新的 Git 支持;如果遇到问题,请提交问题,并帮助我们确定下一步要构建什么!


正在寻找更好的编辑器吗?

您今天就可以在 macOS、Windows 或 Linux 上试用 Zed。立即下载


我们正在招聘!

如果您对我们博客中涵盖的主题充满热情,请考虑加入我们的团队,帮助我们实现软件开发的未来。