はじめに
こんにちは!
マイニフティチームの寺島です。
最近はAIエージェントでの並列開発が活発になってきましたね。
同じリポジトリ内で、一つのタスクをしている間に別のタスクを実施したいことが多々出てくる昨今。
ついに私もgit worktreeに入門しました。
AIエージェントにバリバリ並列作業をしてもらう前に、機能について知っていると安心してお任せできますので、お勉強をしました。
せっかくの機会なので簡単に、git worktree についてハンズオン形式でまとめてみましたので、良ければ読んでいただけると嬉しいです。
git worktreeとは
Gitで「別の作業領域(ワークスペース)」を構築して並行作業を行う機能は、 git worktree(ワークツリー) と呼ばれます。
git worktreeを使えば、1つのリポジトリから複数の作業ディレクトリを別々の場所に作成し、それぞれ異なるブランチを同時に展開しておくことができます。
1. ハンズオン用のリポジトリを作成する
まずはベースとなるリポジトリを作成し、最初のコミットを行います。
|
1 2 3 4 5 6 7 |
mkdir git-worktree-demo cd git-worktree-demo git init echo "Initial commit" > README.md git add README.md git commit -m "feat: add initial README" |
2. 新機能の開発を始める(メインの作業)
新しい機能(feature/A)の開発を開始します。
|
1 2 3 |
git checkout -b feature/A echo "WIP: Feature A working..." > feature_a.txt |
ここで git status を確認すると、feature_a.txt が未追跡(Untracked)の状態で残っています。この未コミット状態をキープしたまま、次の手順に進みます。
3. worktree を使って別ディレクトリで作業する
現在のリポジトリディレクトリの外(一つ上の階層)に、hotfix 用のディレクトリを作成し、新しいブランチ hotfix/bug-fix を割り当てます。
|
1 2 3 |
# 現在のディレクトリの隣に、新しく "hotfix-dir" という作業ツリーを作成する git worktree add ../hotfix-dir -b hotfix/bug-fix main |
新しい作業ディレクトリである../hotfix-dirに対して、-bオプションで新ブランチhotfix/bug-fixがmainブランチから作成されます。
作業ツリーの一覧を確認してみましょう。
|
1 2 |
git worktree list |
出力例:
/path/to/git-worktree-demo <ハッシュ値> [feature/A]
/path/to/hotfix-dir <ハッシュ値> [hotfix/bug-fix]
これで、1つのローカルリポジトリを共有しながら、2つのディレクトリで別々のブランチが展開されている状態が作れました。
4. 別タスクを実施する
新しく作られたディレクトリに移動して作業します。
|
1 2 3 4 5 |
cd ../hotfix-dir echo "Fix critical bug" > fix.txt git add fix.txt git commit -m "fix: resolve critical bug" |
5. worktree を片付けて元の作業に戻る
別タスクが終わったので、元のディレクトリに戻り、不要になった worktree を削除します。
|
1 2 3 4 5 6 |
# 元のディレクトリに戻る cd ../git-worktree-demo # 使い終わったworktreeを削除する git worktree remove ../hotfix-dir |
Tips: もしエクスプローラー等で直接ディレクトリを削除してしまった場合は、
git worktree pruneコマンドを実行することでGitの管理から綺麗に切り離すことができます。
最後に、元のブランチ(feature/A)の状態を確認してみましょう。
|
1 2 |
git status |
先ほど作りかけた feature_a.txt が未追跡のまま、残っていることが確認できると思います。
おわりに
今回のハンズオンのまとめです。
git worktree add <パス> -b <新ブランチ名> <派生元ブランチ>別ディレクトリに新しい作業ツリーを作成する。git worktree list現在展開されている作業ツリーの一覧を確認する。git worktree remove <パス>不要になった作業ツリーを安全に削除する。
よい並列開発ライフが送れることを祈っています!


