ハッカソンにおけるチーム開発のGit Hub運用

# はじめに

１週間〜１ヶ月規模のハッカソンにおけるGithubの運用を仲間内で共有するために書いています。Githubの環境が整えられる人材がいて、メンバーに共有する想定であるため、詳しい解説は省いています。



# GitHubとは

Wikipediaには　

> GitHubは、ソフトウェア開発のプラットフォームであり、ソースコードをホスティングする。コードのバージョン管理システムにはGitを使用する。

とあります。簡単に説明すると、チームみんなで書いたコードを一つの場所で管理してくれるサービスです。

## Gitとの違い

メンバーそれぞれの環境にコードのバージョン管理システムである`Git`をインストールし、それをインターネット上で管理するのが`GitHub`です。

では使い方を目的ごとに説明していきます。

※Gitのインストールや、GitHubのアカウント作成については説明を省略します。
以下の記事を参考に導入してください。

https://qiita.com/T-H9703EnAc/items/4fbe6593d42f9a844b1c

https://qiita.com/suke_masa/items/4bed855628f7414293f8

# チームで開発する(Organizations)
OrganizationsとはGitHub上で作れるチームのことです。
以下のような画面で構成されます。

![スクリーンショット 2023-09-16 10.50.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2969880/89f661f8-8b78-003e-fdb3-b87c80017aaf.png)


## タスク管理
Projectsは、Todoリストを管理できます。
![スクリーンショット 2023-09-17 17.43.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2969880/56e75e08-ae53-a51d-4cd9-d16e2c3e15d4.png)

今回はBoardを使用していきます。
![スクリーンショット 2023-09-17 17.46.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2969880/af040e67-a2d4-0961-45c5-d4ec25bc9f1f.png)

### タスクを作る

Projectsを選択すると、`Todo`・`InProgress`・`Done`の順に並んでいます。
Todoがタスクを追加していく場所です。「たぶん必要かな？」くらいの軽い気持ちで追加して良いと思います。以下のように`Add item`でタスクを追加します。

![スクリーンショット 2023-09-19 13.59.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2969880/fbb2b60d-4098-1121-219c-1eb613326bba.png)

追加されたタスクは`Draft`という下書きです。Draftの右にあるメニューから`Convert to issue`を選択すると、下書きから実装するタスク(`issue`)へと変化します。
![スクリーンショット 2023-09-19 14.00.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2969880/b4938ebf-8e4e-b748-b4da-d0806b0449c8.png)

### タスクを始める 
`Todo`にあるissueをドラッグ＆ドロップで`In Progress`に移動します。In Progressは進行中という状態です。
![スクリーンショット 2023-09-19 14.02.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2969880/dc8e36c3-e3c9-232c-8499-77052a852c9d.png)
誰が進行しているのか設定する必要があります。
タスク名をクリックし、右側の項目の`Add Assignees...`から自分のアカウントを選択します。
![スクリーンショット 2023-09-19 14.03.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2969880/fda0335f-4a1b-b1ab-3e8a-698f247b64d7.png)
閉じると画面のような状態になります。これで誰がどのタスクをしているのか管理することができます。
![スクリーンショット 2023-09-19 14.03.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2969880/ed0ce0f6-67a1-8a75-eacf-37ca7167d4a6.png)
次にここで作ったタスクを元にブランチを切ることで開発を進めていきます。

# 分担して作業する(branch)
branchとはWikipediaによると

> ブランチ(branch)とは、バージョン管理システムの管理下にあるオブジェクト（ソースコードファイル、ディレクトリツリーなど）を複製し、それぞれ同時並行して変更が行えるようにしたものである。

まさに`枝`のイメージで、分岐したブランチは他のブランチの影響を受けないため、同じリポジトリ中で複数の変更を同時に進めていくことができます。

※ブランチを作ることをブランチを切る、ブランチを合体させることをmergeと呼びます。

## 今回の構成
```

 main ー ー develop ー ー ー feature/#1
            　　　　　 |
                　    ー ー feature/#2
            　　　　　 |
                　    ー ー feature/#3

```

### main
本番用のブランチです。ユーザーが触る環境であるため、エラーやバグがある状態にしてはいけません。動作確認を終えたらdevelopブランチをmergeします。


### develop
開発用のブランチです。開発メンバーがそれぞれfeature/#[issue番号]ブランチをmergeしていきます。


