Git 高度なテクニック完全ガイド:Interactive Rebase、Bisect、Worktree、フック自動化
前端工程(更新: 2026年5月18日)
Git の能力の 20% しか使っていません
ほとんどの開発者は日常的に add、commit、push、pull、merge だけを使用しています。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 lg、git last、git unstage file.ts など。
#Git#版本控制#开发效率