GitとGitHub完全チートシート

## 目次
- [Gitの基礎知識](#gitの基礎知識)
- [Gitのセットアップと設定](#gitのセットアップと設定)
- [基本的なGitコマンド](#基本的なgitコマンド)
- [ブランチの操作](#ブランチの操作)
- [変更の確認と比較](#変更の確認と比較)
- [コミットの修正と歴史の変更](#コミットの修正と歴史の変更)
- [リモートリポジトリの操作](#リモートリポジトリの操作)
- [GitHubの基礎知識](#githubの基礎知識)
- [GitHubアカウントとリポジトリ管理](#githubアカウントとリポジトリ管理)
- [GitHubの主要機能](#githubの主要機能)
- [GitHubフロー](#githubフロー)
- [GitHubでのコラボレーション](#githubでのコラボレーション)
- [GitHub Actions](#github-actions)
- [GitHub CLI](#github-cli)
- [高度なGit技術](#高度なgit技術)
- [よくあるトラブルシューティング](#よくあるトラブルシューティング)

## Gitの基礎知識

### Gitとは
- 分散型バージョン管理システム
- コードの変更履歴を記録・追跡
- 複数人での共同作業を可能にする
- オフラインでも操作可能

### Gitの主要概念
- **リポジトリ**: プロジェクトとその履歴を含む格納場所
- **コミット**: 変更の保存ポイント
- **ブランチ**: 独立した開発ラインを作成
- **マージ**: ブランチの変更を統合
- **リモート**: ネットワーク上の共有リポジトリ

## Gitのセットアップと設定

### インストール
```bash
# macOS (Homebrew)
brew install git

# Ubuntu/Debian
sudo apt-get install git

# Windows
# GitHubからインストーラーをダウンロード: https://git-scm.com/download/win
```

### 初期設定
```bash
# ユーザー情報の設定（必須）
git config --global user.name "あなたの名前"
git config --global user.email "あなたのメール"

# エディタの設定
git config --global core.editor "vim"  # または好みのエディタ

# デフォルトブランチ名の設定（Git 2.28以降）
git config --global init.defaultBranch main

# 設定の確認
git config --list
```

### 認証設定
```bash
# SSHキーの生成
ssh-keygen -t ed25519 -C "your_email@example.com"

# 公開キーの表示（GitHubに追加するため）
cat ~/.ssh/id_ed25519.pub

# SSHエージェントの起動と鍵の追加
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519
```

### エイリアスの設定
```bash
# よく使うコマンドのショートカット
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
git config --global alias.st status
git config --global alias.lg "log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
```

## 基本的なGitコマンド

### リポジトリの作成
```bash
# 新しいリポジトリを初期化
git init

# 既存のリポジトリをクローン
git clone https://github.com/ユーザー名/リポジトリ名.git  # HTTPS
git clone git@github.com:ユーザー名/リポジトリ名.git      # SSH
```

### 基本的な作業フロー
```bash
# ファイルの状態を確認
git status

# ファイルをステージングエリアに追加
git add ファイル名
git add .           # すべての変更をステージング
git add -p          # 変更を対話的にステージング

# 変更をコミット
git commit -m "コミットメッセージ"
git commit -am "メッセージ"  # 追跡されているファイルの変更をステージングしてコミット

# 変更をプッシュ
git push origin ブランチ名
git push            # 現在のブランチをデフォルトのリモートにプッシュ

# 変更を取得
git pull origin ブランチ名
git pull            # 現在のブランチの変更を取得してマージ
```

### .gitignoreファイル
```
# .gitignoreの例
node_modules/
*.log
.DS_Store
.env
build/
dist/
*.bak
__pycache__/
*.pyc
```

### ファイルの操作
```bash
# ファイルの削除
git rm ファイル名     # 実際にファイルを削除し、変更をステージング
git rm --cached ファイル名  # Gitの追跡からのみ削除（ファイルは残る）

# ファイルの移動/名前変更
git mv 古いパス 新しいパス
```

## ブランチの操作

### ブランチの基本操作
```bash
# ブランチの一覧表示
git branch          # ローカルブランチ
git branch -r       # リモートブランチ
git branch -a       # すべてのブランチ

# ブランチの作成
git branch ブランチ名
git checkout -b ブランチ名  # ブランチを作成して切り替え
git switch -c ブランチ名    # Git 2.23以降

# ブランチの切り替え
git checkout ブランチ名
git switch ブランチ名      # Git 2.23以降

# ブランチの削除
git branch -d ブランチ名   # マージ済みのブランチを削除
git branch -D ブランチ名   # 強制削除

# ブランチ名の変更
git branch -m 古い名前 新しい名前  # 別のブランチの名前を変更
git branch -m 新しい名前           # 現在のブランチの名前を変更
```

### マージとリベース
```bash
# ブランチのマージ
git merge ブランチ名       # 指定したブランチを現在のブランチにマージ
git merge --no-ff ブランチ名  # fast-forwardせずにマージコミットを作成
git merge --abort         # マージを中止

# リベース
git rebase ブランチ名      # 現在のブランチを指定したブランチにリベース
git rebase -i HEAD~3      # 直近3つのコミットを対話的にリベース
git rebase --abort        # リベースを中止
git rebase --continue     # コンフリクト解決後にリベースを続行
```

### コンフリクトの解決
```bash
# コンフリクトファイルの確認
git status

# ファイルを編集してコンフリクトを解決
# <<<<<<< HEAD
# 現在のブランチの変更
# =======
# マージするブランチの変更
# >>>>>>> ブランチ名

# 解決後に続行
git add 解決したファイル
git merge --continue  # または git rebase --continue
```

## 変更の確認と比較

### 変更の差分表示
```bash
# 変更の差分を表示
git diff                # ワーキングディレクトリとステージングエリアの差分
git diff --staged       # ステージングエリアと最新コミットの差分
git diff HEAD           # ワーキングディレクトリと最新コミットの差分
git diff コミットID1 コミットID2  # 2つのコミットの差分
git diff ブランチ1..ブランチ2    # 2つのブランチの差分

# 差分の統計情報
git diff --stat
```

### コミット履歴の表示
```bash
# コミット履歴の表示
git log                 # コミット履歴
git log --oneline       # 簡潔な形式
git log --graph --oneline --all  # グラフィカルなブランチ履歴
git log -p              # 各コミットの差分を表示
git log -n 5            # 直近5つのコミットを表示
git log --author="名前"   # 特定の作者のコミット
git log --since="2023-01-01" --until="2023-12-31"  # 期間指定
git log --grep="キーワード"  # コミットメッセージで検索

# 特定のファイルの履歴
git log -- ファイル名
git blame ファイル名     # 各行の最終変更者を表示
```

### 一時的な変更の保存（stash）
```bash
# 作業中の変更を一時保存
git stash
git stash save "メッセージ"  # メッセージ付きで保存

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

# 保存した変更を適用
git stash apply         # スタックから削除せずに適用
git stash pop           # スタックから削除して適用
git stash apply stash@{n}  # 特定のスタッシュを適用

# スタッシュの操作
git stash show          # 最新のスタッシュの内容表示
git stash show -p       # 最新のスタッシュの詳細表示
git stash drop stash@{n}  # 特定のスタッシュを削除
git stash clear         # すべてのスタッシュを削除
```

## コミットの修正と歴史の変更

### コミットの修正
```bash
# 直前のコミットを修正
git commit --amend      # コミットメッセージを変更
git commit --amend --no-edit  # メッセージを変更せずにファイルを追加

# 複数のコミットを圧縮・並べ替え・分割・編集
git rebase -i HEAD~3    # 直近3つのコミットを対話的に操作
# 対話モードで使用可能なコマンド:
# p, pick = コミットをそのまま使用
# r, reword = コミットを使用するがメッセージを変更
# e, edit = コミットを使用するが一時停止して修正
# s, squash = コミットを使用するが前のコミットに統合
# f, fixup = squashと同様だがメッセージは破棄
# d, drop = コミットを削除
```

### コミットの打ち消しとリセット
```bash
# コミットの打ち消し（新しいコミットを作成）
git revert コミットID    # 指定したコミットを打ち消す新しいコミットを作成
git revert HEAD         # 直前のコミットを打ち消す

# 歴史のリセット（注意！歴史を書き換える）
git reset --soft HEAD~1   # コミットを取り消し、変更をステージングエリアに残す
git reset --mixed HEAD~1  # コミットを取り消し、変更をワーキングディレクトリに残す
git reset --hard HEAD~1   # コミットと変更を完全に削除（注意！）
```

### コミットの移動と選択
```bash
# コミットの選択（cherry-pick）
git cherry-pick コミットID  # 特定のコミットを現在のブランチに適用
git cherry-pick コミットID1..コミットID2  # 範囲を指定

# ブランチポインタの移動
git reset --hard コミットID  # 特定のコミットに移動（注意！）

# コミットの分割
git rebase -i コミットID^
# edit に変更し、rebase開始後:
git reset HEAD^           # コミットを取り消し
git add -p                # 変更を部分的にステージング
git commit -m "最初の部分"
git add .                 # 残りの変更をステージング
git commit -m "2番目の部分"
git rebase --continue
```

## リモートリポジトリの操作

### リモートの管理
```bash
# リモートの一覧表示
git remote -v

# リモートの追加
git remote add 名前 URL

# リモートの削除
git remote remove 名前

# リモートの変更
git remote set-url 名前 新しいURL

# リモートの詳細表示
git remote show origin
```

### リモートとの同期
```bash
# リモートの情報を取得
git fetch origin         # 変更を取得するがマージしない
git fetch --all          # すべてのリモートから取得
git fetch --prune        # リモートで削除されたブランチを削除

# リモートの変更を取得してマージ
git pull                 # 現在のブランチの変更を取得してマージ
git pull --rebase        # 取得した変更をリベースで適用

# リモートブランチを追跡
git branch --track ブランチ名 origin/ブランチ名
git checkout --track origin/ブランチ名  # リモートブランチを追跡するローカルブランチを作成

# リモートブランチの削除
git push origin --delete ブランチ名
```

### プッシュの詳細オプション
```bash
# 通常のプッシュ
git push origin ブランチ名

# 新しいリモートブランチにプッシュ
git push -u origin ブランチ名  # ブランチをプッシュして追跡設定

# 強制プッシュ（注意！）
git push --force         # 履歴を強制的に上書き（危険）
git push --force-with-lease  # 他の人の変更を上書きしないよう保護

# タグのプッシュ
git push origin タグ名
git push origin --tags   # すべてのタグをプッシュ
```

### タグの操作
```bash
# タグの一覧
git tag
git tag -l "v1.*"        # パターンでフィルタリング

# タグの作成
git tag タグ名            # 軽量タグ
git tag -a タグ名 -m "メッセージ"  # 注釈付きタグ
git tag -a タグ名 コミットID      # 過去のコミットにタグ付け

# タグの削除
git tag -d タグ名         # ローカルタグの削除
git push origin :refs/tags/タグ名  # リモートタグの削除
```

## GitHubの基礎知識

### GitHubとは
- Gitリポジトリのホスティングサービス
- コードの共有・協力開発のためのプラットフォーム
- コードレビュー、イシュー管理、CI/CD等の機能提供

### GitとGitHubの違い
- **Git**: 分散型バージョン管理システム（ツール）
- **GitHub**: Gitリポジトリをホスティングするウェブサービス

## GitHubアカウントとリポジトリ管理

### アカウント設定
- プロファイル設定
- SSHキーの追加（Settings > SSH and GPG keys）
- 二要素認証の設定（Settings > Password and authentication）
- Personal Access Tokenの作成（Settings > Developer settings）

### リポジトリの作成と管理
```bash
# ウェブインターフェイスでの作成
# 1. GitHubにログイン
# 2. 右上の「+」> New repository
# 3. 必要事項を入力して作成

# 既存のローカルリポジトリをGitHubに追加
git remote add origin https://github.com/ユーザー名/リポジトリ名.git
git branch -M main
git push -u origin main

# GitHubからクローン
git clone https://github.com/ユーザー名/リポジトリ名.git
```

### リポジトリの設定
- デフォルトブランチの変更
- ブランチ保護ルールの設定
- コラボレーターの追加
- トピックの設定
- リポジトリの公開/非公開設定

## GitHubの主要機能

### Pull Request（PR）
```bash
# 基本的なPRのワークフロー
git checkout -b 機能ブランチ
# 変更を加えてコミット
git commit -am "新機能を追加"
# ブランチをプッシュ
git push -u origin 機能ブランチ

# GitHubのウェブインターフェースでPRを作成
# 1. リポジトリページで「Compare & pull request」
# 2. ベースブランチと比較ブランチを確認
# 3. タイトルと説明を入力
# 4. 「Create pull request」をクリック
```

### PRレビューとマージ
- コードレビューの実施
- レビューコメントの追加
- 承認または変更リクエスト
- PRのマージ方法:
  - Create a merge commit
  - Squash and merge
  - Rebase and merge

### Issues
- 課題・バグ・機能要望の追跡
- テンプレートの使用
- ラベル、マイルストーン、アサインの設定
- Issue間のリンク
- PRとIssueの連携（キーワード: fixes, closes, resolves）

### Discussions
- コミュニティディスカッションの場
- カテゴリ分け
- アナウンス、Q&A、アイデア共有

### Wiki
- プロジェクトのドキュメント管理
- マークダウン形式でのページ作成
- 目次と階層構造の設定

### フォークとクローン
```bash
# GitHubでリポジトリをフォーク（ウェブインターフェース）

# フォークしたリポジトリをクローン
git clone https://github.com/あなたのユーザー名/リポジトリ名.git

# オリジナルリポジトリを追加（アップストリーム）
git remote add upstream https://github.com/オリジナル所有者/リポジトリ名.git

# アップストリームから更新を取得
git fetch upstream
git merge upstream/main  # または適切なブランチ
# または
git pull upstream main
```

### ブランチ保護
- mainブランチへの直接プッシュを禁止
- マージ前にレビュー承認を必須に
- ステータスチェック（CIテスト）の通過を必須に
- 署名済みコミットの要求

### セキュリティ機能
- 脆弱性アラート
- 依存関係のバージョン更新
- Code scanning（コード品質・セキュリティ検査）
- Secret scanning（誤ってコミットされた機密情報の検出）

## GitHubフロー

### 基本的なワークフロー
1. **メインブランチからフィーチャーブランチを作成**
   ```bash
   git checkout main
   git pull
   git checkout -b feature/新機能
   ```

2. **変更を加えてコミット**
   ```bash
   # ファイルを編集
   git add .
   git commit -m "機能を実装"
   ```

3. **変更をプッシュしてPRを作成**
   ```bash
   git push -u origin feature/新機能
   # GitHubでPRを作成
   ```

4. **レビュー後にマージ**
   ```bash
   # GitHubでマージボタンを使用
   # または:
   git checkout main
   git merge feature/新機能
   git push
   ```

5. **ブランチの削除**
   ```bash
   git branch -d feature/新機能
   git push origin --delete feature/新機能
   ```

### GitHubフローの特徴
- シンプルで理解しやすい
- 継続的なデプロイに適している
- メインブランチは常にデプロイ可能な状態を保つ
- フィーチャーブランチでの作業と頻繁なPR

## GitHubでのコラボレーション

### Issue駆動開発
1. **GitHubでIssueを作成**
2. **Issue番号を含むブランチを作成**
   ```bash
   git checkout -b fix/123-バグ修正
   ```
3. **コミットメッセージにIssue番号を含める**
   ```bash
   git commit -m "Fix #123: バグを修正"
   ```
4. **PRを作成し、Issueに関連付け**

### コードレビュー手法
- 行ごとのコメント
- 全体的なフィードバック
- 提案付きコメント（変更案を直接提示）
- レビュー状態：Comment, Approve, Request changes

### プロジェクト管理
- プロジェクトボードの使用
- カンバン形式でのタスク管理
- 自動化ルールの設定
- マイルストーンによる進捗管理

### ドキュメント作成
- README.mdの充実
- CONTRIBUTING.mdの作成
- CODEOFCONDUCTの設定
- GItHub Pagesの活用

## GitHub Actions

### 基本構成
```yaml
# .github/workflows/main.yml の例
name: CI

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

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    - name: Setup Node.js
      uses: actions/setup-node@v3
      with:
        node-version: '16'
    - name: Install dependencies
      run: npm ci
    - name: Run tests
      run: npm test
```

### トリガーの種類
- push, pull_request
- schedule（cron形式でスケジュール実行）
- workflow_dispatch（手動実行）
- repository_dispatch（外部イベント）

### 主なユースケース
- CI（継続的インテグレーション）
  - コードのビルド
  - テストの実行
  - コードスタイルチェック
- CD（継続的デリバリー）
  - 自動デプロイ
  - リリースの自動化
- プロジェクト管理の自動化
  - Issue・PRへの自動ラベル付け
  - ステータスの自動更新

### シークレットと環境変数
```yaml
jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Deploy to server
        env:
          API_KEY: ${{ secrets.API_KEY }}
        run: ./deploy.sh
```

## GitHub CLI

### インストールと設定
```bash
# インストール
# macOS: brew install gh
# Windows: scoop install gh または choco install gh
# Linux: apt install gh など

# 認証
gh auth login
```

### リポジトリ操作
```bash
# リポジトリ作成
gh repo create 名前 --public/--private

# リポジトリクローン
gh repo clone ユーザー/リポジトリ

# リポジトリのビュー
gh repo view

# リポジトリをフォーク
gh repo fork ユーザー/リポジトリ
```

### プルリクエスト操作
```bash
# PRを作成
gh pr create --title "タイトル" --body "説明"

# PR一覧の表示
gh pr list

# PRをチェックアウト
gh pr checkout 番号

# PRをレビュー
gh pr review 番号 --approve/--comment/--request-changes

# PRをマージ
gh pr merge 番号 --merge/--squash/--rebase
```

### Issue操作
```bash
# Issueを作成
gh issue create --title "タイトル" --body "説明"

# Issue一覧の表示
gh issue list

# Issueの表示
gh issue view 番号

# Issueの状態変更
gh issue close 番号
gh issue reopen 番号
```

### ワークフロー操作
```bash
# ワークフロー実行一覧
gh workflow list

# ワークフロー実行
gh workflow run ワークフロー名
```

## 高度なGit技術

### Git Hooks
- pre-commit: コミット前に実行
- post-commit: コミット後に実行
- pre-push: プッシュ前に実行
- カスタムフックの作成: `.git/hooks/`ディレクトリ内に実行可能スクリプトを配置

### サブモジュール
```bash
# サブモジュールの追加
git submodule add リポジトリURL パス

# サブモジュール付きのリポジトリをクローン
git clone --recursive リポジトリURL

# 既存のリポジトリのサブモジュールを初期化
git submodule init
git submodule update

# すべてのサブモジュールを更新
git submodule update --remote
```

### Git LFS（Large File Storage）
```bash
# Git LFSのインストール
git lfs install

# ファイルタイプを追跡
git lfs track "*.psd"

# .gitattributesをコミット
git add .gitattributes
git commit -m "LFSで追跡するファイルを設定"

# 通常のGit操作と同様に使用
git add 大きなファイル
git commit -m "大きなファイルを追加"
```

### Git Bisect
```bash
# バイセクトを開始
git bisect start

# 不具合が発生するコミットを指定
git bisect bad

# 不具合が発生しない古いコミットを指定
git bisect good コミットID

# 各コミットをテストして結果を報告
git bisect good  # 現在のコミットで問題なし
git bisect bad   # 現在のコミットで問題あり

# バイセクトを終了
git bisect reset
```

### GPGでのコミット署名
```bash
# GPGキーを生成
gpg --full-generate-key

# GPGキーをGitに設定
git config --global user.signingkey GPGキーID

# コミットに署名
git commit -S -m "署名付きコミット"

# 常に署名するよう設定
git config --global commit.gpgsign true
```

### リファレンスとリフログ
```bash
# reflog - 操作履歴を表示
git reflog

# 参照の表示
git show-ref
git show-ref --heads  # ローカルブランチの参照のみ

# refspecの使用
git push origin HEAD:refs/heads/新しいブランチ
```

### フィルタリングとクリーンアップ
```bash
# ファイル履歴からの機密情報削除（注意！履歴書き換え）
git filter-branch --force --index-filter \
  "git rm --cached --ignore-unmatch パス/ファイル名" \
  --prune-empty -- --all

# git-filter-repoの使用（より推奨）
# pip install git-filter-repo
git-filter-repo --path パス/ファイル名 --invert-paths
```

## よくあるトラブルシューティング

### コミットの取り消し
```bash
# 直前のコミットを取り消し（変更は保持）
git reset --soft HEAD^

# 直前のコミットを完全に削除（注意！）
git reset --hard HEAD^

# 特定のコミットを打ち消す新しいコミットを作成
git revert コミットID
```

### 誤ったブランチにコミットした場合
```bash
# 1. コミットを保存
git branch 正しいブランチ

# 2. 変更を元に戻す
git reset --hard HEAD~1  # 注意：コミット内容が正しいブランチに保存されていることを確認

# 3. 正しいブランチに切り替え
git checkout 正しいブランチ
```

### マージコンフリクトの解決
```bash
# コンフリクトが発生した場合
git status  # コンフリクトファイルを確認

# ファイルを編集してコンフリクトを解決
# <<<<<<< HEAD
# 現在のブランチの変更
# =======
# マージするブランチの変更
# >>>>>>> ブランチ名

# 解決後にコミット
git add 解決したファイル
git commit  # または git merge --continue
```

### リモートとの同期問題
```bash
# リモートからの変更と競合
git pull --rebase  # リモートの変更を取得し、ローカルの変更をリベース

# プッシュが拒否された場合
git pull
git push  # または
git push --force-with-lease  # 他の人の変更を上書きしないよう保護
```

### 削除したブランチの復元
```bash
# 削除したブランチの最後のコミットを見つける
git reflog

# 新しいブランチを作成して復元
git branch 復元ブランチ コミットID
```

### 巨大なリポジトリのパフォーマンス改善
```bash
# 部分クローン
git clone --filter=blob:none リポジトリURL  # ファイル内容なしでクローン
git clone --depth 1 リポジトリURL  # 浅いクローン（最新コミットのみ）

# リポジトリの最適化
git gc  # ガベージコレクション実行
git prune  # 到達不能なオブジェクトを削除
```

### コミット歴史のクリーンアップ
```bash
# 不要なファイルを履歴から削除
git filter-branch --force --index-filter \
  'git rm --cached --ignore-unmatch 大きなファイル' \
  --prune-empty -- --all

# リモートリポジトリに強制プッシュ（注意！）
git push origin --force --all
```

### GitHubリポジトリのトラブル
```bash
# リモートURLの確認と変更
git remote -v
git remote set-url origin 新しいURL

# 認証の問題
# SSHキーの確認
ssh -T git@github.com

# HTTPSでのパスワード認証からトークン認証への移行
git remote set-url origin https://ユーザー名:パーソナルアクセストークン@github.com/ユーザー名/リポジトリ名.git
```

### GitHub Actions のトラブル
- ワークフローログの確認
- シークレットと環境変数の正しい設定
- ランナー環境の互換性確認
- タイムアウト設定の調整