mcpField
G
git-advanced-workflows

git-advanced-workflows

github.com/ovachiever開発5647 回インストール49 週間前に更新
リポジトリ

git-advanced-workflows について

履歴編集、ブランチ管理、バグ調査、作業の復旧が必要な開発者向けのGitワークフロースキルです。rebase、cherry-pick、bisect、worktree、reflogを使う手順とコマンド例をまとめています。

主な機能

  1. 01対話型rebaseと履歴整理
  2. 02コミットまたは特定ファイルのcherry-pick
  3. 03bisectによるバグ導入箇所の特定
  4. 04worktreeでの複数ブランチ作業
  5. 05reflogを使ったコミット復旧

活用シーン

  1. 01PR前の機能ブランチ整理
  2. 02複数のリリースブランチへの修正適用
  3. 03バグを導入したコミットの特定
  4. 04誤ったreset後の作業復旧

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/ovachiever/droid-tings --skill git-advanced-workflows

インストール後、Claude Code で/git-advanced-workflowsを入力して読み込まれたか確認します。

詳細

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

リソース

  • references/git-rebase-guide.md:インタラクティブリベースの詳細解説
  • references/git-conflict-resolution.md:高度な競合解決の手法
  • references/git-history-rewriting.md:Git 履歴を安全に書き換える方法
  • assets/git-workflow-checklist.md:PR 前の整理チェックリスト
  • assets/git-aliases.md:高度なワークフローに便利な Git エイリアス
  • scripts/git-clean-branches.sh:マージ済みブランチや古いブランチを整理する

コメント