git-advanced-workflows について
複雑な Git の履歴やブランチ運用に取り組む開発者向けのスキルです。履歴整理、並行開発、バグ調査、操作ミスからの復旧を扱います。
主な機能
- 01インタラクティブリベースと履歴整理
- 02ブランチ間でのコミット適用
- 03不具合導入コミットの二分探索
- 04worktree による並行開発
- 05reflog を使ったコミット復旧
活用シーン
- 01マージ前のフィーチャーブランチ整理
- 02複数のリリースブランチへの修正適用
- 03不具合を導入したコミットの特定
- 04誤ったリセットや削除後のコミット復旧
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ rmyndharis/ antigravity-skills --skill git-advanced-workflowsインストール後、Claude Code で/git-advanced-workflowsを入力して読み込まれたか確認します。
詳細
Git の高度なワークフロー
Git の高度なテクニックを習得し、履歴を整理して、効果的に共同作業し、どのような状況からも自信を持って復旧できるようにします。
このスキルを使用しない場合
- タスクが Git の高度なワークフローに関係しない場合
- この範囲外の別の分野やツールが必要な場合
手順
- 目標、制約、必要な入力を明確にします。
- 関連するベストプラクティスを適用し、結果を検証します。
- 実行可能な手順と検証方法を提示します。
このスキルを使用する場合
- マージ前にコミット履歴を整理する
- 特定のコミットを別のブランチに適用する
- バグを引き起こしたコミットを特定する
- 複数の機能を同時に開発する
- Git の操作ミスやコミットの消失から復旧する
- 複雑なブランチのワークフローを管理する
- レビュー用に整理された PR を準備する
- 分岐したブランチを同期する
基本概念
1. インタラクティブリベース
インタラクティブリベースは、Git の履歴編集に使える万能ツールです。
一般的な操作:
pick:コミットをそのまま保持するreword:コミットメッセージを変更するedit:コミットの内容を修正するsquash:直前のコミットと統合するfixup:squashと同様ですが、メッセージは破棄するdrop:コミットを完全に削除する
基本的な使用方法:
# Rebase last 5 commits
git rebase -i HEAD~5
# Rebase all commits on current branch
git rebase -i $(git merge-base HEAD main)
# Rebase onto specific commit
git rebase -i abc123
2. チェリーピック
ブランチ全体をマージせずに、あるブランチから別のブランチへ特定のコミットを適用します。
# Cherry-pick single commit
git cherry-pick abc123
# Cherry-pick range of commits (exclusive start)
git cherry-pick abc123..def456
# Cherry-pick without committing (stage changes only)
git cherry-pick -n abc123
# Cherry-pick and edit commit message
git cherry-pick -e abc123
3. Git Bisect
コミット履歴を二分探索し、バグを引き起こしたコミットを特定します。
# Start bisect
git bisect start
# Mark current commit as bad
git bisect bad
# Mark known good commit
git bisect good v1.0.0
# Git will checkout middle commit - test it
# Then mark as good or bad
git bisect good # or: git bisect bad
# Continue until bug found
# When done
git bisect reset
自動 Bisect:
# Use script to test automatically
git bisect start HEAD v1.0.0
git bisect run ./test.sh
# test.sh should exit 0 for good, 1-127 (except 125) for bad
4. ワークツリー
スタッシュやブランチの切り替えを行わずに、複数のブランチで同時に作業できます。
# List existing worktrees
git worktree list
# Add new worktree for feature branch
git worktree add ../project-feature feature/new-feature
# Add worktree and create new branch
git worktree add -b bugfix/urgent ../project-hotfix main
# Remove worktree
git worktree remove ../project-feature
# Prune stale worktrees
git worktree prune
5. Reflog
セーフティネットとして、削除されたコミットも含め、すべての参照の移動を記録します。
# View reflog
git reflog
# View reflog for specific branch
git reflog show feature/branch
# Restore deleted commit
git reflog
# Find commit hash
git checkout abc123
git branch recovered-branch
# Restore deleted branch
git reflog
git branch deleted-branch abc123
実践的なワークフロー
ワークフロー 1:PR の前に機能ブランチを整理する
# Start with feature branch
git checkout feature/user-auth
# Interactive rebase to clean history
git rebase -i main
# Example rebase operations:
# - Squash "fix typo" commits
# - Reword commit messages for clarity
# - Reorder commits logically
# - Drop unnecessary commits
# Force push cleaned branch (safe if no one else is using it)
git push --force-with-lease origin feature/user-auth
ワークフロー 2:複数のリリースにホットフィックスを適用する
# Create fix on main
git checkout main
git commit -m "fix: critical security patch"
# Apply to release branches
git checkout release/2.0
git cherry-pick abc123
git checkout release/1.9
git cherry-pick abc123
# Handle conflicts if they arise
git cherry-pick --continue
# or
git cherry-pick --abort
ワークフロー 3:バグが混入した箇所を特定する
# Start bisect
git bisect start
git bisect bad HEAD
git bisect good v2.1.0
# Git checks out middle commit - run tests
npm test
# If tests fail
git bisect bad
# If tests pass
git bisect good
# Git will automatically checkout next commit to test
# Repeat until bug found
# Automated version
git bisect start HEAD v2.1.0
git bisect run npm test
ワークフロー 4:複数ブランチでの開発
# Main project directory
cd ~/projects/myapp
# Create worktree for urgent bugfix
git worktree add ../myapp-hotfix hotfix/critical-bug
# Work on hotfix in separate directory
cd ../myapp-hotfix
# Make changes, commit
git commit -m "fix: resolve critical bug"
git push origin hotfix/critical-bug
# Return to main work without interruption
cd ~/projects/myapp
git fetch origin
git cherry-pick hotfix/critical-bug
# Clean up when done
git worktree remove ../myapp-hotfix
ワークフロー 5:操作ミスから復旧する
# Accidentally reset to wrong commit
git reset --hard HEAD~5 # Oh no!
# Use reflog to find lost commits
git reflog
# Output shows:
# abc123 HEAD@{0}: reset: moving to HEAD~5
# def456 HEAD@{1}: commit: my important changes
# Recover lost commits
git reset --hard def456
# Or create branch from lost commit
git branch recovery def456
高度なテクニック
リベースとマージの使い分け
リベースを使う場合:
- プッシュ前にローカルのコミットを整理する
- 機能ブランチを main に対して最新の状態に保つ
- レビューしやすい直線的な履歴を作成する
マージを使う場合:
- 完了した機能を main に統合する
- 共同作業の正確な履歴を保持する
- 他のユーザーが使用する公開ブランチを扱う
# Update feature branch with main changes (rebase)
git checkout feature/my-feature
git fetch origin
git rebase origin/main
# Handle conflicts
git status
# Fix conflicts in files
git add .
git rebase --continue
# Or merge instead
git merge origin/main
Autosquash ワークフロー
リベース中に fixup コミットを自動的にスカッシュします。
# Make initial commit
git commit -m "feat: add user authentication"
# Later, fix something in that commit
# Stage changes
git commit --fixup HEAD # or specify commit hash
# Make more changes
git commit --fixup abc123
# Rebase with autosquash
git rebase -i --autosquash main
# Git automatically marks fixup commits
コミットの分割
1 つのコミットを、複数の論理的なコミットに分割します。
# Start interactive rebase
git rebase -i HEAD~3
# Mark commit to split with 'edit'
# Git will stop at that commit
# Reset commit but keep changes
git reset HEAD^
# Stage and commit in logical chunks
git add file1.py
git commit -m "feat: add validation"
git add file2.py
git commit -m "feat: add error handling"
# Continue rebase
git rebase --continue
部分的なチェリーピック
コミットから特定のファイルだけをチェリーピックします。
# Show files in commit
git show --name-only abc123
# Checkout specific files from commit
git checkout abc123 -- path/to/file1.py path/to/file2.py
# Stage and commit
git commit -m "cherry-pick: apply specific changes from abc123"
ベストプラクティス
- 必ず --force-with-lease を使用する:--force より安全で、他の人の作業を上書きするのを防ぎます
- ローカルのコミットのみをリベースする:プッシュして共有済みのコミットはリベースしないでください
- 説明的なコミットメッセージを書く:未来の自分が今の自分に感謝するでしょう
- アトミックなコミットにする:各コミットは単一の論理的な変更にします
- 強制プッシュ前にテストする:履歴の書き換えによって問題が発生していないことを確認します
- Reflog を意識する:Reflog は 90 日間有効なセーフティネットであることを覚えておきます
- リスクの高い操作の前にブランチを作成する:複雑なリベースの前にバックアップブランチを作成します
# Safe force push
git push --force-with-lease origin feature/branch
# Create backup before risky operation
git branch backup-branch
git rebase -i main
# If something goes wrong
git reset --hard backup-branch
よくある落とし穴
- 公開ブランチのリベース:共同作業者との履歴の衝突を引き起こします
- リースなしの強制プッシュ:チームメイトの作業を上書きする可能性があります
- リベース中の作業の消失:競合を慎重に解決し、リベース後にテストします
- ワークツリーのクリーンアップ忘れ:孤立したワークツリーがディスク容量を消費します
- 試行前のバックアップ忘れ:必ずセーフティブランチを作成します
- 作業ディレクトリがクリーンでない状態での Bisect:Bisect の前にコミットするか、スタッシュします
復旧コマンド
# Abort operations in progress
git rebase --abort
git merge --abort
git cherry-pick --abort
git bisect reset
# Restore file to version from specific commit
git restore --source=abc123 path/to/file
# Undo last commit but keep changes
git reset --soft HEAD^
# Undo last commit and discard changes
git reset --hard HEAD^
# Recover deleted branch (within 90 days)
git reflog
git branch recovered-branch abc123
コメント
Markdown 対応