push について
pushは、現在のブランチを安全にプッシュし、プルリクエストを作成または更新するリポジトリ向けスキルです。検証、同期エラーへの対応、PR本文の確認、結果URLの提示まで扱います。
主な機能
- 01make -C elixir allによる検証
- 02設定済みoriginへのプッシュ
- 03ブランチのプルリクエスト作成・更新
- 04mix pr_body.checkによるPR本文の確認
- 05同期問題とリモートエラーの切り分け
活用シーン
- 01ローカル検証後の変更のプッシュ
- 02ブランチ更新後のプルリクエスト刷新
- 03ブランチの遅れによるプッシュ拒否への対応
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ odysseus0/ symphony --skill pushインストール後、Claude Code で/pushを入力して読み込まれたか確認します。
詳細
プッシュ
前提条件
ghCLI がインストールされ、PATHから利用できること。- このリポジトリで GitHub の操作を行うための
gh auth statusが成功すること。
目標
- 現在のブランチの変更を
originに安全にプッシュします。 - ブランチの PR が存在しない場合は作成し、存在する場合は更新します。
- リモート側で変更が進んでいる場合も、ブランチの履歴を整然と保ちます。
関連スキル
pull:プッシュが拒否された場合、または同期状態に問題がある場合(ファストフォワード不可、マージコンフリクトのリスク、ブランチの古さなど)に使用します。
手順
-
現在のブランチを特定し、リモートの状態を確認します。
-
プッシュ前にローカルで検証を実行します(
make -C elixir all)。 -
必要に応じて、設定済みのリモート URL をそのまま使い、上流追跡を設定してブランチを
originにプッシュします。 -
プッシュができない、または拒否された場合:
- ファストフォワード不可、または同期の問題が原因の場合は、
pullスキルを実行してorigin/mainをマージし、コンフリクトを解決してから検証を再実行します。 - 再度プッシュします。
--force-with-leaseを使うのは、履歴を書き換えた場合に限ります。 - 設定済みリモートでの認証、権限、またはワークフローの制限が原因の場合は、リモートを書き換えたり、回避策としてプロトコルを切り替えたりせず、正確なエラーを報告して停止します。
- ファストフォワード不可、または同期の問題が原因の場合は、
-
ブランチの PR が存在することを確認します。
- PR が存在しない場合は作成します。
- PR が存在し、オープンである場合は更新します。
- ブランチがクローズまたはマージ済みの PR に紐づいている場合は、新しいブランチと PR を作成します。
- 変更の結果が明確に伝わる、適切な PR タイトルを付けます。
- ブランチを更新する際は、現在の PR タイトルが最新の作業範囲に引き続き合っているかを明示的に見直し、合わなくなっている場合は更新します。
-
.github/pull_request_template.mdを使って PR 本文を明示的に作成または更新します。- 変更内容に即した具体的な内容で、すべてのセクションを埋めます。
- すべてのプレースホルダーコメント(``)を置き換えます。
- テンプレートで求められている箇条書きやチェックボックスはそのまま残します。
- 既存の PR を更新する場合は、本文を更新し、最新のコミットだけでなく、ブランチ上の作業全体(追加された作業、取り除かれた作業、変更されたアプローチを含む)が反映されるようにします。
- 以前の作業時の古い説明文を再利用しないでください。
-
mix pr_body.checkで PR 本文を検証し、報告された問題をすべて修正します。 -
gh pr viewで PR の URL を確認して返信します。
コマンド
# Identify branch
branch=$(git branch --show-current)
# Minimal validation gate
make -C elixir all
# Initial push: respect the current origin remote.
git push -u origin HEAD
# If that failed because the remote moved, use the pull skill. After
# pull-skill resolution and re-validation, retry the normal push:
git push -u origin HEAD
# If the configured remote rejects the push for auth, permissions, or workflow
# restrictions, stop and surface the exact error.
# Only if history was rewritten locally:
git push --force-with-lease origin HEAD
# Ensure a PR exists (create only if missing)
pr_state=$(gh pr view --json state -q .state 2>/dev/null || true)
if [ "$pr_state" = "MERGED" ] || [ "$pr_state" = "CLOSED" ]; then
echo "Current branch is tied to a closed PR; create a new branch + PR." >&2
exit 1
fi
# Write a clear, human-friendly title that summarizes the shipped change.
pr_title="<clear PR title written for this change>"
if [ -z "$pr_state" ]; then
gh pr create --title "$pr_title"
else
# Reconsider title on every branch update; edit if scope shifted.
gh pr edit --title "$pr_title"
fi
# Write/edit PR body to match .github/pull_request_template.md before validation.
# Example workflow:
# 1) open the template and draft body content for this PR
# 2) gh pr edit --body-file /tmp/pr_body.md
# 3) for branch updates, re-check that title/body still match current diff
tmp_pr_body=$(mktemp)
gh pr view --json body -q .body > "$tmp_pr_body"
(cd elixir && mix pr_body.check --file "$tmp_pr_body")
rm -f "$tmp_pr_body"
# Show PR URL for the reply
gh pr view --json url -q .url
注意事項
--forceは使用しないでください。最後の手段としてのみ--force-with-leaseを使用します。- 同期の問題と、リモートの認証・権限の問題を区別してください。
- ファストフォワード不可やブランチの古さの問題には、
pullスキルを使用します。 - リモートの認証、権限、ワークフローの制限は、リモートやプロトコルを変更せず、そのまま報告します。
- ファストフォワード不可やブランチの古さの問題には、
コメント
Markdown 対応