【超入門】GitHubリポジトリの作り方

この記事ではGitHubの新しいリポジトリの作り方を初心者に向けて軽く解説します。

## 前提

- Gitの基礎知識
- [Mac Git 初期設定](https://qiita.com/ucan-lab/items/aadbedcacbc2ac86a2b3)
- [Mac GitHub SSH接続設定](https://qiita.com/ucan-lab/items/e02f2d3a35f266631f24#_reference-7cbea668d512073f0df4)

GitHubを使い始める前に上記の知識・設定を行っておくと良いです。

## Gitシリーズ記事まとめ

https://qiita.com/ucan-lab/items/33c63a402f533aa92f3e

## Git とは

https://git-scm.com

小規模から大規模開発まで、あらゆるプロジェクトで利用される無料のオープンソース分散バージョン管理システムです。

## GitHub とは

https://github.com

Git(ソースコード)をホスティングしてくれるサービスです。
複数人の開発者と協働してコードをレビューしたり、課題管理しながら開発できます。

### GitHubの主な機能

![ScreenShot 2021-02-13 14.50.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52879/bbd4fb79-8e2e-f9b1-1bd9-e218f45eb916.png)

いくつかのタブメニューなどご紹介していきます。

#### プルリクエスト(Pull Request)

元のブランチから新しくブランチを作り、差分を反映(マージ)したい場合にプルリクエストを作成できます。
プルリクエストでは、変更されたコードに対してレビュー(ディスカッション)が行えます。

レビューする人のことを「レビュアー(reviewer)」
レビューしてもらう人のことを「レビューイ(reviewee)」と呼びます。

レビュアーはプルリクエストに対して3種類のアクションが行えます。

- Approve(承認する)
- Request changes(否認する)
- Comment(承認も否認もしない。質問やディスカッションのコメント)

Approveされたらプルリクエストをマージできます。

- https://docs.github.com/ja/github/collaborating-with-issues-and-pull-requests/about-pull-requests

#### イシュー(Issue)

GitHubでは新機能やタスク、バグ等の管理にIssueを使って課題管理できます。
ラベルを用いて、カテゴライズできたり、担当者をアサインできたりとGitHubだけでも優秀な課題機能があります。

`#1` などIssueやPullRequestの番号やコミットのハッシュ値を入力して簡単に紐付けできます。
また、プロジェクトボードというカンバン機能もあります。

- https://docs.github.com/ja/github/managing-your-work-on-github/creating-an-issue
- https://docs.github.com/ja/github/managing-your-work-on-github/adding-issues-and-pull-requests-to-a-project-board

#### Issue, PullRequestテンプレート

Issue, Pull Requestのテンプレート機能があります。

- `.github/ISSUE_TEMPLATE.md` - Issueを作成するときのテンプレート
- `.github/PULL_REQUEST_TEMPLATE.md` - PullRequestを作成するときのテンプレート

と配置するだけです。

- [GitHubのIssue・Pull Requestのテンプレート機能を使おう](https://qiita.com/nyamogera/items/3fe6985b45fbd5377184)
- [オレオレ GitHub Issue テンプレートを晒す](https://blog.hotolab.net/entry/github_template)

#### ブランチ保護(Protected Branches)

GitHubは直接コミット禁止によるブランチの保護機能が提供されています。
Pull Requestを介して、レビューや自動テストによるチェックが通過しないとマージできないといった制約を付けてブランチを保護できます。

- https://docs.github.com/ja/github/administering-a-repository/about-protected-branches

#### GitHub Actions(ワークフロー)

GitHub ActionsとはGitHubが提供するCI/CD(継続的インテグレーション/継続的デリバリー)サービスです。

- `.github/workflows/*.yml` ワークフローはYAMLで定義します。

私のリポジトリではこんな感じで使ってるので雰囲気だけ知ってもらえればと思います。

- https://github.com/ucan-lab/docker-laravel/tree/main/.github/workflows
  - https://github.com/ucan-lab/docker-laravel/actions
- https://github.com/ucan-lab/laravel-dacapo/tree/main/.github/workflows
  - https://github.com/ucan-lab/laravel-dacapo/actions

GitHub Actionsについては公開リポジトリであれば無料で利用できます。
非公開リポジトリは無料枠＋従量課金となります。

無料プランでも2000分/月利用できるので小規模な開発であれば問題ないでしょう。
プロジェクトによってCI/CDする内容が大きく変わるので深くは説明しません...(できません)

- [CI/CDとは何か？](https://qiita.com/choco_p/items/1bd1b106daee1fbd4449)
- [GitHub Actions について学ぶ](https://docs.github.com/ja/actions/learn-github-actions)
- [GitHub Actions の無料枠を使いきった場合](https://qiita.com/technote-space/items/7b2694786f577c823fc1)

#### fork(フォーク)

forkとは、他の人のリポジトリを自分のリポジトリへコピーすることです。
リポジトリをフォークすることにより、オリジナルのリポジトリに影響を与えることなく自由に変更できます。
また、変更した内容をオリジナルのリポジトリへプルリクエスト(提案)して貢献できます。

- [リポジトリをフォークする](https://docs.github.com/ja/github/getting-started-with-github/fork-a-repo)

#### Wiki(ウィキ)

WikiはWikiです。
プロジェクトに関するドキュメントなどをまとめるところです。

## GitHubリポジトリの作り方

本題です。

### 新規リポジトリの作成

https://github.com/new

![](https://i.imgur.com/jnnx6Vt.png)

`Repository template`: テンプレートリポジトリを選択できます。
`Owner`: リポジトリ所有者を選択できます。
`Repository name`: リポジトリの名称です。優れたリポジトリ名は短く覚えやすいものです。良い名前を付けましょう。GitHubがランダムなリポジトリ名を考えてくれます(笑)
`Description`: リポジトリの概要です(任意)
`Public/Private`: リポジトリの公開/非公開設定です。この設定をミスると[こうなります](https://news.yahoo.co.jp/byline/mikamiyoh/20210129-00220038)
`Initialize this repository with`: 予めGitHubがテンプレファイルを用意してくれます。(任意)

ちなみにリポジトリの名前はあとからでも変更できます。

### Gitのセットアップ

![](https://i.imgur.com/GEUwlz0.png)

リポジトリの新規作成ページでREADMEやLICENCEの選択などを行った場合は不要です。

![](https://i.imgur.com/FR57zPu.png)

こんな感じにGitHubにファイルがpushされていればセットアップ完了です。

### 設定ファイル

- `.gitignore`
  - https://www.toptal.com/developers/gitignore
- `.editorconfig`
  - https://editorconfig.org
- `README.md`
  - プロジェクト、ツールの使い方、インストール方法などをまとめておく
  - [わかりやすいREADME.mdを書く](https://deeeet.com/writing/2014/07/31/readme)
- `SECURITY.md`
  - [セキュリティポリシーについて](https://docs.github.com/ja/github/managing-security-vulnerabilities/adding-a-security-policy-to-your-repository)

### コラボレータの追加

コラボレータ(Collaborator)とはリポジトリのコアな開発者です。
リポジトリに対して、pushやmergeといった権限が与えられます。

非公開リポジトリの場合はコラボレータに追加されないとリポジトリの参照も行えません。

また、公開リポジトリではあればコントリビューター(Contributor)として外部から貢献できます。
直接pushやmergeはできないので、リポジトリをforkしてPull Requestを送るといった手順を踏む必要があります。

Settings > Manage access > Invite a collaborator

![](https://i.imgur.com/6RdHjHk.png)

![](https://i.imgur.com/kPLP9Ym.png)

招待メールが送られるので、相手が招待リンクを承認したらコラボレータへ追加されます。

- [コラボレーターを個人リポジトリに招待する](https://docs.github.com/ja/github/setting-up-and-managing-your-github-user-account/inviting-collaborators-to-a-personal-repository)
- [GitHub 上のアクセス権限](https://docs.github.com/ja/github/getting-started-with-github/access-permissions-on-github)
- [GitHubのコントリビューターとコラボレーターについて](https://qiita.com/toriumi01/items/0f6eae3679e3c57189c4)

## リポジトリオプション設定

### Settings > Options > Settings

![](https://i.imgur.com/YRPJq96.png)

リポジトリ名の変更が行えます。
テンプレートリポジトリの設定ができます。
SNS等でリポジトリのリンクを共有した際の画像を設定できます。
(未設定の場合はリポジトリオーナーのアイコン画像になります)

- [GitHubのTemplate Repository機能のすゝめ](https://qiita.com/ryo2132/items/08f0561804c798012146)

### Settings > Options > Features

GitHubの機能の有効化/無効化が行えます。
IssueやWikiなど外部のツールを使う場合は無効化しておくと良いでしょう。

- Wikis
- Restrict editing to collaborators only 
- Issues
- Sponsorships
- Projects
- Preserve this repository
- Discussions

### Settings > Options > Merge button

プルリクエストをマージする場合、マージコミット、スカッシュ、リベースの任意の組み合わせでマージできます。

![](https://i.imgur.com/4TBh4Lu.png)

いずれか一つのボタンのみを有効化させておくと混乱しないので良いです。
(プロジェクト内で相談して決めてください)

- `Allow merge commits` (デフォルト)
  - マージコミットが作成されます。 
- `Allow squash merging`
  - そのプルリクエストのコミットは１つのコミットに`squash`されます。 
- `Allow rebase merging`
  - トピックブランチのすべてのコミットが、マージコミットなしに個別にベースブランチに追加されます。

個人的には `Allow squash merging` が好きです。

- [GitHub上のマージ方法について](https://docs.github.com/ja/github/administering-a-repository/about-merge-methods-on-github)

![](https://i.imgur.com/FV0UtIp.png)

自動マージを許可する設定です。
必要なレビューとステータスチェックに合格するとプルリクエストを自動的にマージする設定です。
有効化しておくと良いです。

![](https://i.imgur.com/AlUJznV.png)

プルリクエストがマージされた後、リモートリポジトリのブランチが自動的に削除されます。
マージ済みのブランチを残しておく必要はないので有効化しておきましょう。
(削除したブランチもあとから復元できます)

### Settings > Branches > Branch protection rules

ブランチの保護ルールの設定をします。
保護ルールをどのくらい強めに設定するかはプロジェクト内で相談して決めてください。

![](https://i.imgur.com/cUA28oj.png)

![](https://i.imgur.com/lgvx0vh.png)

Branch name parttern: ブランチ名を指定します。(パターンマッチも利用可能)

- https://docs.github.com/en/github/administering-a-repository/managing-a-branch-protection-rule

![](https://i.imgur.com/jWtLWob.png)

`Require pull request reviews before merging`: マージする前にプルリクエストのレビューを要求します。
必要な数の承認レビューがないとマージできなくなります。
`Dismiss stale pull request approvals when new commits are pushed`: 新しいコミットが追加されるとレビュー承認は却下されます。
`Require review from Code Owners`: オーナーの承認が必ず必要になります。

これ全部チェックすると相当マージするハードルが高くなります。
開発速度にも影響出るので、最低レビュー1個必要と設定すればとりあえず良いでしょう。
必要に応じてレベルをあげてください。

![](https://i.imgur.com/LBOyzn1.png)

#### Require status checks to pass before merging

`Require status checks to pass before merging`: マージする前にステータスチェックに合格する必要があります。
CIが通ってないのにマージされるとブランチを保護する意味がなくなるので、**必ず有効化しましょう。**

#### Require branches to be up to date before merging

`Require branches to be up to date before merging`: マージする前にブランチを最新にする必要があります。
この設定を行うことで最新のコードでテストされていることが保証されます。**必ず有効化しましょう。**

開発速度の速いリポジトリだと他のPRがマージされる度にマージが必要になるので、ケースバイケースかもです。

![](https://i.imgur.com/D7zo9Sr.png)

`Require signed commits`: 署名付きコミットが必要

署名済みコミットを必須にする設定
署名がないとマージすることができなくなります。(いるかな？)

- [コミットに署名する](https://docs.github.com/ja/github/authenticating-to-github/signing-commits)

`Require linear history`: 線形履歴が必要

マージボタンの設定で `Allow merge commits` 以外の`Allow squash merging`や`Allow rebase merging`を採用する場合は有効化しましょう。

`Include administrators`: 管理者を含める

管理者もこのブランチ保護の制限の対象に含めるか
チェックを入れると管理者も同様にマージできなくなります。
通常は有効化して、緊急時のみ無効化する感じがいいかも？

![](https://i.imgur.com/DSQ9waW.png)

`Allow force pushes`: 強制プッシュを許可する。(絶対に有効化しないでください)
`Allow deletions`: ブランチ削除を許可する。(絶対に有効化しないでください)

管理者を含むすべての人に適用されるルールです。
これを設定してしまうとブランチを保護する意味がなくなるので**必ず無効化しましょう。**

## Settings > Secrets > Actions secrets

![](https://i.imgur.com/sGuLbhr.png)

シークレットキーの設定です。
アクセスキーやシークレットキー、APIキー等、コミットに含めたくないものを登録します。
GitHub Actions等でデプロイする際にシークレットで登録したキーを参照する時に使います。

## さいごに

GitHubのリポジトリを作成する際の最低限の内容をまとめました。
より詳しく知りたい方は公式ドキュメントを参照してください。

- https://docs.github.com/ja