GitHub Copilot活用ガイド|AIペアプログラミングで開発を加速する使い方

kento_morota 18分で読めます

GitHub Copilotは、AIがコードの補完や生成を行う「AIペアプログラマー」として、多くの開発者の生産性を向上させています。しかし、ただインストールするだけでは真の効果を引き出せません。

この記事では、GitHub Copilotの基本操作から実践的な活用テクニック、注意すべきセキュリティポイントまで、開発を加速するための具体的な使い方を解説します。

GitHub Copilotとは?機能の全体像

GitHub CopilotはGitHubとOpenAIが共同開発したAIコーディングアシスタントです。エディタに統合され、コードのコンテキスト(現在のファイル、開いているタブ、プロジェクト構造など)を理解した上で、適切なコード補完・生成を行います。

Copilotのプラン

  • Copilot Free:月間制限付きの無料プラン。個人開発者向け
  • Copilot Pro:月額10ドル。個人開発者向けの無制限プラン
  • Copilot Business:月額19ドル/ユーザー。組織向け。管理機能・ポリシー制御付き
  • Copilot Enterprise:月額39ドル/ユーザー。企業向け。カスタマイズ・ナレッジベース対応

主な機能

  • コード補完:現在書いているコードの続きを予測して提案
  • Copilot Chat:チャット形式でコードの説明・修正・生成を依頼
  • インラインチャット:エディタ内で直接AIに指示
  • ターミナル補完:CLIコマンドの補完と説明
  • プルリクエストのサマリー生成:PR内容の要約を自動生成

セットアップと基本操作

VS Codeを例に、Copilotのセットアップと基本的な操作方法を説明します。

インストール

# VS Code拡張機能のインストール
# 1. VS Codeの拡張機能マーケットプレイスから「GitHub Copilot」をインストール
# 2. 「GitHub Copilot Chat」もインストール
# 3. GitHubアカウントでサインイン

# JetBrains IDEの場合
# Settings > Plugins > Marketplace から「GitHub Copilot」を検索してインストール

# Neovimの場合
# :Copilot setup でセットアップ

基本操作

// コード補完の基本
// 1. コードを書き始めると、グレーのテキストで提案が表示される
// 2. Tab で提案を受け入れる
// 3. Esc で提案を拒否する
// 4. Alt+] / Alt+[ で次/前の提案に切り替え

// 例: 関数名とコメントを書くだけで実装が提案される
// コメントを書く
// フィボナッチ数列のn番目の値を返す関数
function fibonacci(n: number): number {
  // ← ここでCopilotが実装を提案
  if (n <= 1) return n;
  return fibonacci(n - 1) + fibonacci(n - 2);
}

Copilot Chatの使い方

// VS Codeのサイドバーで Copilot Chat を開く(Ctrl+Shift+I / Cmd+Shift+I)

// 基本的な使い方の例:
// 「この関数を説明して」→ 選択したコードの解説
// 「TypeScriptに変換して」→ コードの言語変換
// 「テストを書いて」→ テストコードの生成
// 「パフォーマンスを改善して」→ 最適化の提案

// スラッシュコマンド:
// /explain  → コードの説明
// /fix      → バグの修正
// /tests    → テストの生成
// /doc      → ドキュメントの生成

効果的なプロンプトの書き方

Copilotから良い提案を引き出すには、適切なコンテキストを与えることが重要です。以下のテクニックを活用しましょう。

コメントでコンテキストを伝える

// 悪い例: コンテキストが少なすぎる
function process(data) {
  // ← Copilotが何をすべきか判断しにくい
}

// 良い例: 目的と条件を明示
/**
 * CSVファイルのデータをJSON配列に変換する
 * - ヘッダー行を使ってキー名を決定
 * - 空行はスキップ
 * - 数値文字列はnumber型に変換
 */
function csvToJson(csvContent: string): Record<string, unknown>[] {
  // ← Copilotが適切な実装を提案しやすい
}

型定義と関数シグネチャで導く

// TypeScriptの型定義を先に書くと、Copilotの精度が上がる

interface User {
  id: string;
  name: string;
  email: string;
  createdAt: Date;
}

interface CreateUserInput {
  name: string;
  email: string;
}

interface UserRepository {
  findById(id: string): Promise<User | null>;
  findByEmail(email: string): Promise<User | null>;
  create(input: CreateUserInput): Promise<User>;
  update(id: string, input: Partial<CreateUserInput>): Promise<User>;
  delete(id: string): Promise<void>;
}

// この後にクラスを実装し始めると、Copilotがインターフェースに
// 基づいた適切な実装を提案する
class PostgresUserRepository implements UserRepository {
  // Copilotが各メソッドの実装を提案
}

サンプルデータで意図を伝える

