git-advanced-workflows について
履歴整理、ブランチでの共同作業、問題の特定と復旧を扱う、開発者向けの Git ワークフロースキルです。実用的なコマンドに加え、破壊的操作や共有履歴に関する安全策を示します。
主な機能
- 01インタラクティブ rebase と履歴整理
- 02ブランチ間での cherry-pick
- 03bisect による不具合導入コミットの特定
- 04worktree による複数ブランチ作業
- 05reflog を使ったコミットの復旧
- 06リスクの高い操作の安全確認
活用シーン
- 01レビュー前の機能ブランチの整理
- 02複数リリースブランチへの修正適用
- 03不具合を導入したコミットの特定
- 04複数ブランチでの並行作業やコミット復旧
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ sickn33/ agentic-awesome-skills --skill git-advanced-workflowsインストール後、Claude Code で/git-advanced-workflowsを入力して読み込まれたか確認します。
詳細
Git の高度なワークフロー
高度な Git のテクニックを習得し、クリーンな履歴を保ち、効果的に協力し、どんな状況からも自信を持って復旧できるようにしましょう。
このスキルを使用しない場合
- タスクが Git の高度なワークフローに関係しない場合
- この範囲外の別の分野やツールが必要な場合
手順
- 目標、制約、必要な入力を明確にします。
- 関連するベストプラクティスを適用し、結果を検証します。
- 実行可能な手順と確認方法を提示します。
使用する場面
- マージ前にコミット履歴を整理する
- 特定のコミットを別のブランチに適用する
- バグを導入したコミットを特定する
- 複数の機能に同時に取り組む
- Git の操作ミスやコミットの消失から復旧する
- 複雑なブランチのワークフローを管理する
- レビュー用にクリーンな PR を準備する
- 分岐したブランチを同期する
リポジトリと復旧の境界
まず、リポジトリの指示とブランチ保護を確認します。ホットフィックスでは、必要に応じて保護された PR/メンテナーの手順に従います。緊急であっても、デフォルトブランチへの直接のコミットやプッシュが許可されるわけではありません。チェックアウト、リベース、リセット、復元の前に、未コミットの変更やステージ済みの作業を保全します。バックアップブランチで保護できるのはコミット済みの履歴のみで、未コミットのファイルは保護されません。破壊的な操作の前に対象を正確に確認し、共有履歴を書き換える場合は承認を得ます。reflog の利用可能性はローカルでの有効期限とガベージコレクションに左右されるため、失われたすべてのファイルを復旧できるとは限りません。
基本概念
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 an authorized topic branch from the current target
git fetch origin main
git switch -c hotfix/security origin/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
# Historical incident: a hard reset discarded local work; do not reproduce it.
# 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
# Preserve the located commit for inspection first
git branch recovered-commit def456
# Reset only after saving dirty work and authorizing its loss
# 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 <resolved-paths>
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"
ベストプラクティス
- 承認された書き換えのみ:承認済みのトピックブランチを書き換える場合は、期待するリモート SHA を明示した lease を使用します。lease は共有履歴を書き換える許可ではありません
- ローカルのコミットのみをリベースする:プッシュして共有済みのコミットはリベースしないでください
- 説明的なコミットメッセージ:未来のあなたが、今のあなたに感謝するでしょう
- アトミックなコミット:各コミットは単一の論理的な変更にします
- 強制プッシュ前にテストする:履歴の書き換えによって問題が発生していないことを確認します
- Reflog の特性を把握する:reflog は有効期限を設定できるローカルの復旧手段であり、参照されなくなったエントリはより早く期限切れになる場合があります
- リスクのある操作の前にブランチを作成する:複雑なリベースの前にバックアップブランチを作成します
# Authorized topic rewrite only; verify the expected remote head
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, inspect the backup in a separate worktree first
git worktree add --detach ../rebase-recovery backup-branch
よくある落とし穴
- 公開ブランチのリベース:共同作業者との間で履歴の競合が発生します
- リースなしでの強制プッシュ:チームメイトの作業を上書きする可能性があります
- リベース中の作業消失:競合を慎重に解決し、リベース後にテストしてください
- ワークツリーのクリーンアップ忘れ:孤立したワークツリーがディスク容量を消費します
- 実験前のバックアップ忘れ:必ず安全用ブランチを作成してください
- 作業ディレクトリが汚れた状態での二分探索:二分探索の前にコミットするか、スタッシュしてください
復旧コマンド
# 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 while the commit remains available locally
git reflog
git branch recovered-branch abc123
制限事項
- このスキルは、タスクが上記で説明した範囲に明確に一致する場合にのみ使用してください。
- 出力を、環境固有の検証、テスト、または専門家によるレビューの代替として扱わないでください。
- 必要な入力、権限、安全上の境界、または成功基準が不足している場合は、停止して確認を求めてください。