Git 高度なテクニック完全ガイド:Interactive Rebase、Bisect、Worktree、フック自動化

前端工程(更新: 2026年5月18日)

Git の能力の 20% しか使っていません

ほとんどの開発者は日常的に addcommitpushpullmerge だけを使用しています。Git の真の力は、正確な履歴制御、迅速なバグ特定、並行マルチタスク、自動化ワークフローにあります。


1. Interactive Rebase:コミット履歴の再構築

基本操作

git rebase -i HEAD~5

エディタが開き、直近 5 つのコミットが表示されます:

pick a1b2c3f feat: ユーザーリストページを追加
pick d4e5f6g fix: リストのソート問題を修正
pick h7i8j9k feat: 検索機能を追加
pick l0m1n2o chore: 依存関係を更新
pick p3q4r5s feat: ページネーションコンポーネントを追加

6 つの操作

コマンド 目的 ユースケース
pick コミットを保持 デフォルト
squash 前のコミットに統合 複数の小さな修正を 1 つに
fixup 統合してメッセージを破棄 同上、メッセージ不要
reword コミットメッセージを修正 タイプミスの修正
edit 一時停止してコミットを修正 分割や内容変更
drop コミットを破棄 誤ったコミットの削除

実践:フィーチャーブランチの整理

# 元のコミット
pick abc1234 feat: ユーザーモジュール WIP
pick def5678 fix: null ポインタを修正
pick ghi9012 fix: 型エラーを修正
pick jkl3456 feat: 検索を追加
pick mno7890 chore: コードをフォーマット

# 整理後
pick abc1234 feat: ユーザーモジュールを追加
fixup def5678   # abc1234 に統合
fixup ghi9012   # abc1234 に統合
pick jkl3456 feat: 検索機能を追加
drop mno7890   # フォーマットコミットを破棄

自動 fixup

# fixup コミットを作成(ターゲットコミットをマーク)
git commit --fixup=abc1234

# 自動リベース、fixup コミットがターゲットを見つけて統合
git rebase -i --autosquash

2. Git Bisect:バグ導入ポイントの二分探索

バグが発生したが、どのコミットで導入されたかわからない場合、bisect が二分探索で素早く特定します。

手動 Bisect

# 二分探索を開始
git bisect start

# 現在のバージョンにバグがあることをマーク
git bisect bad

# 既知の正常なバージョンをマーク
git bisect good v2.0.0

# Git が自動的に中間バージョンをチェックアウト
# テスト後にマーク
git bisect good   # または git bisect bad

# バグを導入したコミットが見つかるまで繰り返し
# Git の出力:abc1234 is the first bad commit

# 探索を終了
git bisect reset

自動 Bisect

# スクリプトで各バージョンを自動テスト
git bisect start HEAD v2.0.0
git bisect run npm test

# またはカスタムスクリプト
git bisect run ./scripts/test-bug.sh
#!/bin/bash
# scripts/test-bug.sh
npm run build
if curl -s http://localhost:3000/api/health | grep -q "ok"; then
  exit 0  # good
else
  exit 1  # bad
fi

効率性:1000 コミットでも 10 回の二分探索で済みます(log₂(1000) ≈ 10)。


3. Git Worktree:複数ブランチでの同時作業

問題

feature/A で開発中に、緊急の hotfix/B 修正が必要になった — stash もしたくないし、新しい clone も作りたくない。

解決策

# ホットフィックス用のワークツリーを作成
git worktree add ../hotfix-B hotfix/B

# ../hotfix-B ディレクトリで作業、現在のブランチに影響なし
cd ../hotfix-B
# 修正、コミット、プッシュ
git add . && git commit -m "fix: 緊急修正"
git push

# 元の作業に戻る
cd ../main-project
# feature/A の開発を続行、完全に影響なし

# ワークツリーをクリーンアップ
git worktree remove ../hotfix-B

ワークツリーの管理

# すべてのワークツリーを一覧表示
git worktree list

# ワークツリーをロック(誤削除を防止)
git worktree lock ../hotfix-B

# ロック解除
git worktree unlock ../hotfix-B
比較 git stash git worktree git clone
ディスク使用量 0 差分ファイルのみ 全量
切り替えコスト stash + checkout cd で移動 cd で移動
並行作業 非対応 対応 対応
.git 共有 あり あり なし

