若想在不影响当前 Mac 项目检出的情况下处理另一个分支,可以在相邻文件夹中创建一个 Git worktree。每个 worktree 都有自己独立的文件和已检出的分支,同时与主检出共享仓库数据。通过终端创建,在访达(Finder)或编辑器中打开其文件夹,并在完成后使用 Git 将其移除。Git 的 worktree 文档

worktree 带来的变化

worktree 为你提供了连接到同一个 Git 仓库的另一个工作目录。这意味着你可以保持当前已检出的 main 分支处于打开状态,同时为某个功能分支分配一个独立的文件夹和文件。一个工作目录中的更改不会覆盖另一个工作目录中已检出的文件。Git 会共享仓库数据,但会独立保留特定于该 worktree 的状态(例如索引和 HEAD)。Git: git-worktree

分支在各个 worktree 之间是共享的,而且通常情况下,一个本地分支不能同时在两个 worktree 中被检出。worktree 适用于独立的并行任务;它们并非独立的仓库克隆。被 Git 忽略的文件(如本地配置或构建输出)可能需要在新文件夹中单独创建。

在 macOS 上创建功能分支 worktree

打开终端并进入你现有的项目目录。将 my-app 替换为你仓库的目录名称。该示例假设项目位于 ~/Projects/my-app,并在其旁边创建新的检出。

cd ~/Projects/my-app
git status --short
git worktree add -b feature/search-ui ../my-app-search-ui

status 命令可让你在切换上下文之前查看当前检出是否有未提交的更改。add -b 命令会创建一个名为 feature/search-ui 的新本地分支,并将其检出到相邻的 my-app-search-ui 目录中。当未指定起始提交时,Git 会从当前 HEAD 创建分支。请选择一个唯一的分支名称以及一个尚未被占用的目标路径。Git: worktree add

对于未在其他 worktree 中检出的现有本地分支,请使用该分支的名称,而不要使用 -b 和新分支名称:

git worktree add ../my-app-search-ui existing-branch

如果该分支已在其他位置检出,Git 默认会拒绝操作。请不要仅为了绕过保护机制而强制执行;请使用其他分支,或者在已经检出该分支的工作区中进行操作。若要为远程分支创建 worktree,请在需要时先拉取(fetch)远程仓库,并遵循 Git 的跟踪分支机制;在添加之前请核对分支名称。

在访达和编辑器中打开新的检出

在访达中,导航到包含这两个项目目录的父文件夹,然后打开 my-app-search-ui。你可以使用访达的“前往文件夹”命令(Shift-Command-G)并输入完整路径,例如 ~/Projects/my-app-search-ui。请在访达或编辑器中保持目录名称可见,以便将其与原始检出区分开来。

Apple 也说明了如何在访达中针对选定文件夹打开终端:通过“显示”>“显示路径栏”调出路径栏,在路径栏中按住 Control 键点按该文件夹,然后选取“在终端中打开”。若要打开另一个终端窗口或标签页,请使用 Command-N 或 Command-T。选定文件夹的位置将成为访达操作对应的工作目录。Apple: 在 Mac 上的“终端”中打开新窗口和标签页

使用编辑器文档中注明的打开文件夹操作,将新文件夹作为一个独立项目在编辑器中打开。各编辑器的行为可能有所不同;Git worktree 不会自动创建编辑器窗口或配置你的开发环境。依赖项目录、被忽略的文件、本地环境配置文件以及运行中的服务可能需要在每个检出中单独设置。

检查你当前正在使用的检出

在任一项目目录中运行:

git worktree list

Git 会列出主 worktree 和关联的 worktree,包括它们的路径和已检出的分支。在提交或运行会修改文件的命令之前,请确认当前所在文件夹或在此处运行 git status。这一简单的检查有助于避免一个常见错误:原本想在新的检出中工作,却在原始检出中进行了修改。Git: worktree list

任务完成后移除 worktree

首先提交或通过其他方式保存你所需的任何工作。然后,从属于该仓库的任意 worktree 中,通过路径移除关联的检出:

git worktree remove ../my-app-search-ui
git worktree list

如果 worktree 包含已修改的跟踪文件或未跟踪的文件,Git 通常会拒绝移除。在移除前请检查并保存这些文件;--force 会覆盖 Git 的保护机制,并可能导致工作丢失。该命令会删除 worktree 目录,因此不要用它来替代检查目录内部内容的操作。一旦移除,除非单独删除,否则该分支仍保留在仓库中。Git: worktree remove

如果你手动删除了 worktree 文件夹,Git 可能会保留其管理记录。使用 git worktree prune 来清理过期的记录;常规清理建议优先使用 git worktree remove。如果你在访达中移动了关联的检出,Git 可能会丢失对其位置的跟踪;在适用的情况下使用 git worktree move,或使用 git worktree repair 重新建立连接。Git: worktree prune、move 和 repair

在 Mac 上一种实用的配置方式是:为每个正在进行的任务分配一个 worktree 文件夹,并使用简短、易辨识的文件夹和分支名称。保留主检出用于当前工作,为并行任务创建同级检出,并在编辑前核对路径。这样即可为每个任务提供独立的项目文件,而无需反复切换原始检出的分支。

参考来源