git-merge-to-main について
git-merge-to-mainは、現在のGitブランチをmainへマージするためのスキルです。リポジトリの状態を確認して実行前に承認を求め、保護対象ブランチを残し、競合解決やプッシュは自動で行いません。
主な機能
- 01リポジトリと作業ツリーの状態確認
- 02計画を提示して承認を待機
- 03保護対象のソースブランチを保持
- 04競合時に停止し自動解決しない
- 05git branch -dで対象ブランチを削除
- 06自動プッシュやプルを行わない
活用シーン
- 01完成した機能ブランチをmainへマージ
- 02長期運用ブランチをマージ後も保持
- 03競合を確認して手動で解決
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ chann/ skills --skill git-merge-to-mainインストール後、Claude Code で/git-merge-to-mainを入力して読み込まれたか確認します。
同梱ファイルagents/openai.yamlevals/evals.json
詳細
Git Merge to Main
概要
現在のブランチをmainにマージし、ソースブランチが完全にマージされたため、保護されていない限りローカルから削除します。安全性を重視した設計です。--forceは決して使わず、-Dではなく-dのみを使い、競合を自動解決せず、自動プッシュもしません。
開始時に次のように伝えます:「git-merge-to-main スキルを使って<source-branch>をmainにマージし、保護されていない限り削除します。」
保護されたソースブランチ
次の名前のソースブランチは保護されており、マージ後もローカルに残す必要があります。
main、master、dev、develop、development、stg、stage、staging、root
srcが保護されたソースブランチの場合も、マージ計画を提示して確認後に進めますが、ローカルからの削除手順は省略します。保護されたブランチに対してgit branch -d "$src"を実行してはならず、リモートブランチの削除も提案しないでください。
前提条件
何かに手を加える前に、次のチェックを実行します。違反があれば安全側に停止し、報告して中断します。
| # | チェック | コマンド | 失敗時 |
|---|---|---|---|
| 1 | Gitリポジトリ内にいる | git rev-parse --is-inside-work-tree | 中断:「Gitリポジトリではありません。」 |
| 2 | HEADがブランチに紐づいている(detachedではない) | git symbolic-ref -q HEAD | 中断:「HEADがdetachedです。先にブランチをチェックアウトしてください。」 |
| 3 | 現在のブランチがmainではない | [ "$(git branch --show-current)" != "main" ] | 中断:「すでにmainにいます。マージするものはありません。」 |
| 4 | 作業ツリーがクリーン | [ -z "$(git status --porcelain)" ] | 中断:「作業ツリーに未コミットの変更があります。先にコミットするかstashしてください。」 |
| 5 | mainブランチがローカルに存在する | git rev-parse --verify main | 中断:「mainブランチがローカルに見つかりません。作成するか、git-merge-to-devを使ってください。」 |
ワークフロー
ステップ1:状態を取得
src=$(git branch --show-current)
echo "Source branch: $src"
git log --oneline "main..$src" | head -20 # what will be merged
main..$srcが空の場合 → ユーザーに「$srcにはmainより新しいコミットがありません。マージするものはありません」と伝えて中断します。
計画を提示する前に、ソースブランチが保護されているかどうかを判定します。
protected=(main master dev develop development stg stage staging root)
delete_src=1
case " ${protected[*]} " in
*" $src "*) delete_src=0 ;;
esac
ステップ2:計画を提示して確認
Plan:
1. git checkout main
2. git merge $src
3. git branch -d $src (safe delete; refuses if not fully merged)
4. (you stay on main; push manually when ready)
N commits will be merged. Proceed? (y/N)
delete_src=0の場合、ステップ3を次の内容に置き換えます。
3. skip the local delete for protected source branch $src
明示的な確認を待ちます。デフォルトはいいえです。
ステップ3:任意 — fetchして分岐を確認(情報提供のみ)
git fetch origin main 2>/dev/null || true
behind=$(git rev-list --count HEAD..origin/main 2>/dev/null || echo 0)
if [ "$behind" -gt 0 ]; then
echo "Heads up: local main is $behind commits behind origin/main."
echo "After merge, you'll want to: git pull --rebase (or reconcile manually) before pushing."
fi
自動でpullしないでください。同期するタイミングはユーザーが決めます。
ステップ4:mainに切り替えてマージ
git checkout main
git merge "$src"
通常のgit mergeを使います。可能であればfast-forwardし、そうでなければマージコミットを作成します。ユーザーから依頼がない限り、--no-ffは使わないでください。--ff-onlyも使わないでください(履歴が分岐している場合にエラーになるため、マージ処理に任せてください)。
マージで競合が発生した場合:
- **中断します。**自動解決を試みないでください。
- 競合しているパスを報告します。
- ユーザーに競合を解決し、
git commitでマージを完了するか、git merge --abortでロールバックするよう伝えます。 - ソースブランチを削除しないでください。
ステップ5:ソースブランチを削除または保持
マージが成功し、作業ツリーがクリーンな状態になった後:
if [ "$delete_src" -eq 0 ]; then
echo "Source branch $src is a protected source branch; skip the local delete."
else
git branch -d "$src"
fi
保護されていないソースブランチには、小文字の-dを使います。ブランチが完全にマージされていない場合、Gitは削除を拒否します。これが安全策です。ここで-D(強制)を使うことは決してしないでください。-dで削除が拒否された場合:
- 最も可能性の高い原因は、マージに
$srcのコミットがすべて含まれていないことです(たとえば、ユーザーが--ff-onlyを選んだため何も起きなかった場合や、フックがマージを書き換えた場合)。報告して中断してください。-Dに切り替えないでください。
ステップ6:概要
git log --oneline -5
git branch --show-current
if [ "$delete_src" -eq 0 ]; then
echo "Merged $src into main and kept protected source branch $src locally. Push when ready: git push"
else
echo "Merged $src into main and deleted $src locally. Push when ready: git push"
fi
リモート追跡ブランチorigin/$srcが存在し、srcが保護されていない場合は、その旨を伝えます。ただし、自動で削除しないでください。
Note: origin/$src still exists. Delete the remote branch with:
git push origin --delete $src
保護されたソースブランチの場合、リモートブランチの削除を提案しないでください。
実行例
User: 이 브랜치를 main에 머지해줘
Step 1:
src = feature/oauth-login
git log --oneline main..feature/oauth-login →
a1b2c3d feat(auth): add OAuth login flow
e4f5g6h test(auth): add OAuth login tests
Step 2 (plan):
→ checkout main, merge feature/oauth-login, delete feature/oauth-login
User confirms.
Step 3 (divergence): origin/main is 0 commits ahead. ✓
Step 4: git checkout main && git merge feature/oauth-login → fast-forward.
Step 5: git branch -d feature/oauth-login → "Deleted branch feature/oauth-login (was a1b2c3d)."
Step 6: Show git log -5; remind user to push.
保護されたソースブランチの例:
User: dev를 main에 머지해줘
Source: dev (protected)
Plan:
1. git checkout main
2. git merge dev
3. skip the local delete for protected source branch dev
User confirms.
→ checkout main, merge succeeds, keep dev locally.
→ Remind user to push main when ready.
危険信号
絶対にしないでください:
git branch -D(強制削除)—-dを使い、安全チェックを尊重してください- マージコンフリクトを自動解決する — 停止して、ユーザーに解決を任せてください
- マージ後に自動でプッシュする — ユーザーが準備できたときにプッシュします
- ユーザーの明示的な同意なしに
git pull/git pull --rebaseを実行する - ユーザーの明示的な同意なしにリモートブランチを削除する(
git push origin --delete) - 保護対象のソースブランチを削除する:
main、master、dev、develop、development、stg、stage、staging、root - どこでも
--forceを使う - 作業ツリーに変更がある状態で操作する
必ず実行してください:
- マージ前に計画を示し、確認を待つ
- コンフリクトを報告し、自動修正せずに停止する
- 保護対象ではないソースブランチの削除には、安全な
git branch -dを使う - 保護対象のソースブランチを特定し、ローカルでの削除を見送る
- マージ後に
git status --shortを実行して、ツリーを確認する
よくある間違い
-d で拒否されたときに強制削除する
- 問題: 「ブランチが完全にはマージされていません」→
-Dを使おうとする - 対処法: マージが完了していない理由を調べてください。自動的に
-Dに切り替えることは絶対にしないでください
リリースマージ後に長期運用ブランチを削除する
- 問題:
dev/staging/masterをmainにマージした後、フィーチャーブランチのように削除する - 対処法: 保護対象のソースブランチはマージ後も保持するものとして扱い、ローカルでの削除を見送ってください
マージ後に自動でプッシュする
- 問題: ユーザーを驚かせます。
mainが遅れていた場合、共同作業者のワークフローに支障をきたす可能性もあります - 対処法: マージ後は停止し、ユーザーに手動でプッシュするよう伝えてください
許可なく main をプルする
- 問題:
git pullにより、予期しないコミットがリベースまたはマージされる可能性があります - 対処法: 情報取得のみを目的として
git fetch origin mainを実行してください。調整はユーザーに任せてください
統合
併用対象:
git-commit/git-commit-push— 先に作業ツリーの変更をコミットし、その後マージしますgit-branch-cleanup— すでにmainにマージされている他のブランチを一括削除しますgit-merge-to-dev— 同じ手順で、ターゲットはdev(またはdevelop)です
呼び出し元: ユーザーによる手動実行のみです。別のスキルのワークフロー中に自動実行してはいけません。