safe-git-ops について
safe-git-opsは、一般的なGit操作を扱うスキルです。リポジトリ状態、権限、ネットワークの問題を切り分け、事前確認やリスク別の手順を適用し、破壊的操作やワークツリーには慎重に対応します。
主な機能
- 01操作前のリポジトリ確認
- 02リスク別のコミット・プッシュ手順
- 03競合とアクセス障害の切り分け
- 04ワークツリーを考慮した操作ガイド
- 05破壊的コマンドの事前確認
活用シーン
- 01失敗したGit操作の診断
- 02変更範囲に応じたコミットと検証
- 03ワークツリーでのGit操作
- 04プッシュ障害がネットワーク由来かの判定
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ a-green-hand-jack/ ml-research-skills --skill safe-git-opsインストール後、Claude Code で/safe-git-opsを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
evals/evals.jsonreferences/commit-paths.mdfailure-modes.mdworktrees.mdscripts/project-push詳細
Safe Git 操作
サンドボックスの失敗、リポジトリの状態に関する問題、実際のコンテンツの競合を混同せずに、ユーザーが一般的な Git 操作を実行できるよう支援します。
スキルのディレクトリ構成
<installed-skill-dir>/
├── SKILL.md
├── scripts/
│ └── project-push
└── references/
├── failure-modes.md
├── commit-paths.md
└── worktrees.md
段階的な読み込み
- 必ず
references/failure-modes.mdを読みます - ユーザーからコミット、プッシュ、クローズアウトの高速化、検証や再インストールの範囲の選択を求められた場合は、
references/commit-paths.mdを読みます - リポジトリで
git worktreeを使用している場合、.gitが別のディレクトリを指している場合、またはユーザーが複数のワークツリーに言及した場合は、references/worktrees.mdを読みます
基本動作
- 事前確認と状態を変更する Git コマンドを分けます
- サンドボックスや権限に関する失敗と、マージコンフリクトを区別します
- ワークツリーは可視の作業ディレクトリ外にある共有 Git メタデータを書き換える場合があるため、特別なケースとして扱います
reset --hard、checkout --、ブランチの削除、スタッシュの破棄などの破壊的な操作は、実行前に確認します- 対話を必要としない Git コマンドを優先します
- リスクに応じてコミット手順を使い分け、リスクの低いテキストやドキュメントの変更に、完全な検証、完全なスモークテスト、スキルの完全な再インストールのコストをかけないようにします
- 通常のネットワークプッシュでは、
cd repo && git push、bash -lc "git push"、相対形式と絶対形式のgit -Cの切り替えなど、場当たり的なコマンド形式より、安定したラッパーproject-push <repo> <remote> <branch>を優先します。 - メインエージェントの判断時間を短縮でき、読み取り専用で実行できる場合は、複雑なクローズアウトに
sidecar-task-runnerの事前コミット分類を使用します - サンドボックスによって書き込み操作がブロックされた場合は、その旨を明確に説明し、競合について推測するのではなく、権限のエスカレーションを依頼します
- ネットワーク Git 操作が失敗した場合は、ユーザーに認証情報の変更を求める前に、ネットワークやサンドボックスへのアクセスの問題と、認証、Git リモート、リポジトリの問題を区別します
- 早期に対応を開始します。ユーザーが曖昧な表現で Git の失敗を報告した場合は、状態を変更するコマンドを実行する前に、このスキルで原因を診断する必要があると判断します
起動の目安
次のいずれかに該当する場合は、すぐにこのスキルを使用します。
- ユーザーが
git cherry-pick、merge、rebase、commit、stash、switch、checkout、branch、worktreeの実行を求めた - ユーザーが「Git が失敗した」「マージで問題が起きた」「cherry-pick がブロックされた」「競合がある」「このリポジトリがなぜこの状態になったのか」と述べた
- エージェントが、次の文字列を含むエラーメッセージを確認した:
CONFLICTindex.lockoperation not permittedpermission deniedCould not resolve hostCould not read from remote repositoryConnection timed outNetwork is unreachable.git/worktrees/ORIG_HEADCHERRY_PICK_HEADbranch is already checked out
タスクが明らかに Git を中心とする場合は、書き込み操作が失敗するまでこのスキルの読み込みを待たないでください。
避けるべき誤診
Git によって実際に確認されていない限り、次のようなことは決して言わないでください。
- 実際には権限の問題なのに、「これはマージコンフリクトです」と言う
- 共通の Git ディレクトリが関係している可能性があるのに、「これは現在のワークツリー内だけの問題です」と言う
- 実際の問題が作業ツリーの未コミット変更、detached HEAD、または進行中の操作であるのに、「Git が壊れています」と言う
- 最初の失敗がサンドボックスによるネットワークまたは DNS の失敗なのに、「トークン、SSH キー、リモートに問題があります」と言う
- 競合、リポジトリの状態、サンドボックスのどれによるブロックなのか説明せずに、「そのまま再実行してください」と言う
ステップ 1 — リポジトリの状態を確認する
重要な Git 操作を行う前に、リポジトリの構成を確認します。
git rev-parse --show-toplevel
git rev-parse --git-dir
git branch --show-current
git status --short
ユーザーがワークツリーに言及した場合、または .git がディレクトリではなくファイルの場合は、次も確認します。
git worktree list
git rev-parse --git-common-dir
次の内容をまとめます。
- リポジトリのルート
- 現在のブランチ
- 作業ツリーに未コミットの変更があるか
- これがワークツリーかどうか
- 共有 Git メタデータが現在のディレクトリ外にあるか
ステップ 2 — 要求された操作を分類する
要求を次のいずれかのカテゴリとして扱います。
inspect:ステータス、ログ、差分、ブランチ一覧、リモート、ワークツリーの構成network_inspect:fetch、pull、push のドライラン、ls-remote、サブモジュールの更新、または Git リモートに接続する Git 操作safe_write:add、commit、cherry-pick、merge、rebase、stash、ブランチの作成、ワークツリーの作成destructive_write:reset、ローカルの変更を上書きする checkout、clean、ブランチの削除、stash drop、強制 push
inspect の場合は、サンドボックスのルールで許可されていれば、コマンドを直接実行します。
network_inspect の場合は、ネットワーク権限が付与されない限り、サンドボックス化されたランタイムでは DNS や外部接続がブロックされることを想定してください。
safe_write の場合は、まず事前確認を行います。commit/push の完了処理では、references/commit-paths.md を使って変更を Fast Path、Skill Path、Code Path、Risk Path のいずれかに分類し、その経路に合った最小限の検証を実行します。
destructive_write の場合は、実行前にユーザーの明示的な確認を求めます。
ステップ 3 — 状態を変更する Git コマンドを実行する前に事前確認する
safe_write または destructive_write の前に、不注意な失敗処理を避けるために十分な状況を確認します。
git status --short
git branch --show-current
git rev-parse --short HEAD
通常の commit/push の完了処理では、Risk Path に該当する場合を除き、全体的な状況確認は避けてください。Fast Path の完了処理では、commit 前に git status --short、git diff --check、対象を明示した git add <files>、および git diff --cached --stat のみを使用できます。
cherry-pick、merge、または rebase の場合は、対象の commit またはブランチも事前に確認します。
git log --oneline --decorate -n 5
git show --stat --summary <target>
ワークツリーの場合は、共有メタデータの場所を確認します。
git rev-parse --git-common-dir
コマンドによってサンドボックスの書き込み可能なルート外にある共有 Git メタデータへ書き込まれる可能性が高い場合は、実行前にそのことをユーザーに伝え、権限の追加を求める準備をしてください。
ユーザーが cherry-pick、merge、commit など、ワークツリーに限定した書き込み操作を具体的に依頼した場合は、実行前に、ワークツリーのパスだけでなく共通の git dir への書き込みが必要になる可能性があることを明示してください。
ステップ 4 — 実行し、失敗を正しく解釈する
Git の書き込み操作が失敗した場合は、ユーザーに状況を伝える前に、失敗の種類を分類します。
references/failure-modes.md のガイダンスを使用してください。大まかなルールは次のとおりです。
- Git が
CONFLICT、競合マーカーを報告した場合、またはファイルの解決を求めた場合は、コードの競合です。 - Git が
operation not permitted、permission denied、ロックファイルの作成失敗、または refs やワークツリーのメタデータを更新できないことを報告した場合は、サンドボックスまたは権限の問題です。 fetch、pull、push、ls-remote、またはサブモジュール操作中に Git が DNS エラー、API/ホストへの接続失敗、タイムアウト、またはネットワーク到達不能を報告した場合は、ネットワーク権限を付与して再実行するまで、ネットワーク/サンドボックスへのアクセスの問題です。- Git が dirty 状態、未追跡ファイルの上書き、detached HEAD の不一致、または commit の欠落を報告した場合は、リポジトリの状態の問題です。
Git が実際に競合を報告していない限り、ユーザーに「競合があります」と伝えないでください。
DNS/ネットワーク/サンドボックスの制限により Git がホストに到達していない場合は、「認証に失敗しました」「SSH キーが間違っています」「リモートリポジトリがありません」とユーザーに伝えないでください。
ステップ 5 — サンドボックスの制限が本当の原因なら、適切にエスカレーションする
重要な書き込みコマンドがサンドボックスの制限によって失敗した場合:
- 失敗はコードの競合ではなく、環境によるものだと伝えます
- ブロックされた操作を明示します
- 分かっている場合は、次のような書き込み先として考えられる場所を伝えます:
.git/index.lock.git/worktrees/...- 共通 git ディレクトリ内の共有 refs
- 権限の引き上げを依頼し、同じコマンドを再実行します
次のような表現を使います:
この
git cherry-pickの失敗は、マージ競合ではなく、サンドボックスによる書き込み制限のようです。Git は共有 worktree メタデータを更新する必要があるため、権限を引き上げて再実行する必要があります。
DNS、API、またはホストへの接続がブロックされ、重要なネットワーク Git コマンドが失敗した場合:
- 最初の失敗はネットワークまたはサンドボックスへのアクセスが原因であり、Git の認証やリモート設定の問題だと判明したわけではないと伝えます
git fetch、git push、git ls-remoteなど、コマンドを明示します- ネットワークの許可を依頼し、同じコマンドを再実行します
- ネットワークを有効にして再実行した後に限り、認証情報、権限、リポジトリの不在、ブランチ、またはサーバー側のエラーとして分類します
次のような表現を使います:
この
git ls-remoteの失敗では GitHub まで到達していません。リポジトリがない、または SSH キーが不正という問題ではなく、サンドボックスによるネットワークアクセスのようです。認証情報を診断する前に、ネットワークの許可を得て再実行する必要があります。
コミット後の通常の push には、次の安定したラッパー形式を使います:
project-push <repo> <remote> <branch>
事前確認で見つかったブランチを使います。ラッパーが利用できない場合を除き、同じ push を cd <repo> && git push、git -C <repo> push、またはシェルでラップした形式に書き換えないでください。
ステップ 6 — worktree 固有のルール
リポジトリで worktree を使用している場合:
commit、cherry-pick、merge、rebaseなどのコマンドは、現在の worktree ディレクトリの外部に書き込む可能性があると想定します- 早い段階で
git worktree listとgit rev-parse --git-common-dirを確認します - Git の書き込み先を確認するまでは、失敗が「この worktree 内だけ」のものだと断定しないでください
- 別の worktree が同じブランチを使用している可能性があるため、ブランチの削除やリセットには特に注意します
詳しい取り扱いルールについては、references/worktrees.md を読んでください。
ステップ 7 — 結果を正確に報告する
完了したら、次のいずれかの結果を明確に報告します:
- 成功
- 手動での解決が必要な競合
- サンドボックスまたは権限の制限
- ネットワークまたはサンドボックスの制限
- ユーザーの選択が必要なリポジトリの状態の問題
どの場合も、漠然とした Git の出力ではなく、次にユーザーが行うべき操作を伝えます。
よい例:
git cherry-pick <commit>はマージ解決に到達しませんでした。Git は共通 git ディレクトリ内の共有 worktree メタデータへの書き込みをブロックされたため、サンドボックスの問題です。次の手順は、権限を引き上げて同じコマンドを再実行することです。
悪い例:
cherry-pick に失敗しました。おそらく競合です
推奨する出力形式
ユーザーが「何が起きたの?」または「なぜ失敗したの?」と尋ねた場合は、次の構成で報告します:
Operation: <git command>
Classification: success | content conflict | sandbox restriction | network/sandbox restriction | repository state problem
Evidence: <the key git message or state observation>
Why it happened: <short explanation>
Next step: <single concrete next action>
分類の行は明確にしてください。ずさんな Git の診断を防ぐうえで、これが最も重要です。
このスキルで適切に扱うべきコマンド
git status、log、diff、show、branch、remotegit fetch、pull、push、ls-remotegit add、commit、stashgit cherry-pickgit mergegit rebasegit switch、checkout、checkout -bgit worktree list、git worktree add
特に注意が必要なコマンド
git reset --hardgit checkout -- <path>git clean -fdgit branch -Dgit stash dropまたはcleargit push --force
ユーザーの明示的な承認なしに、これらを実行しないでください。