研修者はこのページを読む必要はありません。
このRepositoryは「読ませる」のではなく「GitHubの仕組みで学ばせる」構成です。
| 仕組み | 教えていること |
|---|---|
| Branch Protection | Rule 1・2(mainで直接開発しない / 直接Pushしない)を物理的に強制 |
| Pull Request Template | PRの書き方を、読ませるのではなく枠として与える |
| CODEOWNERS | Reviewerの自動アサイン |
| GitHub Actions | Secret混入・命名規約違反を赤いバツで気づかせる |
| Issue(1人1件) | 進捗の可視化。研修者ごとのチェックリスト |
seed/conflict Branch |
相方を待たずに、1人で確実にConflictを起こせる仕込み |
Branch Protectionを設定する前に、この教材一式を main に入れてください。
cd github-practice
git add .
git commit -m "Add Git/GitHub training materials"
git push -u origin mainIssue Templateが training / question Labelを使います。存在しないと付与されません。
gh label create training --color 0E8A16 --description "Git/GitHub研修の進行表"
gh label create question --color D876E3 --description "研修中の質問" --force.github/CODEOWNERS のオーナーは @Shion1305 @Tivo0921 になっています。
変更する場合は、以下に注意してください。
- Code OwnerにはこのRepositoryへのWrite以上の権限が必要です。 権限のないアカウントやTeamを指定しても、自動アサインは機能しません。
- 現状このRepositoryはTeamではなく 個人Collaborator で権限管理しています。
そのため
@Lumos-Programming/lusyのようなTeam指定は使えません。 Teamを使いたい場合は、先にSettings → Collaborators and teams からTeamに権限を付与してください。 - なお
lusyTeamには研修者本人が含まれます。教材のオーナーに指定すると 「研修者が教材の変更を自分で承認できる」状態になるため、避けてください。
/docs/ @Shion1305 @Tivo0921
Settings → Actions → General → 「Allow all actions and reusable workflows」
Pull Requestを1件作って、Training Check が走ることを確認してください。
状況(2026-08-22 時点)
Organization
Lumos-Programmingは GitHub Free プラン、このRepositoryは Private です。 この組み合わせでは Branch Protection も Rulesets も利用できません。 API から設定を試みると、以下が返ります。{"message": "Upgrade to GitHub Pro or make this repository public to enable this feature.", "status": "403"}有効化するには、次のどちらかが必要です。
方法 影響 A. Repositoryを Public にする 費用なしで即座に有効化できる。ただし members/の内容と全Commit履歴が世界に公開される。個人情報を書かせない運用が前提B. GitHub Team プランへアップグレード Privateのまま有効化できる。Organization単位の課金が発生する 有効化するまでの間の運用
- Rule 1・2(mainで直接開発しない / 直接Pushしない)は 文書上のルール として運用します
- README・
docs/02-rules.md・exercises/01-clone-to-pr.mdには、 「保護されていないので直接Pushしないこと」を明記済みです- 実習1の Step 11.5(直接Pushが拒否されることの確認)は スキップする手順に変更済みです。 有効化した際は、これらの記述を元に戻してください
mainに誤ってPushされた場合に備え、定期的にバックアップを取っておくと安全です
有効化できるようになったら、以下の手順で設定します。
Settings → Branches → Add branch protection rule
| 項目 | 設定 |
|---|---|
| Branch name pattern | main |
| Require a pull request before merging | ✅ |
| └ Require approvals | ✅ 1 |
| └ Dismiss stale pull request approvals when new commits are pushed | ✅(推奨) |
| └ Require review from Code Owners | ✅(CODEOWNERS設定後) |
| Require status checks to pass before merging | ✅ |
| └ Status checks | 研修ルールのチェック を検索して追加 |
| Require branches to be up to date before merging | ✅(Conflict体験が増えるので推奨) |
| Do not allow bypassing the above settings | ✅ |
Status checkは、一度CIが走った後でないと検索候補に出ません。 先にPull Requestを1件作ってCIを走らせてから設定してください。
CLIで設定する場合:
gh api -X PUT repos/Lumos-Programming/github-practice/branches/main/protection \
-H "Accept: application/vnd.github+json" \
--input - <<'JSON'
{
"required_status_checks": {
"strict": true,
"contexts": ["研修ルールのチェック"]
},
"enforce_admins": true,
"required_pull_request_reviews": {
"required_approving_review_count": 1,
"dismiss_stale_reviews": true,
"require_code_owner_reviews": true
},
"restrictions": null
}
JSON
⚠️ Private Repositoryの場合、プランによってBranch Protection / Rulesets が使えません。 設定画面に項目が出ない場合は、Repositoryの可視性かOrganizationのプランを確認してください。 (現在このRepositoryが該当します。上の「⛔ 現在は設定できません」を参照) どうしても使えない場合、Rule 1・2は「文書上のルール」として運用し、 実習1のStep 11.5(直接Pushが拒否されることの確認)はスキップしてください。
./scripts/create-conflict-seed.shseed/conflict が作られ、conflict-training/solo.md の1行だけが main と異なる状態になります。
これにより、研修者は相方を待たずに1人でConflictを再現できます。
確認:
git fetch
git diff main origin/seed/conflictMessage: Hello → Message: Hello from Seed の1行だけ差分があればOKです。
seed/conflictはBranch Protectionの対象に含めないでください。 作り直すときにforce pushが必要になります。
Settings → Collaborators and teams から、Write権限で招待します。
Read権限だとBranchをPushできません。Write権限が必要です。
研修者ひとりにつき1件、Issueを作成します。
- Issues → New issue
- Git/GitHub 研修 進行表 を選択
- 入力する項目:
| 項目 | 入力例 | 備考 |
|---|---|---|
| タイトル | Git/GitHub 研修: 山田太郎 |
<名前> を置き換える |
| 研修者 | @taro-yamada |
GitHubアカウント |
| ファイル名に使う名前 | taro |
members/taro.md になる |
| Conflict実習のペア番号 | 01 |
Part Bを行う場合のみ。ペアの2人に同じ番号を割り当てる |
| 進行表 | そのまま | 編集不要 |
- 右側の Assignees で、その研修者本人をアサインする(重要)
- Create
ペア番号は
conflict-training/pair-01.md〜pair-05.mdに対応しています。 6組以上いる場合は、pair-06.mdなどを同じ形式で追加してください。
gh issue create \
--title "Git/GitHub 研修: 山田太郎" \
--label training \
--assignee taro-yamada \
--body-file - <<'MD'
研修者: @taro-yamada
ファイル名: taro
進行表は .github/ISSUE_TEMPLATE/training.yml の内容を貼り付けてください。
MDCLIだとテンプレートのチェックリストが自動で入りません。 人数が少ないうちはWeb UIから作るほうが確実です。
- Projects → New project → Board
trainingLabelの付いたIssueを追加- カラムを
未着手/実習1-3/実習4-7/完了にする
各Issueのチェックボックスの進捗(12/48 のような表示)がIssue一覧にも出るため、
誰がどこで止まっているかがひと目で分かります。
gh issue list --label training --state open
gh pr list --state open| タイミング | やること |
|---|---|
| 実習1の後 | 各自のPull Requestが揃うのを待つ。CIが落ちている人に声をかける |
| 実習2 | 誰が誰をReviewするか割り当てる(重複や漏れを防ぐ) |
| 実習2の後 | Pull Requestが main にMergeされたことを確認 → 実習3に進んでよいと伝える |
| 実習6 | conflict-training/solo.md を変更するPRが来たら Mergeしない(実習の仕込みが壊れます) |
| 完了後 | Issueの「振り返り」を読み、次回の教材改善に反映する |
# 1. 前回の研修Branchを一掃する
git fetch --prune
git branch -r | grep 'origin/training/' | sed 's|origin/||' | \
xargs -I{} git push origin --delete {}
# 2. members/ を空にする(残しておいても構いません)
git switch -c chore/reset-training
git rm members/*.md
git checkout main -- members/README.md members/_template.md
git commit -m "Reset members for next training"
git push -u origin chore/reset-training
# → Pull Requestを作ってMerge
# 3. solo.md が元に戻っているか確認する
git switch main && git pull
grep -n "Message:" conflict-training/solo.md # → "Message: Hello" であること
# 4. Seed Branchを作り直す(必要なら)
./scripts/create-conflict-seed.sh前回のIssueはCloseされているので、そのまま記録として残しておけます。
教材(docs/ / exercises/ / .github/)自身の変更も、Pull Request経由で行ってください。
管理者が直接Pushしていると、研修者に示しがつきません。
git switch main && git pull
git switch -c docs/improve-conflict-exercise
# 編集
git add . && git commit -m "Improve conflict exercise wording"
git push -u origin docs/improve-conflict-exercise