// 変換関数の場合、入力と出力の例を示す
/**
 * 日付文字列を日本語表記に変換する
 * 例: "2026-03-27" → "2026年3月27日(金)"
 * 例: "2026-01-01" → "2026年1月1日(木)"
 */
function formatJapaneseDate(dateString: string): string {
  // Copilotが正確な変換ロジックを提案
}

実践的な活用パターン

Copilotが特に威力を発揮する場面とその活用方法を紹介します。

パターン1:テストコードの生成

// テスト対象の関数
function validateEmail(email: string): boolean {
  const regex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
  return regex.test(email);
}

// テストファイルで関数名を書くだけで、Copilotがテストケースを生成
describe('validateEmail', () => {
  // Copilotが提案するテストケース
  it('有効なメールアドレスを受け入れる', () => {
    expect(validateEmail('user@example.com')).toBe(true);
    expect(validateEmail('test.user@domain.co.jp')).toBe(true);
  });

  it('無効なメールアドレスを拒否する', () => {
    expect(validateEmail('')).toBe(false);
    expect(validateEmail('invalid')).toBe(false);
    expect(validateEmail('@domain.com')).toBe(false);
    expect(validateEmail('user@')).toBe(false);
  });

  it('空白を含むメールアドレスを拒否する', () => {
    expect(validateEmail('user @example.com')).toBe(false);
  });
});

パターン2:APIエンドポイントの実装

// ルーティングと型定義を書くと、ハンドラーの実装が提案される
import express from 'express';
import { z } from 'zod';

const router = express.Router();

// バリデーションスキーマ
const createUserSchema = z.object({
  name: z.string().min(1).max(100),
  email: z.string().email(),
  role: z.enum(['admin', 'user']).default('user'),
});

// POST /api/users - ユーザー作成
router.post('/users', async (req, res) => {
  // Copilotがバリデーション、DB操作、エラーハンドリングを含む
  // 実装を提案
  try {
    const validated = createUserSchema.parse(req.body);
    const user = await db.user.create({ data: validated });
    res.status(201).json(user);
  } catch (error) {
    if (error instanceof z.ZodError) {
      res.status(400).json({ errors: error.errors });
    } else {
      res.status(500).json({ error: 'Internal server error' });
    }
  }
});

パターン3:正規表現の生成

// Copilot Chatに自然言語で正規表現を依頼
// 「日本の電話番号にマッチする正規表現を書いて」

// 日本の電話番号(固定電話・携帯電話)にマッチする正規表現
const phoneRegex = /^0[0-9]{1,4}-[0-9]{1,4}-[0-9]{3,4}$/;

// 郵便番号
const postalCodeRegex = /^\d{3}-\d{4}$/;

// 全角カタカナのみ
const katakanaRegex = /^[\u30A0-\u30FF]+$/;

パターン4:データベースクエリの生成

// スキーマ定義を開いた状態でクエリを書くと精度が上がる

// Prismaの例: コメントでクエリの目的を記述
// 過去30日以内に注文した顧客の一覧を取得(注文金額の合計付き)
const recentCustomers = await prisma.customer.findMany({
  where: {
    orders: {
      some: {
        createdAt: {
          gte: new Date(Date.now() - 30 * 24 * 60 * 60 * 1000),
        },
      },
    },
  },
  include: {
    orders: {
      where: {
        createdAt: {
          gte: new Date(Date.now() - 30 * 24 * 60 * 60 * 1000),
        },
      },
      select: {
        totalAmount: true,
      },
    },
  },
});

Copilot Chatの高度な活用

Copilot Chatは、コード補完以上の幅広いタスクに活用できます。

コードの説明とドキュメント生成

// コードを選択して /explain を実行
// → Copilotが日本語でコードの動作を解説

// /doc を実行するとJSDocが生成される
/**
 * 指定された条件に基づいてユーザーを検索し、
 * ページネーション付きの結果を返す
 *
 * @param filter - 検索条件(name、email、roleでフィルタ)
 * @param page - ページ番号(1始まり)
 * @param limit - 1ページあたりの件数
 * @returns ユーザー一覧とページネーション情報
 */
async function searchUsers(
  filter: UserFilter,
  page: number = 1,
  limit: number = 20
): Promise<PaginatedResult<User>> {
  // ...
}

リファクタリングの提案

// Copilot Chatに「このコードをリファクタリングして」と依頼

// Before: ネストが深く読みにくいコード
async function processOrder(orderId: string) {
  const order = await getOrder(orderId);
  if (order) {
    if (order.status === 'pending') {
      const payment = await processPayment(order);
      if (payment.success) {
        await updateOrderStatus(orderId, 'completed');
        await sendConfirmationEmail(order.userId);
        return { success: true };
      } else {
        return { success: false, error: 'Payment failed' };
      }
    } else {
      return { success: false, error: 'Order is not pending' };
    }
  } else {
    return { success: false, error: 'Order not found' };
  }
}

