mcpField
G
git-advanced-workflows

git-advanced-workflows

github.com/rmyndharis開発1.9k42 回インストール2 週間前に更新
リポジトリ

git-advanced-workflows について

複雑な Git の履歴やブランチ運用に取り組む開発者向けのスキルです。履歴整理、並行開発、バグ調査、操作ミスからの復旧を扱います。

主な機能

  1. 01インタラクティブリベースと履歴整理
  2. 02ブランチ間でのコミット適用
  3. 03不具合導入コミットの二分探索
  4. 04worktree による並行開発
  5. 05reflog を使ったコミット復旧

活用シーン

  1. 01マージ前のフィーチャーブランチ整理
  2. 02複数のリリースブランチへの修正適用
  3. 03不具合を導入したコミットの特定
  4. 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"

ベストプラクティス

  1. 必ず --force-with-lease を使用する:--force より安全で、他の人の作業を上書きするのを防ぎます
  2. ローカルのコミットのみをリベースする:プッシュして共有済みのコミットはリベースしないでください
  3. 説明的なコミットメッセージを書く:未来の自分が今の自分に感謝するでしょう
  4. アトミックなコミットにする:各コミットは単一の論理的な変更にします
  5. 強制プッシュ前にテストする:履歴の書き換えによって問題が発生していないことを確認します
  6. Reflog を意識する:Reflog は 90 日間有効なセーフティネットであることを覚えておきます
  7. リスクの高い操作の前にブランチを作成する:複雑なリベースの前にバックアップブランチを作成します
# 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

コメント