git开发小妙招--认识git worktree

507 阅读3分钟

当前功能开发到一半,要求先处理其他需求,怎么办?

相信各位程序猿对这个场景并不陌生。我猜你会这么做:

git stash save "当前功能"

git checkout other-branch

当你在 other-branch 上处理完其他需求了。你会回到 current-branch 上,通过git stash apply stash@{n} 恢复,继续之前的工作。

这是个常见的做法,下面来介绍另一种处理方法:git worktree

什么是 git worktree

在 Git 中,工作树(Working Tree)是指当前检出的分支的文件系统视图。它包含了你正在处理的所有文件和目录。工作树是你进行代码编辑、添加新文件、修改文件和删除文件的地方。

具体来说,工作树包括以下几个部分:

  1. 工作目录(Working Directory)

    • 这是你在文件系统中看到的实际文件和目录。你可以在这里进行文件的编辑、添加、删除等操作。
  2. 暂存区(Staging Area)

    • 也称为索引(Index)。这是一个中间区域,用于暂存你准备提交的更改。你可以使用 git add 命令将文件的更改添加到暂存区。
  3. HEAD

    • HEAD 是一个指针,指向当前检出的分支的最新提交。它表示你当前工作树的状态。

工作树的主要作用是提供一个工作空间,让你可以对代码进行修改和测试。你可以在工作树中进行各种操作,然后将更改提交到 Git 仓库中。

Git 支持多工作树(Multiple Working Trees),允许你在同一个仓库中同时处理多个分支。你可以使用 git worktree 命令来创建和管理多个工作树。这样,你可以在不同的工作树中独立地进行开发,而不会相互干扰。

git worktree 实用案例

以下是使用 git worktree 命令来创建和管理多个工作树的实用例子:

使用 git worktree 创建和管理多个工作树

假设你正在开发一个项目,并且需要同时处理两个不同的功能分支 feature-branch 和 bugfix-branch。你可以使用 git worktree 来创建和管理多个工作树,以便同时处理这两个分支。

1. 创建一个新的工作树

首先,确保你在主分支上:

git checkout main

然后,创建一个新的工作树来处理 feature-branch

git worktree add ../feature-branch feature-branch

这将在当前仓库的父目录中创建一个名为 feature-branch 的新目录,并将 feature-branch 分支检出到这个新目录中。

2. 在新的工作树中进行开发

现在,你可以在 ../feature-branch 目录中进行开发:

cd ../feature-branch

进行一些更改

echo "New feature" >> feature.txt

git add feature.txt

git commit -m "Add new feature"

3. 创建另一个工作树来处理 bugfix-branch

回到主目录:

cd ../your-repo

创建一个新的工作树来处理 bugfix-branch

git worktree add ../bugfix-branch bugfix-branch

这将在当前仓库的父目录中创建一个名为 bugfix-branch 的新目录,并将 bugfix-branch 分支检出到这个新目录中。

4. 在新的工作树中进行修复

现在,你可以在 ../bugfix-branch 目录中进行修复:

cd ../bugfix-branch

进行一些修复

echo "Bug fix" >> fix.txt

git add fix.txt

git commit -m "Fix bug"

5. 查看所有工作树

你可以使用以下命令查看所有工作树:

git worktree list

输出可能如下:

/path/to/your-repo         1234567 [main]

/path/to/feature-branch    89abcde [feature-branch]

/path/to/bugfix-branch     fghijkl [bugfix-branch]

6. 删除一个工作树

如果你完成了某个分支的工作,可以删除对应的工作树:

git worktree remove ../feature-branch

通过使用 git worktree,你可以在同一个仓库中同时处理多个分支,而不需要频繁地切换分支。这对于并行开发和修复非常有用。