// After: Copilotが提案するリファクタリング(Early Return パターン)
async function processOrder(orderId: string) {
  const order = await getOrder(orderId);
  if (!order) {
    return { success: false, error: 'Order not found' };
  }

  if (order.status !== 'pending') {
    return { success: false, error: 'Order is not pending' };
  }

  const payment = await processPayment(order);
  if (!payment.success) {
    return { success: false, error: 'Payment failed' };
  }

  await updateOrderStatus(orderId, 'completed');
  await sendConfirmationEmail(order.userId);
  return { success: true };
}

セキュリティと品質の注意点

Copilotは強力なツールですが、生成されたコードを無条件に受け入れるのは危険です。以下の点に注意しましょう。

セキュリティ上の注意

// 注意1: SQLインジェクション
// Copilotが文字列結合でSQLを生成する場合がある
// 悪い例(Copilotが生成する可能性がある)
const query = `SELECT * FROM users WHERE email = '${email}'`;

// 必ずパラメータ化クエリに修正
const query = 'SELECT * FROM users WHERE email = $1';
const result = await db.query(query, [email]);
// 注意2: ハードコードされた機密情報
// Copilotがサンプル値としてAPIキーを生成する場合がある
// 悪い例
const apiKey = 'sk-1234567890abcdef';

// 環境変数を使う
const apiKey = process.env.API_KEY;
// 注意3: 安全でない暗号化
// Copilotが古い・安全でないアルゴリズムを提案する場合がある
// 悪い例
const hash = crypto.createHash('md5').update(password).digest('hex');

// 安全な方法
import bcrypt from 'bcrypt';
const hash = await bcrypt.hash(password, 12);

品質を確保するためのルール

  • 必ずレビューする:Copilotの提案を理解せずに受け入れない
  • テストで検証する:生成されたコードが正しく動作するかテストで確認
  • ライセンスに注意する:公開コードに類似したコードが生成される可能性がある
  • 機密情報を入力しない:Copilotに機密コードやAPIキーを含むコードを共有しない

チームでの活用と設定

Copilotをチーム全体で効果的に活用するための設定と方針を紹介します。

VS Codeの設定

// .vscode/settings.json
{
  // Copilotの有効/無効を言語ごとに設定
  "github.copilot.enable": {
    "*": true,
    "markdown": true,
    "yaml": true,
    "plaintext": false  // プレーンテキストでは無効
  },

  // インラインサジェストの設定
  "editor.inlineSuggest.enabled": true,

  // Copilot Chatの設定
  "github.copilot.chat.localeOverride": "ja"  // 日本語で回答
}

組織のポリシー設定(Copilot Business/Enterprise)

# GitHub組織の設定で以下を管理可能:
# - パブリックコードに一致する提案のブロック
# - Copilotを使用できるリポジトリの制限
# - テレメトリデータの送信設定
# - コンテンツの除外設定

# .github/copilot-instructions.md でチーム向けのカスタム指示を定義
# このファイルの内容がCopilotのコンテキストに追加される
# .github/copilot-instructions.md の例
## コーディング規約
- 変数名は日本語コメントで説明を付けること
- エラーハンドリングは必ず実装すること
- 関数にはJSDocを付けること
- SQLは必ずパラメータ化クエリを使用すること

まとめ:Copilotを最大限に活用するコツ

GitHub Copilotは、適切に活用すれば開発速度を大幅に向上させるツールです。最後に、効果的な活用のポイントをまとめます。

  • コンテキストを豊富に与える:型定義、コメント、関数名で意図を明確にする
  • 提案を鵜呑みにしない:必ずコードを読んで理解し、テストで検証する
  • セキュリティに注意する:SQLインジェクション、ハードコードされた機密情報に気をつける
  • テスト生成に活用する:テストコードの初期生成はCopilotの得意分野
  • リファクタリングに活用する:Copilot Chatで改善提案を受け、選択的に取り入れる
  • ボイラープレートの削減に使う:定型的なコード(CRUD操作、設定ファイルなど)を効率的に生成する

Copilotはあくまで「アシスタント」であり、最終的な判断は開発者が行うものです。AIの提案を批判的に評価しながら活用することで、品質を保ちつつ生産性を最大化できるでしょう。

#GitHub Copilot#AI#プログラミング
共有:
無料メルマガ

週1回、最新の技術記事をお届け

AI・クラウド・開発の最新記事を毎週月曜にメールでお届けします。登録は無料、いつでも解除できます。

プライバシーポリシーに基づき管理します

起業準備に役立つ情報、もっとありますよ。

まずは話だけ聞いてもらう