docs: MEMO.mdにConventional Commitsの詳細を追加

- コミットメッセージの標準化に関する概要を記載
- 基本構造と主要なtypeの説明を追加
- 実例を通じて具体的な使用方法を示す
- GitHub CopilotやCI/CDとの統合についても言及
This commit is contained in:
marketing-shibata50 2025-07-31 21:59:10 +09:00
parent 6310729265
commit fc1a75eec1
6 changed files with 5622 additions and 1 deletions

296
FLOW.md Normal file
View file

@ -0,0 +1,296 @@
# GitHub Development Flow Guide
このガイドは、Git worktreeを活用した効率的な開発フローをまとめたものです。
## 📋 基本的な開発フロー
### 1. 新規開発の流れ
#### 計画フェーズ
1. **リポジトリの作成**: GitHub上でプロジェクト用のリポジトリを作成
2. **ブランチ戦略の決定**:
- `main`: リリース可能な安定版
- `develop`: 開発統合用ブランチ
3. **仕様書の作成**: README.mdに「何を」「なぜ」「誰のために」を記載
4. **タスクの洗い出しと分解**: 数時間〜1日で完了できるレベルまで細分化
5. **全タスクのIssue化**: GitHub Issuesに登録し、Projectsボードで管理
#### 開発フェーズ
```bash
# 1. Issueの選択
# GitHub ProjectsでIssueを「進行中」に移動
# 2. worktreeでブランチ作成
git worktree add -b feature/11-login-ui ../login-ui-work develop
cd ../login-ui-work
# 3. 開発作業
# コーディング作業
# 4. コミット (Conventional Commits形式)
git add .
git commit -m "feat: ログインフォームのUIコンポーネントを作成 #11"
# 5. プッシュ
git push origin feature/11-login-ui
```
#### レビュー&統合フェーズ
1. **プルリクエストの作成**: GitHub上でPRを作成`Closes #11`を含める)
2. **自動テストの実行**: GitHub Actionsが自動でテストを実行
3. **コードレビュー**: レビュアーがコードを確認
4. **マージ**: テストとレビューが完了したらマージ
5. **後片付け**:
```bash
cd ../my-project
git worktree remove ../login-ui-work
git branch -d feature/11-login-ui
git push origin --delete feature/11-login-ui
```
### 2. 機能追加の流れ
#### 計画フェーズ
1. **機能要件の明確化**: What何を、Whyなぜ、Howどのようにを定義
2. **Issueの作成**: 要件、技術的検討事項、受け入れ条件を記載
3. **ラベルとプロジェクトボードへの追加**: `feature`ラベル、優先度設定
4. **タスクの分解**: 大きな機能はサブタスクに分割
#### 開発フェーズ
```bash
# 1. 最新のdevelopを取得
cd ../my-project
git checkout develop
git pull origin develop
# 2. 機能用の作業場を作成
git worktree add -b feature/24-comment ../comment-work develop
cd ../comment-work
# 3. 開発(小さなコミットを重ねる)
git commit -m "feat: コメント投稿フォームのUIを作成 #24"
git commit -m "test: コメント投稿APIのテストを追加 #24"
# 4. 定期的なプッシュ
git push origin feature/24-comment
```
#### レビュー&テストフェーズ
1. **セルフレビュー**: 不要なコードの削除、フォーマット確認
2. **プルリクエストの作成**: 変更内容、テスト方法、スクリーンショットを含める
3. **自動テストとCI/CD**: GitHub Actionsによる自動検証
4. **コードレビュー**: 設計、可読性、テスト、パフォーマンス、セキュリティ
5. **フィードバック対応**: レビューコメントに基づく修正
### 3. バグ修正の流れ
#### バグの分類
- **Critical緊急**: サービス停止、データ損失の危険 → mainからhotfix
- **High**: 主要機能の不具合 → developからbugfix
- **Medium/Low**: 限定的な影響 → developからbugfix
#### 修正フロー
```bash
# 1. バグ報告のIssue作成詳細な再現手順、期待動作、実際の動作、エラーログ
# 2. 緊急度に応じたブランチ作成
# 緊急の場合
git worktree add -b hotfix/28-critical-auth ../hotfix-auth main
# 通常の場合
git worktree add -b bugfix/27-login-validation ../bugfix-login develop
# 3. バグの再現とテスト作成
cd ../bugfix-login
# まず失敗するテストを書く
npm test -- --grep "email with plus sign" # 失敗を確認
# 4. 修正の実装(最小限の変更)
git commit -m "test: メールアドレスに+記号を含む場合のテストを追加 #27"
git commit -m "fix: メールアドレスの+記号を正しく処理するように修正 #27"
# 5. 検証
npm test # すべてのテストがパス
npm run dev # 手動確認
# 6. プッシュとPR
git push origin bugfix/27-login-validation
```
## 🔄 並列開発のパターン
### 複数機能の同時開発
```bash
# 3つの機能を並行開発
../feature-login/ # ログイン機能localhost:3000
../feature-profile/ # プロフィール機能localhost:3001
../feature-dashboard/ # ダッシュボードlocalhost:3002
# 各ディレクトリで独立して開発サーバーを起動
cd ../feature-login && npm run dev
cd ../feature-profile && npm run dev -- --port 3001
cd ../feature-dashboard && npm run dev -- --port 3002
```
### レビュー対応中の新規開発
```bash
# PR待ちの間に別の作業を開始
../feature-A/ # レビュー待ち
../feature-B/ # 新規開発中
../bugfix-C/ # 緊急修正
# レビューコメントが来たらすぐに切り替え
cd ../feature-A
# 修正対応
git add .
git commit -m "fix: レビュー指摘事項を修正"
git push
```
## 🛠️ 便利なコマンド集
### worktree管理
```bash
# worktree一覧表示
git worktree list
# 不要なworktreeの削除
git worktree prune
# 特定のコミットからworktree作成
git worktree add -b feature/test ../test-feature abc123def
```
### ブランチ管理
```bash
# リモートブランチの最新化
git fetch --all --prune
# マージ済みブランチの削除
git branch --merged | grep -v "\*\|main\|develop" | xargs -n 1 git branch -d
```
## 📝 コミットメッセージ規約
### Conventional Commits形式
```
<type>(<scope>): <subject>
<body>
<footer>
```
#### Type一覧
- `feat`: 新機能
- `fix`: バグ修正
- `docs`: ドキュメントのみの変更
- `style`: コードの意味に影響しない変更
- `refactor`: バグ修正や機能追加を伴わないコード変更
- `perf`: パフォーマンス改善
- `test`: テストの追加・修正
- `chore`: ビルドプロセスやツールの変更
#### 例
```bash
git commit -m "feat(auth): JWT認証を実装"
git commit -m "fix: メモリリークを修正"
git commit -m "docs: READMEにインストール手順を追加"
```
## 🤖 GitHub連携機能
### GitHub Actions自動化
`.github/workflows/ci.yml`:
```yaml
name: CI
on:
pull_request:
branches: [main, develop]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
- run: npm ci
- run: npm test
- run: npm run lint
```
### PR作成時のチェックリスト
```markdown
## 変更内容
- [ ] 機能の説明を記載
- [ ] テストを追加/更新
- [ ] ドキュメントを更新
## テスト
- [ ] ローカルでテスト実行
- [ ] 手動での動作確認
## レビュー依頼事項
- 特に確認してほしい箇所を記載
```
## 💡 Tips & Best Practices
### 1. worktreeの命名規則
```bash
# 推奨される命名パターン
../feature-login # 機能開発
../bugfix-auth # バグ修正
../hotfix-critical # 緊急修正
../experiment-new-ui # 実験的変更
```
### 2. 並列開発の注意点
- 各worktreeで異なるポートを使用
- node_modulesは各worktreeで独立管理
- 環境変数は各worktreeで設定
### 3. クリーンアップの習慣
```bash
# 週次でのクリーンアップ
git worktree prune
git remote prune origin
git branch --merged | grep -v "\*\|main\|develop" | xargs -n 1 git branch -d
```
### 4. トラブルシューティング
worktreeが削除できない場合:
```bash
# 強制削除
git worktree remove --force ../feature-xxx
# 手動削除後のクリーンアップ
rm -rf ../feature-xxx
git worktree prune
```
ブランチの切り替えができない場合:
```bash
# 未コミットの変更を一時保存
git stash
# または
git commit -m "WIP: 作業中の変更"
```
## 🎯 まとめ
Git worktreeを活用することで
- ✅ 複数の作業を物理的に分離して管理
- ✅ コンテキストスイッチのコストを最小化
- ✅ 並列開発による生産性向上
- ✅ レビュー対応と新規開発の両立
このフローに従うことで、効率的で整理された開発環境を維持できます。

