| name | push |
| description | 現在のブランチの変更を origin に push し、対応する pull request を作成 または更新する。push、更新の公開、pull request の作成を依頼されたときに使用する。 |
Push
前提条件
gh CLI がインストールされ PATH で利用可能。
- このリポジトリでの GitHub 操作のために
gh auth status が成功する。
ゴール
- 現在のブランチの変更を
origin に安全に push する。
- ブランチ用の PR がない場合は作成、ある場合は既存の PR を更新する。
- リモートが進んでいるとき、ブランチの履歴をクリーンに保つ。
関連スキル
pull: push が拒否されたり、同期がクリーンでない(non-fast-forward、マージコンフリクトのリスク、古いブランチ)ときに使用する。
手順
-
現在のブランチを特定し、リモートの状態を確認する。
-
push 前にローカル検証(make -C elixir all)を実行する。
-
必要に応じて upstream tracking を付けてブランチを origin に push する。設定済みのリモート URL をそのまま使う。
-
push がクリーンでない・拒否された場合:
- 失敗が non-fast-forward や同期問題なら、
pull スキルを実行して origin/main をマージし、コンフリクトを解決し、検証を再実行する。
- 再度 push する。履歴を書き換えた場合のみ
--force-with-lease を使う。
- 設定済みリモートの認証・権限・ワークフロー制限による失敗の場合は、リモートを書き換えたりプロトコルを切り替えるワークアラウンドではなく、停止して正確なエラーをそのまま表面化する。
-
ブランチ用の PR が存在することを確認する:
- PR がなければ作成する。
- PR が存在し open ならそれを更新する。
- ブランチがクローズ/マージ済みの PR に紐づいている場合、新しいブランチ + PR を作成する。
- 変更の結果を明確に記述する適切な PR タイトルを書く。
- ブランチ更新の場合、現在の PR タイトルが最新のスコープに合っているかを明示的に再考する。合わなくなっていれば更新する。
-
PR 本文を .github/pull_request_template.md に従って明示的に書く/更新する:
- すべてのセクションをこの変更に合わせた具体的な内容で埋める。
- すべてのプレースホルダコメント(
<!-- ... -->)を置き換える。
- テンプレートが期待する箇所では bullets/checkboxes を維持する。
- PR が既に存在する場合、最新コミットだけでなくブランチ上のすべての意図された作業(追加・削除・アプローチ変更を含む)を反映するように本文をリフレッシュする。
- 以前のイテレーションの古い説明文を再利用しない。
-
mix pr_body.check で PR 本文を検証し、報告されたすべての問題を修正する。
-
gh pr view の PR URL を返信する。
コマンド
branch=$(git branch --show-current)
make -C elixir all
git push -u origin HEAD
git push -u origin HEAD
git push --force-with-lease origin HEAD
pr_state=$(gh pr view --json state -q .state 2>/dev/null || true)
if [ "$pr_state" = "MERGED" ] || [ "$pr_state" = "CLOSED" ]; then
echo "現在のブランチはクローズ済みの PR に紐づいています。新しいブランチ + PR を作成してください。" >&2
exit 1
fi
pr_title="<この変更のための明確な PR タイトル>"
if [ -z "$pr_state" ]; then
gh pr create --title "$pr_title"
else
gh pr edit --title "$pr_title"
fi
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"
gh pr view --json url -q .url
ノート
--force は使わない。--force-with-lease も最後の手段としてのみ使う。
- 同期問題とリモート認証/権限問題を区別する:
- non-fast-forward や古いブランチの問題には
pull スキルを使う。
- 認証・権限・ワークフロー制限はリモートやプロトコルを変更するのではなく、そのまま表面化する。