mcpField
G
git-merge-to-main

git-merge-to-main

github.com/chann開発048 回インストール4 週間前に更新
リポジトリ

git-merge-to-main について

git-merge-to-mainは、現在のGitブランチをmainへマージするためのスキルです。リポジトリの状態を確認して実行前に承認を求め、保護対象ブランチを残し、競合解決やプッシュは自動で行いません。

主な機能

  1. 01リポジトリと作業ツリーの状態確認
  2. 02計画を提示して承認を待機
  3. 03保護対象のソースブランチを保持
  4. 04競合時に停止し自動解決しない
  5. 05git branch -dで対象ブランチを削除
  6. 06自動プッシュやプルを行わない

活用シーン

  1. 01完成した機能ブランチをmainへマージ
  2. 02長期運用ブランチをマージ後も保持
  3. 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"を実行してはならず、リモートブランチの削除も提案しないでください。

前提条件

何かに手を加える前に、次のチェックを実行します。違反があれば安全側に停止し、報告して中断します。

#チェックコマンド失敗時
1Gitリポジトリ内にいるgit rev-parse --is-inside-work-tree中断:「Gitリポジトリではありません。」
2HEADがブランチに紐づいている(detachedではない)git symbolic-ref -q HEAD中断:「HEADがdetachedです。先にブランチをチェックアウトしてください。」
3現在のブランチがmainではない[ "$(git branch --show-current)" != "main" ]中断:「すでにmainにいます。マージするものはありません。」
4作業ツリーがクリーン[ -z "$(git status --porcelain)" ]中断:「作業ツリーに未コミットの変更があります。先にコミットするかstashしてください。」
5mainブランチがローカルに存在する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も使わないでください(履歴が分岐している場合にエラーになるため、マージ処理に任せてください)。

マージで競合が発生した場合:

  1. **中断します。**自動解決を試みないでください。
  2. 競合しているパスを報告します。
  3. ユーザーに競合を解決し、git commitでマージを完了するか、git merge --abortでロールバックするよう伝えます。
  4. ソースブランチを削除しないでください。
ステップ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)です

呼び出し元: ユーザーによる手動実行のみです。別のスキルのワークフロー中に自動実行してはいけません。

コメント