2322
GEMINI.md Normal file

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

537
MEMO.md
View file

@ -836,4 +836,539 @@ git commit -m "fix: APIレスポンスのnullチェックを追加 #28"
- 同じパターンのバグを自動検出するlintルールの追加
- テストケースの充実
- コードレビューのチェックリスト更新
- ドキュメントの改善
- ドキュメントの改善
# Conventional Commits - 標準化されたコミットメッセージ
## 概要
Conventional Commitsは、コミットメッセージに意味のある接頭辞typeを付けることで、変更の意図を明確にし、自動化を可能にする規約です。
## 基本構造
```
<type>(<scope>): <description>
[optional body]
[optional footer(s)]
```
## 主要なtype
### 基本的なtype
- **feat**: 新機能の追加
- **fix**: バグ修正
- **docs**: ドキュメントのみの変更
- **style**: コードスタイルの変更(フォーマット、セミコロンなど)
- **refactor**: バグ修正や機能追加を伴わないコードの変更
- **test**: テストの追加・修正
- **chore**: ビルドプロセスや補助ツールの変更
### 実例
```bash
# 新機能
git commit -m "feat: ユーザープロフィール画面を追加 #15"
git commit -m "feat(auth): JWTトークンによる認証を実装"
# バグ修正
git commit -m "fix: ログイン時のメールバリデーションエラーを修正 #27"
git commit -m "fix(api): nullレスポンスのハンドリングを追加"
# ドキュメント
git commit -m "docs: READMEにインストール手順を追加"
git commit -m "docs(api): エンドポイントの説明を更新"
# リファクタリング
git commit -m "refactor: 認証ロジックを別モジュールに分離"
git commit -m "refactor(utils): 日付処理関数を統合"
# テスト
git commit -m "test: ユーザー登録のE2Eテストを追加"
git commit -m "test(unit): バリデーション関数のテストケースを追加"
# 破壊的変更(重要)
git commit -m "feat!: APIのレスポンス形式を変更"
git commit -m "fix!: 認証方式をセッションからJWTに変更"
```
## メリット
1. **履歴の可読性向上**: `git log --oneline`で変更の種類が一目瞭然
2. **自動化**:
- CHANGELOGの自動生成
- セマンティックバージョニングmajor.minor.patchの自動更新
- 特定typeのコミットに対するCI/CDトリガー
3. **コミットの規律**: 1コミット1目的の原則が自然に身につく
## worktreeワークフローとの統合
```bash
# Issue #30のユーザー設定機能を開発
git worktree add -b feature/30-user-settings ../settings-work develop
cd ../settings-work
# 開発を進めながら、目的別にコミット
git commit -m "feat: ユーザー設定画面のUIを作成 #30"
git commit -m "feat: 設定保存APIエンドポイントを追加 #30"
git commit -m "test: 設定保存機能のテストを追加 #30"
git commit -m "docs: 設定機能のAPI仕様を記載 #30"
```
# GitHub Copilotによる開発効率化
## セットアップ
1. VS CodeにGitHub Copilot拡張機能をインストール
2. GitHub Copilot Chat拡張機能もインストール対話型支援用
## 主要な活用シーン
### 1. コード補完とインライン生成
```javascript
// コメントを書くだけで実装を生成
// ユーザーのメールアドレスをバリデートする関数
function validateEmail(email) {
// Copilotが正規表現とバリデーションロジックを提案
}
```
### 2. インラインチャットCmd+I / Ctrl+I
コードを選択して、自然言語で指示:
- 「このコードをTypeScriptに変換して」
- 「エラーハンドリングを追加して」
- 「より効率的に書き直して」
### 3. チャットビュー(サイドパネル)
より複雑な質問や、プロジェクト全体に関する相談:
- 「このプロジェクトの認証フローを説明して」
- 「新しいAPIエンドポイントを追加する手順は
### 4. スラッシュコマンド
- `/explain`: 選択したコードの説明
- `/tests`: ユニットテストの自動生成
- `/fix`: バグの修正提案
- `/optimize`: パフォーマンス改善の提案
### 5. エージェント
- `@workspace`: プロジェクト全体を理解した上での回答
- `@vscode`: VS Codeの使い方に関する質問
## 実践的な使用例
### Issue駆動開発での活用
```markdown
# GitHub Issueの内容をCopilotに渡す
「Issue #35: ユーザー検索機能を実装する。メールアドレスまたは名前で検索可能にする」
# Copilotへの指示
@workspace この機能を実装するために必要なファイルと手順を教えて
```
### テスト駆動開発TDDでの活用
```javascript
// 1. まずテストを書くCopilotが補完
describe('UserSearch', () => {
it('should find users by email', async () => {
// Copilotがテストケースを提案
});
});
// 2. 実装を生成
// Copilot: 「このテストをパスする実装を作成して」
```
### コミットメッセージの生成
VS Codeのソース管理パネルで、Copilotアイコンをクリックして変更内容に基づいたConventional Commits形式のメッセージを生成。
# GitHub Actions - CI/CD自動化
## 基本的なCI/CDパイプライン
### 1. 継続的インテグレーションCI
```yaml
# .github/workflows/ci.yml
name: CI
on:
push:
branches: [ develop, 'feature/**' ]
pull_request:
branches: [ develop, main ]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Run linter
run: npm run lint
- name: Run tests
run: npm run test
- name: Build
run: npm run build
```
### 2. 自動デプロイCD
```yaml
# .github/workflows/deploy.yml
name: Deploy
on:
push:
branches: [ main ]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
- name: Install and Build
run: |
npm ci
npm run build
- name: Deploy to GitHub Pages
uses: peaceiris/actions-gh-pages@v3
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
publish_dir: ./dist
```
### 3. 自動Issue管理
```yaml
# .github/workflows/issue-automation.yml
name: Issue Automation
on:
pull_request:
types: [opened, closed]
jobs:
update-issue:
runs-on: ubuntu-latest
steps:
- name: Move issue to In Progress
if: github.event.action == 'opened'
uses: peter-evans/create-or-update-project-card@v2
with:
project-name: Development
column-name: In Progress
issue-number: ${{ github.event.pull_request.number }}
- name: Close linked issues
if: github.event.pull_request.merged == true
uses: peter-evans/close-issue@v2
with:
issue-number: ${{ github.event.pull_request.number }}
comment: Completed in PR #${{ github.event.pull_request.number }}
```
### 4. 依存関係の自動更新
```yaml
# .github/dependabot.yml
version: 2
updates:
- package-ecosystem: "npm"
directory: "/"
schedule:
interval: "weekly"
open-pull-requests-limit: 10
labels:
- "dependencies"
- "automated"
```
## worktreeワークフローとの統合
1. **feature/**ブランチへのpush** → CI実行
2. **PRの作成** → テスト実行 + Issueステータス更新
3. **developへのマージ** → ステージング環境へのデプロイ
4. **mainへのマージ** → 本番環境へのデプロイ
# Alternative: Jujutsu (jj) を使った革新的アプローチ
## 概要
Jujutsuは「ワーキングコピーは常にコミット」という革新的な思想のVCSです。GitHubとの完全互換性を保ちながら、ローカル開発体験を劇的に改善します。
## 主な特徴
### 1. ステージングエリアが不要
```bash
# Gitの場合
git add file.js
git commit -m "feat: 新機能追加"
# jjの場合ファイルを保存した時点で自動的にコミットに含まれる
jj describe -m "feat: 新機能追加"
```
### 2. git stashが不要
```bash
# 別の作業を始めたい時
# Gitの場合
git stash
git checkout -b other-feature
# jjの場合現在の作業は自動的に保存される
jj new -m "feat: 別の機能"
```
### 3. 直感的な履歴編集
```bash
# 過去のコミットを修正
jj edit <change-id>
# ファイルを修正
jj edit @ # 最新に戻る(間のコミットは自動リベース)
```
### 4. 強力なundo
```bash
# どんな操作も一発で取り消し
jj undo
```
## GitHubワークフローとの統合
```bash
# 1. 既存のGitリポジトリでjjを使用開始
cd my-project
jj git init --colocate
# 2. 新機能の開発
jj new -m "feat: ユーザー認証機能 #40"
# コーディング...
# 3. コミットの分割(必要に応じて)
jj split
# 4. GitHubにプッシュ
jj bookmark create feature/40-auth
jj git push --bookmark feature/40-auth
# 5. GitHub上でPR作成通常通り
```
## worktreeとjjの使い分け
| 状況 | worktree | jj |
|-----|----------|-----|
| チーム開発 | ◎Gitの知識で十分 | △(チーム全体の学習が必要) |
| 個人開発 | ○(並行作業に最適) | ◎(最高の開発体験) |
| 複雑な履歴操作 | △rebaseが面倒 | ◎(直感的) |
| GitHub統合 | ◎完全にGit | ○(変換が必要) |
## まとめ
現在のworktreeベースのワークフローは十分に効率的ですが、以下の追加により更に強化されます
1. **Conventional Commits**: 履歴の可読性と自動化
2. **GitHub Copilot**: AI支援による高速開発
3. **GitHub Actions**: 完全自動化されたCI/CD
4. **Jujutsuオプション**: 究極のローカル開発体験
これらを段階的に導入することで、個人開発の生産性を最大化できます。
# 新規開発ワークフロー 詳細設計書jj版
## 概要
Jujutsujjを使用した新規開発ワークフローです。「ワーキングコピーは常にコミット」という革新的な思想により、git stashやステージングエリアの概念から解放され、よりシンプルで直感的な開発体験を実現します。
## 1. 計画フェーズ:思考を外部化し、道筋を立てる
### 概要
基本的にはGit版と同じです。GitHubのIssueとProjectsを使ってタスクを管理します。
### 流れ
1. **リポジトリの作成**: GitHub上でリポジトリを作成し、ローカルにクローン
2. **jjの初期化**:
```bash
# Gitリポジトリでjjを使用開始
cd my-project
jj git init --colocate
```
3. **ブランチ戦略**:
- jjでは「ブランチ」の概念が薄く、「変更change」が中心
- GitHubとの互換性のため、mainとdevelopの概念は維持
- ただし、ローカルではブックマークとして管理
4. **仕様書の作成**: README.mdに記載Git版と同じ
5. **全タスクのIssue化**: GitHub上で管理Git版と同じ
## 2. 開発フェーズ:摩擦のない開発体験
### 概要
jjの真価が発揮されるフェーズです。ステージングやstashを意識することなく、自然な流れで開発を進められます。
### 流れ
1. **Issueの選択**: GitHub Projectsから取り組むIssueを選択
2. **新しい変更の開始**:
```bash
# mainの最新から新しい変更を開始
jj new main -m "feat: ログイン機能を実装 #11"
```
- ブランチ名を考える必要なし
- 即座に作業開始可能
3. **開発の進行**:
```bash
# ファイルを編集すると自動的に現在の変更に含まれる
# エディタでlogin.jsを編集
# 現在の差分を確認
jj diff
# 変更の説明を更新git commit --amendに相当
jj describe -m "feat: ログインフォームのUIを追加 #11"
```
4. **作業の中断と再開**jjの最大の利点:
```bash
# 急にバグ修正が必要になった場合
# 現在の作業は自動的に保存されているので、単に新しい変更を開始
jj new main -m "fix: 認証エラーの修正 #12"
# バグ修正...
# ログイン機能に戻りたい時
jj edit <ログイン機能のchange-id>
# または、jj logで履歴を見て選択
```
5. **コミットの整理**:
```bash
# 大きすぎる変更を分割
jj split
# 複数の変更を1つに統合
jj squash
# 過去の変更を修正(超簡単!)
jj edit <過去のchange-id>
# ファイルを修正
jj edit @ # 最新に戻る(自動リベース)
```
6. **GitHubへの共有準備**:
```bash
# GitHub用のブックマークブランチを作成
jj bookmark create feature/11-login
# リモートにプッシュ
jj git push --bookmark feature/11-login
```
## 3. レビュー&統合フェーズ
### 概要
GitHub上でのプロセスは従来と同じですが、レビューフィードバックへの対応がjjでは格段に簡単になります。
### 流れ
1. **Pull Request作成**: GitHub上で通常通りPRを作成
2. **自動テスト**: GitHub Actionsが実行Git版と同じ
3. **フィードバック対応**jjの利点:
```bash
# レビューで「3つ前のコミットのタイポ」を指摘された場合
# 該当のコミットに直接ジャンプ
jj edit <3つ前のchange-id>
# タイポを修正
# 最新に戻る(間のコミットは自動的にリベース!)
jj edit @
# 更新をプッシュ自動的にforce-push
jj git push --bookmark feature/11-login
```
4. **マージ**: GitHub上でPRをマージ
5. **後片付け**:
```bash
# ローカルの状態を更新
jj git fetch
# 不要になったブックマークを削除
jj bookmark delete feature/11-login
# mainを最新に
jj new main
```
## jj特有の便利な操作
### 1. 実験的な変更
```bash
# 実験的なアプローチを試したい
jj new -m "実験: 新しいアルゴリズム"
# うまくいかなかった場合
jj abandon @ # この変更を破棄
# 自動的に前の変更に戻る
```
### 2. 並行作業の可視化
```bash
# 現在進行中の全ての作業を確認
jj log
# グラフィカルに表示
jj log --graph
```
### 3. 究極のセーフティネット
```bash
# どんな操作もやり直し可能
jj undo # 直前の操作を取り消し
jj op log # 操作履歴を確認
jj op restore <operation-id> # 特定の時点に戻る
```
## worktreeワークフローとの比較
| 観点 | worktree | jj |
|------|----------|-----|
| 作業の切り替え | 物理的にフォルダを移動 | 論理的に変更を切り替え |
| 並行作業の管理 | 複数のフォルダ | 1つのフォルダ内で完結 |
| 学習コスト | Gitの延長線上 | 新しい概念の理解が必要 |
| ディスク使用量 | 作業数×リポジトリサイズ | 1リポジトリ分のみ |
| 作業の可視性 | lsコマンドで確認 | jj logで確認 |
## まとめ
jjを使った新規開発ワークフローの特徴
1. **ブランチ管理からの解放**: ブランチ名を考える必要なし
2. **stash不要**: 作業の中断・再開が自然
3. **履歴編集が簡単**: 過去のコミット修正が直感的
4. **安全性**: すべての操作がundo可能
特に個人開発や小規模チームでは、jjの「摩擦のない」開発体験により、創造的な作業により集中できるようになります。

1
leaked-system-prompts Submodule

@ -0,0 +1 @@
Subproject commit d03ab51b39bab41443da50f988141d5a00382609

View file

@ -0,0 +1,251 @@
# Git Worktree vs Jujutsu (jj) 徹底比較
## はじめに:なぜこの比較が重要なのか
Git worktreeとJujutsujjは、どちらも**開発者の最大の悩み「作業の切り替えコスト」を解決する**ためのツールです。しかし、アプローチが根本的に異なります。
- **Git worktree**: Gitの上に構築された「物理的分離」による解決策
- **Jujutsu (jj)**: Git自体を置き換える「概念的革新」による解決策
## 基本概念の違い
### Git worktree: 物理的分離戦略
```
プロジェクトのディレクトリ構造:
../my-project/ # メインの作業場develop
├── .git/ # 共通のGitデータ
├── src/
└── package.json
../feature-login/ # ログイン機能用作業場
├── .git → ../my-project/.git # リンク
├── src/
└── package.json
../bugfix-urgent/ # 緊急バグ修正用作業場
├── .git → ../my-project/.git # リンク
├── src/
└── package.json
```
**特徴**:
- 各作業場は**物理的に独立したフォルダ**
- 同じリポジトリの異なるブランチを**同時に複数の場所で**展開
- `cd`コマンドで作業場を移動
### Jujutsu (jj): 概念的革新戦略
```
プロジェクトのディレクトリ構造:
my-project/ # 単一の作業場
├── .jj/ # jjのメタデータ
├── .git/ # Gitとの互換性維持
├── src/
└── package.json
変更の概念的管理:
change-abc123: feat: ログイン機能
change-def456: fix: 緊急バグ修正 ← 現在ここで作業中
change-ghi789: feat: UI改善
```
**特徴**:
- **単一のフォルダ**ですべてを管理
- 「変更change」という概念で作業を分離
- `jj edit <change-id>`で瞬時に作業を切り替え
## 具体的な作業フローの比較
### シナリオ: ログイン機能開発中に緊急バグ修正が発生
#### Git worktreeの場合
```bash
# 1. ログイン機能を開発中
cd ../login-work
# コーディング中...(未コミットの変更あり)
# 2. 緊急バグ修正が必要に!
cd ../my-project
git worktree add -b hotfix/urgent-bug ../bugfix-work develop
cd ../bugfix-work
# 3. バグ修正
# 修正作業...
git add .
git commit -m "fix: 緊急バグを修正"
git push origin hotfix/urgent-bug
# 4. PR作成してマージ後、クリーンアップ
cd ../my-project
git worktree remove ../bugfix-work
git branch -d hotfix/urgent-bug
# 5. ログイン機能に戻る
cd ../login-work
# 以前の作業がそのまま残っている!
```
#### Jujutsu (jj)の場合
```bash
# 1. ログイン機能を開発中
# my-project/で作業中...change-abc123
# 2. 緊急バグ修正が必要に!
jj new main -m "fix: 緊急バグを修正"
# → 瞬時に新しい変更に切り替わり、以前の作業は自動保存
# 3. バグ修正
# 修正作業...git addは不要、ファイル保存で自動的に変更に含まれる
jj bookmark create hotfix/urgent-bug
jj git push --bookmark hotfix/urgent-bug
# 4. PR作成してマージ後、クリーンアップ
jj bookmark delete hotfix/urgent-bug
# 5. ログイン機能に戻る
jj edit change-abc123
# → 瞬時に以前の作業に戻る!
```
## 詳細比較表
| 項目 | Git worktree | Jujutsu (jj) |
|------|-------------|--------------|
| **基本思想** | 物理的分離による並行作業 | 概念的な変更管理 |
| **ディスク使用量** | 作業場数 × リポジトリサイズ | 1リポジトリ分のみ |
| **作業切り替え** | `cd ../other-work`(数秒) | `jj edit <id>`(瞬時) |
| **未コミット変更** | 各作業場で独立して保持 | 自動的に変更として保存 |
| **ステージング** | 各作業場でgit add必要 | 概念自体が存在しない |
| **stash** | 不要(物理的分離のため) | 不要(概念的分離のため) |
| **学習コスト** | Gitの延長 | 新しいVCS |
| **チーム対応** | 全員Gitを知っていればOK | 全員がjjを学ぶ必要 |
| **IDEサポート** | フォルダ単位で自然に分離 | 同一フォルダ内での変更切り替え |
## それぞれの利点・欠点
### Git worktreeの利点
1. **学習コストが低い**: 既存のGit知識で十分
2. **直感的**: フォルダ = 作業場という分かりやすい概念
3. **IDEフレンドリー**: VS Codeなどで複数ウィンドウを開ける
4. **チーム互換性**: 他のメンバーは普通のGitブランチとして見える
5. **デバッグしやすい**: どのフォルダで何をしているか一目瞭然
### Git worktreeの欠点
1. **ディスク容量**: 大きなリポジトリだと容量を食う
2. **パスの管理**: 複数のパスを覚えておく必要
3. **クリーンアップ**: 作業完了後の削除作業が手間
4. **ファイルシステム依存**: Windows等でのパス問題
### Jujutsu (jj)の利点
1. **究極の効率性**: 瞬時の作業切り替え
2. **ディスク効率**: 1リポジトリ分の容量のみ
3. **自動管理**: ステージング、stash等の概念が不要
4. **強力なundo**: あらゆる操作が取り消し可能
5. **履歴編集**: 過去のコミット修正が超簡単
### Jujutsu (jj)の欠点
1. **学習コスト**: 全く新しい概念の理解が必要
2. **チーム導入障壁**: 全員が新しいツールを覚える必要
3. **エコシステム**: Git周辺ツールとの互換性問題の可能性
4. **成熟度**: 比較的新しいツールで、長期的な安定性が未知
## 使い分けの指針
### Git worktreeを選ぶべき場合
- **チーム開発**が中心
- **既存のGitワークフロー**に大きな変更を加えたくない
- **VS Codeなどのエディタ**で複数ウィンドウを開いて作業したい
- **学習コストを最小限**に抑えたい
- **Windows環境**でのパス問題が許容範囲
### Jujutsu (jj)を選ぶべき場合
- **個人開発**が中心
- **最高の開発体験**を求めている
- **頻繁な作業切り替え**が必要
- **実験的な開発**を多く行う
- **新しいツールを学ぶ意欲**がある
## 具体的な導入シナリオ
### シナリオ1: フリーランス開発者(個人開発中心)
**推奨**: Jujutsu (jj)
- クライアントワークでの頻繁な作業切り替えに最適
- 最新技術への投資として価値あり
- 個人の生産性向上が直接収入に影響
### シナリオ2: スタートアップのCTO小規模チーム
**推奨**: Git worktree
- チーム全体での学習コストを考慮
- 新しいメンバーの onboarding を重視
- 安定性と実績を重視
### シナリオ3: 大企業のシニア開発者(複雑な開発環境)
**推奨**: 状況による
- 個人作業が多い → jj
- チーム調整が多い → worktree
- 実験環境でjjを試してから判断
## 重要な制約:並列開発の観点
### Git worktree: 真の並列開発が可能
```bash
# 3つの機能を本当に「同時に」開発できる
Terminal 1: cd ../feature-A && npm run dev # localhost:3000
Terminal 2: cd ../feature-B && npm run dev # localhost:3001
Terminal 3: cd ../feature-C && npm run dev # localhost:3002
# 各作業場で独立したサーバーが起動し、ブラウザでタブを切り替えながら開発
```
### Jujutsu: 高速切り替えだが同時実行は不可
```bash
# 同時には1つしか実行できない
jj edit feature-A
npm run dev # localhost:3000
# feature-Bを見たい場合
# Ctrl+C でサーバー停止
jj edit feature-B
npm run dev # 再度起動が必要
```
### 並列開発が必要なケース
| シナリオ | worktree | jj |
|---------|----------|-----|
| **複数機能の同時比較** | ◎ 複数ブラウザタブで並べて確認 | ✗ 切り替えが必要 |
| **APIサーバー + フロントエンド** | ◎ 別ポートで同時起動 | ✗ 1つずつしか起動できない |
| **A/Bテスト開発** | ◎ 2つのバージョンを並行実行 | ✗ 切り替えて確認 |
| **性能比較** | ◎ 同時にベンチマーク実行 | ✗ 順番に実行 |
| **マイクロサービス開発** | ◎ 複数サービスを同時起動 | ✗ 実質不可能 |
### 実例:リアルタイム比較が必要な開発
```bash
# Git worktree: UIの新旧比較
../current-ui/ # 現在のUIlocalhost:3000
../new-ui-design/ # 新しいUIデザインlocalhost:3001
# → ブラウザで2つのタブを開いて、リアルタイムで比較しながら調整
# jj: 同じことをやろうとすると...
jj edit current-ui
npm run dev
# スクリーンショットを撮る
jj edit new-ui-design
npm run dev
# メモリに頼って比較... 😓
```
## まとめ:どちらも素晴らしいソリューション
Git worktreeとJujutsu (jj)は、どちらも「作業の切り替えコスト」という共通の問題を解決する優れたツールです。
- **Git worktree**: 安全で実用的、チーム開発に最適
- **Jujutsu**: 革新的で効率的、個人開発に最適
重要なのは、**あなたの開発環境と目標に最も適したツールを選ぶこと**です。どちらを選んでも、従来の「1ブランチずつ切り替える」ワークフローより大幅に生産性が向上することは間違いありません。
始めるなら、学習コストの低いGit worktreeから試して、個人開発でより高い効率性を求めるならJujutsuに挑戦する、という段階的なアプローチもおすすめです。