Git ワークフロー完全ガイド:チーム開発での効率的な使い方

Gitの基本操作から、チーム開発で必要なワークフロー、コンフリクト解決まで実践的に解説します。

Git ワークフロー完全ガイド

Git はモダンな開発において不可欠なバージョン管理システムです。効率的なチーム開発のためのワークフローを学びましょう。

Git 基本概念

リポジトリの構造

# 新しいリポジトリの作成
git init my-project
cd my-project

# リモートリポジトリのクローン
git clone https://github.com/username/repository.git

基本的なワークフロー

# ファイルの状態確認
git status

# ファイルをステージング
git add filename.txt
git add .  # 全ファイル

# コミット
git commit -m "機能: ユーザー認証機能を追加"

# リモートに送信
git push origin main

ブランチ戦略

Git Flow

# 新機能開発ブランチ
git checkout -b feature/user-authentication
git checkout develop
git merge feature/user-authentication

# リリースブランチ
git checkout -b release/v1.2.0
git checkout main
git merge release/v1.2.0
git tag v1.2.0

# ホットフィックス
git checkout -b hotfix/critical-bug
git checkout main
git merge hotfix/critical-bug
git checkout develop
git merge hotfix/critical-bug

GitHub Flow(シンプルなワークフロー)

# 機能ブランチ作成
git checkout -b feature/new-dashboard
git push -u origin feature/new-dashboard

# 開発・コミット・プッシュ
git add .
git commit -m "ダッシュボードのレイアウト実装"
git push origin feature/new-dashboard

# Pull Request作成後、mainにマージ
git checkout main
git pull origin main
git branch -d feature/new-dashboard

実践的なコマンド集

履歴とログ

# コミット履歴表示
git log --oneline --graph --all

# 特定ファイルの変更履歴
git log -p filename.txt

# 変更内容の確認
git diff
git diff --staged
git diff HEAD~1

# 特定のコミットとの比較
git diff abc1234..def5678

ブランチ操作

# ブランチ一覧
git branch -a

# リモートブランチの取得
git fetch origin
git checkout -b local-branch origin/remote-branch

# ブランチの削除
git branch -d feature-branch
git push origin --delete feature-branch

# ブランチ名変更
git branch -m old-name new-name

取り消し操作

# ワーキングディレクトリの変更を取り消し
git checkout -- filename.txt
git restore filename.txt

# ステージングの取り消し
git reset HEAD filename.txt
git restore --staged filename.txt

# 直前のコミットを修正
git commit --amend -m "修正されたコミットメッセージ"

# コミットの取り消し
git reset --soft HEAD~1  # コミットのみ取り消し
git reset --mixed HEAD~1 # コミット+ステージング取り消し
git reset --hard HEAD~1  # 全て取り消し(危険)

コンフリクト解決

マージコンフリクトの対処

# マージ実行
git merge feature-branch

# コンフリクト発生時の状態確認
git status

# コンフリクトファイルの例
<<<<<<< HEAD
const API_URL = 'https://api.production.com';
=======
const API_URL = 'https://api.staging.com';
>>>>>>> feature-branch

# 手動解決後
git add resolved-file.txt
git commit -m "コンフリクト解決: API URL設定"

リベースでのコンフリクト解決

# リベース開始
git rebase main

# コンフリクト解決後
git add resolved-file.txt
git rebase --continue

# リベース中止
git rebase --abort

チーム開発のベストプラクティス

コミットメッセージの書き方

# 良いコミットメッセージの例
git commit -m "feat: ユーザープロファイル編集機能を追加

- プロファイル画像のアップロード機能
- 基本情報の編集フォーム
- バリデーション機能の実装

Fixes #123"

# プリフィックス例
# feat: 新機能
# fix: バグ修正
# docs: ドキュメント
# style: フォーマット
# refactor: リファクタリング
# test: テスト
# chore: ビルド、設定等

.gitignore の設定

# Node.js
node_modules/
npm-debug.log*
.env
.env.local
.env.production

# Build outputs
dist/
build/
*.tgz

# IDE
.vscode/
.idea/
*.swp
*.swo

# OS
.DS_Store
Thumbs.db

# Logs
logs/
*.log

# Dependencies
yarn.lock
package-lock.json

高度な Git テクニック

Stash(一時保存)

# 変更を一時保存
git stash
git stash push -m "作業中の機能を一時保存"

# 保存した変更の一覧
git stash list

# 保存した変更を復元
git stash pop
git stash apply stash@{0}

# 特定ファイルのみstash
git stash push -m "特定ファイル" -- filename.txt

Cherry-pick

# 特定のコミットを現在のブランチに適用
git cherry-pick abc1234

# 複数のコミットを適用
git cherry-pick abc1234..def5678

# コンフリクトが発生した場合
git cherry-pick --continue
git cherry-pick --abort

Rebase Interactive

# 過去3つのコミットを編集
git rebase -i HEAD~3

# エディタで表示される内容例
pick abc1234 最初のコミット
squash def5678 修正コミット
reword ghi9012 コミットメッセージを変更

# 操作例
# pick: そのまま残す
# squash: 前のコミットと統合
# reword: コミットメッセージを変更
# edit: コミットを編集
# drop: コミットを削除

CI/CD との連携

GitHub Actions 例

# .github/workflows/ci.yml
name: CI/CD Pipeline

on:
  push:
    branches: [main, develop]
  pull_request:
    branches: [main]

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2

      - name: Setup Node.js
        uses: actions/setup-node@v2
        with:
          node-version: "18"

      - name: Install dependencies
        run: npm ci

      - name: Run tests
        run: npm test

      - name: Run linting
        run: npm run lint

      - name: Build
        run: npm run build

Pre-commit Hooks

// package.json
{
  "husky": {
    "hooks": {
      "pre-commit": "lint-staged",
      "commit-msg": "commitlint -E HUSKY_GIT_PARAMS"
    }
  },
  "lint-staged": {
    "*.{js,ts,tsx}": ["eslint --fix", "prettier --write"],
    "*.{md,json}": ["prettier --write"]
  }
}

トラブルシューティング

よくある問題と解決法

# 大きなファイルを誤ってコミットした場合
git filter-branch --tree-filter 'rm -f large-file.zip' HEAD
git push --force-with-lease

# コミット履歴からファイルを完全削除
git filter-branch --force --index-filter \
  'git rm --cached --ignore-unmatch sensitive-file.txt' \
  --prune-empty --tag-name-filter cat -- --all

# リモートのブランチ状態を確認
git remote show origin

# リモートの削除されたブランチをローカルからも削除
git remote prune origin

# reflogを使った復旧
git reflog
git reset --hard HEAD@{5}

パフォーマンス改善

# ガベージコレクション
git gc --aggressive

# リポジトリサイズの確認
git count-objects -vH

# 大きなファイルの検索
git rev-list --objects --all | git cat-file --batch-check='%(objecttype) %(objectname) %(objectsize) %(rest)' | sed -n 's/^blob //p' | sort --numeric-sort --key=2 | tail -n 10

まとめ

効果的な Git ワークフローは、チーム開発の生産性を大幅に向上させます。基本的なコマンドから高度なテクニックまで習得し、プロジェクトに最適なワークフローを選択しましょう。

定期的な練習と実践を通じて、Git を使いこなせるようになりましょう。

最後まで読んでいただきありがとうございました!てばさん(@basabasa8770)でした!

この記事をシェア