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)でした!