### feature/#[issue番号]
機能ごとに切るブランチです。該当するissueについている番号を入れて名前を一意にします。最終的にはdevelopにmergeします。
※この場合`feature/#1`
![Group 36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2969880/9b08ba17-3311-545b-1257-5752b3085ac5.png)


## 操作


### メンバーのコードを自分の環境に反映する
新しくブランチを切って作業する前に、自分の環境を最新にしなくてはいけません。
この作業を怠ってしまうとGitHub上に同じファイルの変更が衝突してしまう`conflict`を起こしやすくなります。今回の構成ではdevelopブランチにメンバーの変更がマージされていくため、developで以下のコマンドを叩きます。

```bash
git pull
```

### ブランチを切って移動する
現在いるブランチから新しいブランチを切り、そのブランチに移動します。

```bash
git checkout -b "[ブランチ名]"
```

### ブランチを移動する
ブランチを移動します。
```bash
git checkout "[ブランチ名]"
```

### ブランチを合体させる
今いるブランチに別のブランチを指定して合体させます。

```bash
git merge "[ブランチ名]"
```

最低限この三つがわかっていれば大丈夫です。他にもたくさん操作がありますので、困ったらその都度調べましょう。


# 書いたコードをGitHubに反映する
自分が書いたコードをGitHubに反映します。載せているのは最小限のコマンドなので詳しくは調べてみてください。

## 反映するファイルを選ぶ
この操作をするとステージ状態になり、commitできるようになります。
この操作はVSCodeのGUIのほうが早いかもしれません。
### 全てのファイル
```bash
git add -A
```
### 指定したファイル
```bash
git add [ファイルパス]
```
## 変更内容を記録する（自分の環境のみ）
先ほどステージされたファイルを記録します。
変更の内容は提唱されているフォーマットがあるのでそれに従うべきですが、
ハッカソンにおいては事細かく書かなくても十分な場合が多いです。

```bash
git commit -m "[変更の内容]"
```

https://zenn.dev/itosho/articles/git-commit-message-2023

## 変更内容をGitHubに送る
以下のコマンドを実行するとGitHubでPull Requestを作成できます。
```bash
git push origin [ブランチ名]
```

### Pull Request

Pull Requestとは
> Gitのホスティングサービスが提供する機能の一つで、作業者が他者にソースコードの差分のレビューと開発用・公開用ブランチへのマージを依頼する機能のことです。

つまり、自分の変更をGithubに反映させたいというリクエストです。許可制にすることでエラーが出てないかチェックしたり、ソースコードの衝突を検知できます。


pushすると以下のような表示が出ます。ここからPull Requestを作れます。
![Group 37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2969880/463ccfe4-1816-4aa8-2194-5cdb977796c0.png)


## 変更内容を合体する
※この作業は通常、上司が内容をレビューし、上司が行います。ハッカソンにおいては人のコードを確認する時間がない場合が多いため、自分で行っています。

Pull Requestを確認してmergeします。以下のように特にエラーが見当たらず、no conflictsであれば`Merge pull request`を押します。もし、エラーやconflictsとあれば環境を整えてくれた人に相談しましょう。

![スクリーンショット 2023-09-20 18.55.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2969880/7b9227b5-b534-d057-130d-f56308261788.png)

ここで次のように`close: #[issue番号]`と打ってmergeすればissueを閉じることができます。

![スクリーンショット 2023-09-20 18.56.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2969880/c6bda617-978a-2c5d-f36e-84fbc2af44a2.png)

このように終わったissueは閉じられて`Done`に入ります。
![スクリーンショット 2023-09-20 18.57.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2969880/cc1c67bc-3df8-8a48-70d5-7ad0423edefb.png)

# 追記
branchをissue番号で切るやり方をしていますが、番号ではこのブランチが何をしているかわからないという状況になりがちなので、`feature/login(機能名)`のように切るといいと思います！

# まとめ
この流れを後は繰り返していきます。上から順番にもう一度整理すると、

Projectsでissueを立てる
↓
developブランチでpullした後、issueに合ったbranchを切る
↓
作業が完了したらgit add, git commit, git push の順で変更をGitHubに送る
↓
GitHubでプルリクを作り、問題がなければ自分でmergeする
↓
初めに戻る


以上です、お疲れ様でした。
わかりにくいところや間違った認識がございましたらコメントいただけると嬉しいです。