4. Git Hooks:自動化ワークフロー

クライアントサイドフック

フック トリガー ユースケース
pre-commit git commit コードチェック、フォーマット
prepare-commit-msg コミットメッセージ編集前 プレフィックスの自動追加
commit-msg コミットメッセージ作成後 メッセージ形式の検証
pre-push git push テスト実行
post-checkout ブランチ切り替え後 依存関係のインストール

サーバーサイドフック

フック トリガー ユースケース
pre-receive プッシュ受信前 権限チェック
update 各参照更新前 ブランチ保護
post-receive プッシュ受信後 CI/CD トリガー

Husky + lint-staged の使用

npm install husky lint-staged --save-dev
npx husky init
// .husky/pre-commit
npx lint-staged
// package.json
{
  "lint-staged": {
    "*.{js,ts,tsx}": [
      "eslint --fix",
      "prettier --write"
    ],
    "*.css": [
      "stylelint --fix"
    ]
  }
}

commitlint によるコミットメッセージ検証

npm install @commitlint/cli @commitlint/config-conventional --save-dev
// commitlint.config.js
module.exports = {
  extends: ['@commitlint/config-conventional'],
  rules: {
    'type-enum': [2, 'always', [
      'feat', 'fix', 'docs', 'style', 'refactor',
      'perf', 'test', 'build', 'ci', 'chore', 'revert',
    ]],
    'subject-max-length': [2, 'always', 100],
  },
};
# .husky/commit-msg
npx --no -- commitlint --edit $1

5. Git Stash 高度な使い方

複数の Stash

# メッセージ付き stash
git stash push -m "WIP: ユーザーリスト検索機能"

# すべての stash を一覧表示
git stash list
# stash@{0}: On feature/search: WIP: ユーザーリスト検索機能
# stash@{1}: On feature/order: WIP: 注文詳細ページ

# 特定の stash を適用
git stash apply stash@{1}

# 部分 stash
git stash push -m "CSS のみ stash" -- '**/*.css'

Stash からブランチを作成

git stash branch feature/search stash@{0}
# 新しいブランチを作成して stash を適用、WIP を正式ブランチにするのに最適

6. Git Log 高度なクエリ

コミット内容の検索

# 特定の文字列を含むコミットを検索
git log -S "function calculateTotal"

# 正規表現にマッチするコミットを検索
git log -G "calculate.*Total"

# 特定のファイルの履歴を検索
git log --follow -- src/utils/calc.ts

# コミットごとのファイル変更統計を表示
git log --stat

# コミットごとの詳細な差分を表示
git log -p -- src/utils/calc.ts

フォーマット出力

# カスタムフォーマット
git log --format="%h %ad | %s%d [%an]" --date=short

# 出力:
# a1b2c3f 2026-05-30 | feat: 検索機能を追加 (HEAD -> main) [田中]
# d4e5f6g 2026-05-29 | fix: ソート問題を修正 [佐藤]

ブランチマージグラフの表示

git log --graph --oneline --all --decorate

7. Git Reflog:タイムマシン

reflog は HEAD のすべての移動を記録します。「削除された」コミットも復元できます。

# 操作履歴を表示
git reflog
# a1b2c3f HEAD@{0}: commit: feat: 新機能
# d4e5f6g HEAD@{1}: rebase: リベース続行
# h7i8j9k HEAD@{2}: reset: moving to HEAD~1
# l0m1n2o HEAD@{3}: commit: 誤って削除されたコミット

# 削除されたコミットを復元
git cherry-pick l0m1n2o

# または直接以前の状態に戻る
git reset --hard HEAD@{3}

保持期間:デフォルト 90 日(gc.reflogExpire)、参照されていないコミットは 30 日。


8. 便利なエイリアス設定

git config --global alias.lg "log --graph --oneline --all --decorate"
git config --global alias.last "log -1 HEAD --stat"
git config --global alias.unstage "reset HEAD --"
git config --global alias.amend "commit --amend --no-edit"
git config --global alias.wip "commit -m 'WIP'"
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.st status

使用方法:git lggit lastgit unstage file.ts など。

#Git#版本控制#开发效率