| name | git-advanced-workflows |
| description | rebase、cherry-pick、bisect、worktree、reflogを含む高度なGitワークフローをマスターし、クリーンな履歴を維持し、あらゆる状況から回復。複雑なGit履歴の管理、フィーチャーブランチでの協働、リポジトリ問題のトラブルシューティング時に使用。 |
English | 日本語
Git高度なワークフロー
高度なGitテクニックをマスターして、クリーンな履歴を維持し、効果的に協力し、自信を持ってあらゆる状況から回復します。
このスキルを使用するタイミング
- マージ前のコミット履歴のクリーンアップ
- ブランチ間での特定コミットの適用
- バグを導入したコミットの発見
- 複数の機能を同時に作業
- Gitの間違いや失われたコミットからの回復
- 複雑なブランチワークフローの管理
- レビュー用のクリーンなPRの準備
- 分岐したブランチの同期
コア概念
1. インタラクティブRebase
インタラクティブrebaseは、Git履歴編集のスイスアーミーナイフです。
一般的な操作:
pick:コミットをそのまま保持
reword:コミットメッセージを変更
edit:コミット内容を修正
squash:前のコミットと結合
fixup:squashと同様だがメッセージを破棄
drop:コミットを完全に削除
基本的な使用法:
git rebase -i HEAD~5
git rebase -i $(git merge-base HEAD main)
git rebase -i abc123
2. Cherry-Pick
ブランチ全体をマージせずに、一つのブランチから別のブランチへ特定のコミットを適用。
git cherry-pick abc123
git cherry-pick abc123..def456
git cherry-pick -n abc123
git cherry-pick -e abc123
3. Git Bisect
コミット履歴を二分探索して、バグを導入したコミットを見つける。
git bisect start
git bisect bad
git bisect good v1.0.0
git bisect good
git bisect reset
自動Bisect:
git bisect start HEAD v1.0.0
git bisect run ./test.sh
4. Worktree
スタッシュやブランチ切り替えなしで、複数のブランチを同時に作業。
git worktree list
git worktree add ../project-feature feature/new-feature
git worktree add -b bugfix/urgent ../project-hotfix main
git worktree remove ../project-feature
git worktree prune
5. Reflog
あなたのセーフティネット - 削除されたコミットも含め、すべての参照移動を追跡。
git reflog
git reflog show feature/branch
git reflog
git checkout abc123
git branch recovered-branch
git reflog
git branch deleted-branch abc123
実践的ワークフロー
ワークフロー1:PR前のフィーチャーブランチクリーンアップ
git checkout feature/user-auth
git rebase -i main
git push --force-with-lease origin feature/user-auth
ワークフロー2:複数リリースへのホットフィックス適用
git checkout main
git commit -m \"fix: critical security patch\"
git checkout release/2.0
git cherry-pick abc123
git checkout release/1.9
git cherry-pick abc123
git cherry-pick --continue
git cherry-pick --abort
ワークフロー3:バグ導入の発見
git bisect start
git bisect bad HEAD
git bisect good v2.1.0
npm test
git bisect bad
git bisect good
git bisect start HEAD v2.1.0
git bisect run npm test
ワークフロー4:マルチブランチ開発
cd ~/projects/myapp
git worktree add ../myapp-hotfix hotfix/critical-bug
cd ../myapp-hotfix
git commit -m \"fix: resolve critical bug\"
git push origin hotfix/critical-bug
cd ~/projects/myapp
git fetch origin
git cherry-pick hotfix/critical-bug
git worktree remove ../myapp-hotfix
ワークフロー5:間違いからの回復
git reset --hard HEAD~5
git reflog
git reset --hard def456
git branch recovery def456
高度なテクニック
RebaseとMerge戦略
Rebaseを使用するとき:
- プッシュ前のローカルコミットのクリーンアップ
- フィーチャーブランチをmainと最新状態に保つ
- レビューしやすい直線的な履歴の作成
Mergeを使用するとき:
- 完成した機能をmainに統合
- 協力の正確な履歴を保持
- 他者が使用している公開ブランチ
git checkout feature/my-feature
git fetch origin
git rebase origin/main
git status
git add .
git rebase --continue
git merge origin/main
Autosquashワークフロー
rebase中にfixupコミットを自動的にsquash。
git commit -m \"feat: add user authentication\"
git commit --fixup HEAD
git commit --fixup abc123
git rebase -i --autosquash main
コミット分割
一つのコミットを複数の論理的なコミットに分割。
git rebase -i HEAD~3
git reset HEAD^
git add file1.py
git commit -m \"feat: add validation\"
git add file2.py
git commit -m \"feat: add error handling\"
git rebase --continue
部分的Cherry-Pick
コミットから特定のファイルのみをcherry-pick。
git show --name-only abc123
git checkout abc123 -- path/to/file1.py path/to/file2.py
git commit -m \"cherry-pick: apply specific changes from abc123\"
ベストプラクティス
- 常に--force-with-leaseを使用:--forceより安全、他者の作業を上書きしない
- ローカルコミットのみRebase:プッシュ・共有済みのコミットをrebaseしない
- 説明的なコミットメッセージ:未来の自分が現在の自分に感謝
- アトミックなコミット:各コミットは単一の論理的変更であるべき
- Force Push前にテスト:履歴書き換えが何も壊していないことを確認
- Reflogを意識:reflogは90日間のセーフティネットであることを覚えておく
- 危険な操作前にブランチ:複雑なrebase前にバックアップブランチを作成
git push --force-with-lease origin feature/branch
git branch backup-branch
git rebase -i main
git reset --hard backup-branch
よくある落とし穴
- 公開ブランチのRebase:協力者に履歴コンフリクトを引き起こす
- Leaseなしのforce push:チームメイトの作業を上書きする可能性
- Rebaseで作業を失う:慎重にコンフリクトを解決、rebase後にテスト
- Worktreeクリーンアップを忘れる:孤立したworktreeがディスクを消費
- 実験前のバックアップを忘れる:常にセーフティブランチを作成
- Dirty作業ディレクトリでBisect:bisect前にコミットまたはstash
回復コマンド
git rebase --abort
git merge --abort
git cherry-pick --abort
git bisect reset
git restore --source=abc123 path/to/file
git reset --soft HEAD^
git reset --hard HEAD^
git reflog
git branch recovered-branch abc123
リソース
- references/git-rebase-guide.md:インタラクティブrebaseの詳細
- 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:マージ済みと古いブランチのクリーンアップ